当前位置: 首页 > news >正文

【Git】Git04:分支管理

第四章 Git 分支管理

O、分支的核心概念与作用

分支是 Git 中实现并行开发的核心功能。简单来说,分支就像从主路(默认 main 分支)岔出的独立车道,你可以在分支上独立修改代码、提交版本,完全不影响主路的稳定。例如:

  • 开发新功能:在 feature/new-login 分支上开发登录功能,不影响 main 分支的线上代码;
  • 修复紧急 bug:从 main 分支创建 hotfix/payment-bug 分支,快速修复后合并回 main
  • 实验性尝试:在 experiment/ai-search 分支上探索新算法,失败后直接删除分支,不影响主分支。

1. 和基础操作的关系:

上一章讲的版本回退、文件修改、撤销等操作,是 单分支下的基础操作;分支管理是在这个基础上,实现 “多版本并行开发” 的扩展 —— 所有基础操作(git add/commit/log/reset 等)都能在任意分支上独立使用,分支管理只是多了 “创建、切换、合并分支” 的逻辑,并未脱离之前的核心技能。

2. Git分支的工作原理:

下面这张图展示了分支的创建、切换和合并的完整流程:

3. Git分支命名规范

根据分支的不同作用,使用不同的前缀:

前缀用途示例
feature/新功能开发feature/user-authentication
fix/bug修复fix/login-error
hotfix/紧急生产修复hotfix/security-patch
release/版本发布准备release/v1.2.0
docs/文档更新docs/api-reference
refactor/代码重构refactor/payment-module

✍️提示:Git 分支管理命令速查表,见附录


一、查看分支相关命令

核心作用:了解本地 / 远程分支的状态、历史关联,避免操作混乱。

1. git branch:查看本地分支

  • 作用:列出所有本地分支,标记当前所在分支(* 符号)。
  • 语法git branch [选项]
  • 实操示例

    bash

    # 基础用法:查看本地分支
    git branch
    # 输出:
    # * main         (当前分支)
    #   feature/login
    #   bugfix/payment# 查看分支+最后一次提交信息(推荐)
    git branch -v
    # 输出:
    # * main         a1b2c3d 更新README
    #   feature/login e4f5g6h 完成登录页面布局
    
  • 注意事项:仅显示本地分支,不包含远程仓库的分支。

2. git branch -a:查看所有分支(本地 + 远程)

  • 作用:同时列出本地分支和远程分支(远程分支以 remotes/origin/ 开头)。
  • 语法git branch -a
  • 实操示例

    bash

    git branch -a
    # 输出:
    # * main
    #   feature/login
    #   remotes/origin/main
    #   remotes/origin/feature/pay
    
  • 注意事项:远程分支是本地缓存的 “镜像”,需先执行 git fetch 才能获取最新的远程分支列表。

3. git branch -r:仅查看远程分支

  • 作用:单独列出所有远程仓库的分支,简化输出。
  • 语法git branch -r
  • 实操示例

    bash

    git branch -r
    # 输出:
    #   origin/main
    #   origin/feature/login
    

二、创建与切换分支命令

核心作用:开辟新的开发分支,或在不同分支间切换工作环境。

1. git branch <分支名>:仅创建分支(不切换)

  • 作用:基于当前分支的最新提交,创建新分支(仍停留在当前分支)。
  • 语法git branch <新分支名>
  • 实操示例

    bash

    # 基于当前 main 分支,创建 feature/register 分支
    git branch feature/register
    # 验证:查看本地分支,新增 feature/register
    git branch
    
  • 注意事项:创建后需手动切换到新分支,才能在上面开发。
  • 物理位置:创建的分支,在.git\refs\heads下,结构如下图
    • 你的项目目录/
      ├── .git/
      │   ├── refs/heads/          # 本地分支指针文件
      │   │   ├── main             # main分支指针
      │   │   └── feature/register # feature/register分支指针
      │   ├── HEAD                 # 指向当前所在的分支
      │   └── objects/             # 存储所有文件内容和提交历史
  • 实际执行界面参考:

2. git switch -c <分支名>:创建并切换分支(推荐,Git 2.23+)

  • 作用:一步完成 “创建分支 + 切换到该分支”,效率更高(Git 2.23 版本后新增,替代旧命令 git checkout -b)。
  • 语法git switch -c <新分支名> 或 git switch --create <新分支名>
  • 实操示例

    bash

    # 创建 feature/register 分支并立即切换
    git switch -c feature/register2
    # 输出:Switched to a new branch 'feature/register2'
    
  • 实际执行界面参考:

3. git checkout -b <分支名>:兼容旧版本的 “创建 + 切换”

  • 作用:与 git switch -c 功能完全一致,适配 Git 2.23 之前的版本。
  • 语法git checkout -b <新分支名>
  • 实操示例

    bash

    git checkout -b feature/register3
    
  • 实际执行界面参考:

4. git switch <分支名>:切换到已存在的分支

  • 作用:从当前分支切换到指定的本地分支(分支必须已创建)。
  • 语法git switch <目标分支名>
  • 实操示例

    bash

    # 从 feature/register 切换回 main 分支
    git switch main
    
  • 实际执行界面参考:
  • ⚠️注意事项
    • 切换分支前,需确保当前分支的工作区 / 暂存区没有未提交的修改(否则可能导致修改 “携带” 到目标分支,或切换失败);
    • 若需保留未提交修改,可先执行 git stash(暂存修改),切换后再 git stash pop(恢复修改)。

5. git switch -:快速切换到上一个分支

  • 作用:无需输入分支名,快速返回之前所在的分支(类似终端的 cd -)。
  • 语法git switch -
  • 实操示例

    bash

    # 从 main 切换到 feature/register
    git switch feature/register
    # 快速切回 main 分支
    git switch -
    
  • 实际执行界面参考:

6. git switch -f <分支名>:强制切换分支

  • 作用:忽略当前分支的未提交修改,强制切换到目标分支(会丢弃未提交的修改)。
  • 语法git switch -f <目标分支名> 或 git switch --force <目标分支名>
  • 实操示例

    bash

    git switch -f main
    
  • 实际执行界面参考:
    • ​​​​​​​
  • ⚠️注意事项:慎用!会永久丢失当前分支未提交的工作区和暂存区修改。

7. 分支中的增加的文件

分支中,新建文件但还没有 git add 时:

你的项目/
├── .git/              # Git仓库数据
├── new-file.txt       ← 新文件在这里(物理存在)
└── existing-file.py

状态: Untracked(未跟踪)

git status
# 输出:Untracked files: new-file.txt

执行 git add 和 git commit 后,文件内容存储在:

.git/
├── objects/
│   ├── 12/           # 文件内容被压缩并哈希存储
│   │   └── 34abcd... # 实际的文件数据在这里
│   ├── 56/
│   │   └── 78ef01...
│   └── ...
├── refs/heads/feature/register  # 分支指针
└── ...

实际示例

假设你在 feature/register 分支添加了文件:

bash

# 在 feature/register 分支
echo "用户注册功能" > register.py
git add register.py
git commit -m "添加注册模块"

此时:

  • 工作目录: register.py 物理存在

  • Git 对象库: register.py 的内容存储在 .git/objects/ 的某个哈希路径下

  • 分支记录: .git/refs/heads/feature/register 指向包含这个文件的提交

✍️备注:git分支新增文件存储过程详解,见附录


三、合并与变基命令(分支整合核心)

核心作用:将一个分支的修改整合到另一个分支,可以是分支与分支,分支与主分支(如功能开发完成后合并回主分支)。

1. git merge <待合并分支名>:合并分支(最常用)

  • 作用:将 “待合并分支” 的所有提交,整合到当前所在分支。
  • 语法git merge <待合并分支名>
  • 实操示例

    bash

    # 1. 先切换到目标分支(如 main)
    git switch main
    # 2. 合并 feature/register 分支的修改
    git merge feature/register
    
  • 实际执行界面参考:
    • 有变更合并,合并会计入历史:
  • git两种合并模式
    • 快进合并(Fast-forward):目标分支无新提交时,直接移动分支指针,无新提交记录;
    • 三方合并(Three-way Merge):目标分支有新提交时,生成一个 “合并提交”,保留分支历史。
  • 注意事项:合并时若出现冲突,需手动解决后再完成提交。

2. git merge --no-ff <待合并分支名>:强制生成合并提交

  • 作用:禁用快进合并,无论是否满足快进条件,都会生成一个新的 “合并提交”,清晰记录分支合并历史。
  • 语法git merge --no-ff <待合并分支名>
  • 实操示例

    bash

    git merge --no-ff feature/register -m "合并注册功能分支"
    
  • 适用场景:团队协作时,需要明确记录分支合并轨迹(如开源项目、多人开发的项目)。

3. git rebase <目标分支名>:变基(整理线性历史)

  • 作用:将当前分支的所有提交,“移植” 到目标分支的最新提交之后,形成干净的线性历史(无合并提交)。
  • 语法git rebase <目标分支名>
  • 实操示例

    bash

    # 1. 切换到要变基的分支(如 feature/register)
    git switch feature/register
    # 2. 将当前分支变基到 main 分支最新提交之后
    git rebase main
    
  • 核心流程说明
    • Rebase 前:

      A---B---C  main\D---E---F  feature (当前分支)

      执行 git rebase main 后:

      A---B---C  main\D'---E'---F'  feature (当前分支)

      注意: 提交 D、E、F 变成了 D'、E'、F',因为它们是新的提交(具有不同的提交哈希)。

      详细执行过程

    • 找到共同祖先:Git 找到当前分支和目标分支的共同祖先提交(提交 B)

    • 保存当前分支的提交:保存 D、E、F 这三个提交的更改

    • 快速前进:将当前分支指向目标分支的最新提交(C)

    • 重新应用提交:按顺序将保存的更改(D、E、F)应用到 C 之后,创建新的提交 D'、E'、F'

  • 注意事项
    • 绝对不要对已推送到远程仓库的 “公共分支”(如 main、dev)执行变基,会导致团队成员的提交历史混乱;
    • 变基过程中出现冲突:解决冲突后执行 git rebase --continue 继续变基,或 git rebase --abort 放弃变基。

4. git rebase --continue:解决冲突后继续变基

  • 作用:变基时遇到冲突,手动解决后,继续完成剩余提交的 “重新应用”。
  • 语法git rebase --continue
  • 实操示例

    bash

    # 1. 解决冲突文件
    # 2. 标记冲突已解决
    git add <冲突文件>
    # 3. 继续变基
    git rebase --continue
    

5. git rebase --abort:放弃变基

  • 作用:变基过程中(如冲突无法解决),终止变基操作,恢复到变基前的分支状态。
  • 语法git rebase --abort

四、冲突解决辅助命令

核心作用:合并 / 变基时出现冲突,辅助识别、解决冲突。

1. git status:查看冲突文件

  • 作用:合并 / 变基冲突时,快速识别哪些文件存在冲突。
  • 语法git status
  • 实操示例

    bash

    git merge feature/register
    # 冲突后执行
    git status
    # 输出:CONFLICT (content): Merge conflict in src/register.js
    

2. git add <冲突文件>:标记冲突已解决

  • 作用:手动解决文件冲突后,将文件加入暂存区,告知 Git “冲突已处理”。
  • 语法git add <冲突文件路径>
  • 实操示例

    bash

    # 解决 src/register.js 冲突后
    git add src/register.js
    

3. git merge --abort:放弃合并(冲突时)

  • 作用:合并冲突后,不想继续合并,终止合并操作,恢复到合并前的状态。
  • 语法git merge --abort
  • 注意事项:Git 1.7.4 之前版本用 git reset --hard HEAD 替代。

五、删除分支命令

核心作用:分支完成使命后(如功能合并、废弃),删除分支清理环境。

1. git branch -d <分支名>:安全删除本地分支

  • 作用:删除已合并到当前分支(或主分支)的本地分支(避免误删未合并的分支)。
  • 语法git branch -d <要删除的分支名>
  • 实操示例

    bash

    # 先切换到 main 分支(确保 feature/register 已合并)
    git switch main
    # 安全删除 feature/register 分支
    git branch -d feature/register
    
  • 注意事项:若分支未合并,执行后会提示 “分支未完全合并,删除失败”,避免误删。
  • 实际执行界面参考:

2. git branch -D <分支名>:强制删除本地分支

  • 作用:忽略分支是否合并,强制删除本地分支(会丢失未合并的提交)。
  • 语法git branch -D <要删除的分支名>
  • 实操示例

    bash

    # 强制删除未合并的 feature/abandoned 分支
    git branch -D feature/abandoned
    
  • 注意事项:慎用!仅用于确认废弃的分支(如实验性分支、开发失败的分支)。

3. git push origin --delete <远程分支名>:删除远程分支

  • 作用:删除远程仓库(如 GitHub、GitLab)上的分支(本地分支需单独删除)。
  • 语法git push <远程仓库名> --delete <远程分支名> 或 git push <远程仓库名> :<远程分支名>
  • 实操示例

    bash

    # 删除远程 origin 仓库的 feature/old 分支
    git push origin --delete feature/old
    # 简写形式(等价)
    git push origin :feature/old
    
  • 注意事项:删除远程分支后,团队成员需执行 git fetch --prune 清理本地缓存的已删除远程分支。

六、 解决分支冲突

当两个分支修改了同一文件的相同位置时,Git 无法自动合并,需手动解决:

  1. 识别冲突文件

    bash

    git merge feature/new-login  # 合并时提示冲突
    
    • 输出示例:

      plaintext

      CONFLICT (content): Merge conflict in src/login.js
      
  2. 查看冲突标记

    javascript

    运行

    <<<<<<< HEAD       // 当前分支(如 main)的代码
    function login() {alert("旧登录逻辑");
    }
    =======             // 要合并分支(如 feature/new-login)的代码
    function login() {fetch("/api/login");
    }
    >>>>>>> feature/new-login
    
  3. 手动修改代码
    • 删除冲突标记(<<<<<<<=======>>>>>>>);
    • 保留需要的代码(例如合并两种逻辑)。
  4. 标记为已解决

    bash

    git add src/login.js  # 将解决后的文件加入暂存区
    
  5. 完成合并

    bash

    git commit -m "Merge feature/new-login and resolve conflicts"
    

七、分支管理可视化工具

  • 命令行辅助

    bash

    git log --graph --oneline  # 图形化查看分支合并历史
    
    • 实际执行界面参考:
  • 图形化工具
    • VS Code:内置分支管理面板,支持创建、切换、合并等操作;
    • GitKraken:可视化界面直观展示分支关系,支持拖拽合并;
    • Sourcetree:适合新手,提供图形化冲突解决界面。

☢️附录

git分支新增文件存储过程详解

步骤1:创建新文件

bash

echo "Hello World" > new-file.txt

物理位置: 项目根目录/new-file.txt

步骤2:添加到暂存区 (git add)

bash

git add new-file.txt

Git 操作:

  • 将文件内容压缩并生成 SHA-1 哈希(如 1234abcd...

  • 在 .git/objects/12/34abcd... 存储文件内容

  • 在 .git/index(暂存区)记录文件信息

步骤3:提交到分支 (git commit)

bash

git commit -m "Add new file"

Git 操作:

  • 创建提交对象(包含作者、时间、树对象指针等)

  • 更新 .git/refs/heads/feature/register 指向新提交

  • 新文件现在正式成为该分支的一部分

重要特性

1. 所有分支共享同一对象库

bash

# 同一个文件在不同分支中只存储一次
.git/objects/12/34abcd...  # 所有分支共享这个文件对象

2. 分支切换时的文件变化

bash

# 从 main 切换到 feature/register
git checkout feature/register

Git 操作:

  • 读取 .git/refs/heads/feature/register 指向的提交

  • 根据提交中的树对象,从 .git/objects/ 还原所有文件到工作目录

  • 工作目录中会出现该分支特有的文件

3. 验证文件存储

bash

# 查看文件在对象库中的存储
git cat-file -p 1234abcd...# 查看分支对应的文件树
git ls-tree feature/register

Git 分支管理命令速查表

核心场景常用命令备注说明
一、查看分支信息git branch列出本地分支,* 标记当前分支
git branch -v查看本地分支 + 最后一次提交信息
git branch -a查看所有分支(本地 + 远程,远程分支前缀 remotes/origin/
git branch -r仅查看远程分支
git log --graph --oneline --all图形化展示所有分支的合并 / 分叉历史,直观清晰
二、创建与切换分支git branch <分支名>仅创建分支,不切换(基于当前分支最新提交)
git switch -c <分支名>创建并切换分支(Git 2.23+ 推荐,替代旧命令 git checkout -b
git checkout -b <分支名>兼容旧版本的 “创建 + 切换”,功能同 git switch -c
git switch <分支名>切换到已存在的本地分支
git switch -快速切换到上一个分支(类似 cd -
git switch -f <分支名>强制切换,丢弃当前分支未提交的修改(慎用)
三、合并与变基(整合分支)git merge <待合并分支名>将目标分支合并到当前分支(默认支持快进 / 三方合并)
git merge --no-ff <待合并分支名> -m "合并说明"强制生成合并提交,保留分支合并历史(团队协作推荐)
git rebase <目标分支名>将当前分支提交 “移植” 到目标分支之后,形成线性历史(仅用于私有分支)
git rebase --continue变基冲突解决后,继续完成变基
git rebase --abort放弃变基,恢复到变基前状态
四、冲突解决git status合并 / 变基冲突时,查看冲突文件列表
git add <冲突文件>手动解决冲突后,标记文件为 “冲突已解决”
git merge --abort合并冲突后放弃合并,恢复到合并前状态(Git 1.7.4+)
五、删除分支git branch -d <分支名>安全删除本地分支(仅删除已合并的分支,避免误删)
git branch -D <分支名>强制删除本地分支(忽略是否合并,慎用)
git push origin --delete <远程分支名>删除远程仓库的分支(简写:git push origin :<远程分支名>
git fetch --prune清理本地缓存的已删除远程分支(删除远程分支后执行)
六、实用辅助命令git fetch origin同步远程分支信息(不合并代码),更新本地远程分支缓存
git branch --merged查看已合并到当前分支的本地分支(方便清理无用分支)
git branch --no-merged查看未合并到当前分支的本地分支(避免误删有用分支)
http://www.dtcms.com/a/601254.html

相关文章:

  • R语言用什么编译器 | 如何选择最适合你的R语言开发环境
  • cuda12 cudnn9 tensorflow 显卡加速
  • 网站建设目标的文字嘉兴企业网站排名
  • 手机网站开发语言选择怎么能在网上卖货
  • 编程算法学习
  • 在Beego框架中创建Services层
  • PPT插入的音乐怎么让它播放到某一页就停?
  • 打包,压缩解压,上传下载
  • 【动态规划】专题完结,题单汇总
  • 微信公众好第三方网站怎么做wordpress订阅关闭
  • 网站logo上传建筑室内设计软件
  • Linux环境下Nginx核心总结与密码验证实践
  • python实战:装饰模式详解
  • 一个基于TCP/IP接收数据并通过API推送数据的小工具
  • 经典网站建设案例wordpress讨论区插件
  • 具身记忆大展拳脚
  • Java语言编译器 | 深入了解Java编译过程与优化技巧
  • 实时开发平台(Streampark)--Flink SQL功能演示
  • 最近做网站开发有前途没wordpress主题特色功能
  • 深度学习_神经网络初始化参数方法
  • 程序设计语言编译原理 | 深入解析编译原理与语言设计的关系
  • MATLAB基于遗传算法的债券投资组合优化
  • 网站建设背景和目标建设部网站资质查询
  • Flask 和 Django 的详细对比
  • 给网站做网络安全的报价全国大学生平面设计大赛
  • 35搜索插入位置
  • [AI tradingOS] trader_manager.go | API集中控制_handleStartTrader
  • LeetCode算法学习之前K个高频元素
  • 主流 LLM 推理/部署框架指标对比
  • 大模型上下文窗口详解与 RNN/Transformer 架构比较