【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 无法自动合并,需手动解决:
- 识别冲突文件:
bash
git merge feature/new-login # 合并时提示冲突- 输出示例:
plaintext
CONFLICT (content): Merge conflict in src/login.js
- 输出示例:
- 查看冲突标记:
javascript
运行
<<<<<<< HEAD // 当前分支(如 main)的代码 function login() {alert("旧登录逻辑"); } ======= // 要合并分支(如 feature/new-login)的代码 function login() {fetch("/api/login"); } >>>>>>> feature/new-login - 手动修改代码:
- 删除冲突标记(
<<<<<<<、=======、>>>>>>>); - 保留需要的代码(例如合并两种逻辑)。
- 删除冲突标记(
- 标记为已解决:
bash
git add src/login.js # 将解决后的文件加入暂存区 - 完成合并:
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 | 查看未合并到当前分支的本地分支(避免误删有用分支) |







