几乎所有版本控制系统(VCS)都支持分支,但 Git 的分支功能堪称“杀手锏”✨!它轻量、快速,能让你随心所欲地创建分支、切换分支、合并分支,甚至一天合并好几次都不费劲~
对于初学者来说,掌握 Git 分支就像学会了“分身术”🧙♂️:同一时间能推进多个功能开发,还不用担心代码互相干扰。接下来咱们从基础到进阶,一步步解锁 Git 分支的全部技能!
要理解 Git 分支,得先回忆一个核心知识点:Git 存储数据的方式不是“变更记录”,而是“快照”📸!每次提交,Git 都会保存当前项目的完整快照,并创建一个“提交对象”。
1. 提交对象的构成
每个提交对象包含 3 样东西:
- 📁 指向项目快照的指针(通过 SHA- 1 哈希值标识)
- 👤 作者信息、提交信息(就是你写的 commit -m 内容)
- 👪 父提交指针(初始提交没有父指针,普通提交 1 个父指针,合并提交多个父指针)
2. 分支 = 可移动的指针
Git 的分支本质上就是一个“轻量级指针”,指向某个提交对象。默认创建的分支叫master(现在很多项目改用 main,但原理一样),它会随着你的每次提交自动“向前移动”。
$ git init
$ git branch # 此时会显示 * master(* 表示当前所在分支)
3. HEAD 指针:告诉你“当前在哪个分支”
Git 里有个特殊指针叫HEAD,它永远指向你“当前正在工作的分支”🧭。比如你在 master 分支时,HEAD 就指向 master;切换到其他分支,HEAD 就跟着切换。
这是 Git 分支最常用的三个操作,记住命令格式 + 实际场景,就能轻松上手~
1. 创建分支:git branch [分支名]
创建一个新分支,指针指向当前所在的提交。
$ git branch testing
$ git branch # 查看分支,会显示 master 和 testing(* 还在 master)
* master
testing
2. 切换分支:git checkout [分支名]
切换到已存在的分支,同时 HEAD 指针会跟着移动到该分支。
$ git checkout testing
Switched to branch ‘testing’
$ git branch # 现在 * 到 testing 了
master
* testing
3. 创建 + 切换一步到位:git checkout -b [分支名]
这是最常用的快捷命令,相当于先 git branch 再 git checkout。
$ git checkout -b iss53
Switched to a new branch ‘iss53’
# 等价于:
# git branch iss53
# git checkout iss53
4. 删除分支:git branch -d [分支名]
分支合并到主分支后,就可以删除了(避免分支过多混乱)。
$ git checkout master # 先回到 master
$ git branch -d iss53
Deleted branch iss53 (3a0874c).
分支开发完成后(比如功能开发好、bug 修复完),需要把代码合并回主分支(如 master),这就是 git merge 的作用。
1. 快进合并(fast-forward):简单直接的合并
如果被合并的分支是主分支的“直接后代”(没有分叉),Git 会直接把主分支的指针“移动”到被合并分支的最新提交,这就是快进合并。
$ git checkout master # 回到主分支
$ git merge hotfix # 合并 hotfix 分支
Updating f42c576..3a0874c
Fast-forward # 快进合并成功
index.html | 2 ++
1 file changed, 2 insertions(+)
2. 三方合并:处理分叉的情况
如果主分支和开发分支都有新提交(出现分叉),Git 会做“三方合并”——找到两个分支的共同祖先提交,再把两个分支的修改合并成一个新的“合并提交”。
$ git checkout master
$ git merge iss53
Merge made by the ‘recursive’ strategy. # 三方合并成功
index.html | 1 +
1 file changed, 1 insertion(+)
3. 合并冲突:最常见的“小麻烦”
如果两个分支修改了 同一个文件的同一部分,Git 无法自动判断保留哪个,就会出现“合并冲突”。这时候需要手动解决!
$ git merge iss53
Auto-merging index.html
CONFLICT (content): Merge conflict in index.html
Automatic merge failed; fix conflicts and then commit the result.
冲突文件会被标记冲突内容,打开文件会看到:
=======
>>>>>>> iss53:index.html # 被合并分支(iss53)的内容
解决冲突的步骤(初学者必看):
- 打开冲突文件,找到 <<<<<<<、=======、>>>>>>> 标记的部分
- 手动修改内容(保留需要的代码,删除冲突标记)
- 用 git add [冲突文件名] 标记为已解决
- 用 git commit 提交(无需写 -m,Git 会自动生成合并提交信息)
$ git add index.html
$ git commit # 直接回车,编辑提交信息后保存退出
项目大了之后,分支会越来越多(比如 feature/xxx、bugfix/xxx、hotfix/xxx),学会管理分支能避免混乱~
1. 查看分支详情:git branch -v
显示每个分支的最后一次提交信息(哈希值 + 提交说明)。
iss53 93b412c fix javascript issue
* master 7a98805 Merge branch ‘iss53’
testing 782fd34 add author list
2. 查看已合并 / 未合并分支
- git branch –merged:查看已合并到当前分支的分支(可安全删除)
- git branch –no-merged:查看未合并的分支(删除需谨慎)
$ git branch –merged
iss53
* master
# 查看未合并的分支
$ git branch –no-merged
testing
3. 分支命名规范(实践必备)
没有强制规范,但团队协作时建议统一,比如:
- 功能分支:feature/ 需求编号 - 功能名(如 feature/53-footer)
- bug 修复分支:bugfix/ bug 编号 - 描述(如 bugfix/1328-stackoverflow)
- 热修复分支:hotfix/ 问题描述(如 hotfix/email-error)
- 测试分支:test/ 功能名(如 test/payment)
单人开发用本地分支就够了,但团队协作需要“远程仓库”(如 GitHub、GitLab),远程分支就是连接本地和远程的桥梁~
1. 远程跟踪分支:[远程名]/[分支名]
克隆远程仓库后,Git 会自动创建“远程跟踪分支”,比如 origin/master(origin 是远程仓库的默认名)。它是本地的“书签”,记录远程分支的最新状态,不能手动修改,会自动同步。
2. 拉取远程更新:git fetch [远程名]
获取远程仓库的最新数据,但不合并到本地分支(安全,先看更新再决定)。
$ git fetch origin
# 此时 origin/master 会更新到远程最新状态
# 查看远程跟踪分支
$ git branch -r # -r 表示 remote(远程)
origin/master
origin/iss53
3. 推送本地分支到远程:git push [远程名] [本地分支名]
把本地分支的提交推送到远程仓库,让团队成员看到。
$ git push origin serverfix
# 远程会创建同名的 serverfix 分支
4. 拉取并合并:git pull [远程名] [分支名]
相当于 git fetch + git merge(快捷命令),适合快速同步远程更新。
$ git pull origin master
5. 跟踪分支:让本地分支和远程分支关联
关联后,git pull/push 不用写远程名和分支名,Git 会自动识别。
# 方法 2:手动关联本地分支和远程分支
$ git checkout -b serverfix origin/serverfix
# 或简写(如果本地分支名和远程一致)
$ git checkout serverfix
# 方法 3:已有本地分支,手动设置关联
$ git branch -u origin/serverfix
除了 merge,Git 还有一种合并分支的方式——变基(rebase)。它的核心作用是“改写提交历史”,让历史记录更线性、更干净~
1. 变基的原理:“重播”提交
变基就是把一个分支的所有提交,按顺序“重播”到另一个分支的最新提交上,相当于重新创建一系列新的提交(哈希值会变)。
2. 基本变基命令:git rebase [目标分支]
把当前分支的提交,变基到目标分支上。
$ git checkout iss53
$ git rebase master
# 完成后,iss53 的提交都在 master 最新提交的后面
# 再切换到 master,做快进合并
$ git checkout master
$ git merge iss53
3. 变基 vs 合并:各有优劣
- 合并(merge):保留原始提交历史,能看到分支分叉的过程,但历史可能杂乱。
- 变基(rebase):历史记录线性干净,容易追溯,但改写了提交历史(哈希值变了)。
❌ 已推送远程的分支:绝对不能 rebase!因为别人可能已经基于你的旧提交开发,改写历史会导致团队代码冲突、提交重复,场面会非常混乱~
4. 变基的禁忌:不要变基公共分支
这是 Git 使用的“铁律”!记住:不要变基已经推送到远程仓库、被其他人使用的分支。
5. 变基冲突的解决
变基过程中也可能出现冲突,解决方式和合并冲突类似:
$ git rebase master
Auto-merging index.html
CONFLICT (content): Merge conflict in index.html
# 1. 打开文件解决冲突
# 2. 标记为已解决
$ git add index.html
# 3. 继续变基(重播下一个提交)
$ git rebase –continue
#(如果想放弃变基,运行 git rebase –abort)
结合前面的知识点,我们模拟一个真实项目的分支使用流程,初学者可以直接套用~
场景:电商网站开发,需求是“添加支付功能”+“修复登录 bug”
- 1. 准备工作:克隆远程仓库,创建开发分支
# 克隆远程仓库(假设远程仓库地址是 git.ourcompany.com/ecommerce.git)
$ git clone git.ourcompany.com/ecommerce.git
$ cd ecommerce
# 创建并切换到 feature/payment 分支(开发支付功能)
$ git checkout -b feature/payment - 2. 开发支付功能,多次提交
# 编写代码后提交
$ git add .
$ git commit -m ‘ 添加支付宝支付接口 ’
$ git add .
$ git commit -m ‘ 完善支付回调逻辑 ’ - 3. 接到紧急 bug:登录时密码错误不提示,需要热修复
# 切换回 master 分支(确保代码干净,无未提交修改)
$ git checkout master
# 创建热修复分支
$ git checkout -b hotfix/login-alert
# 修复 bug 后提交
$ git add .
$ git commit -m ‘ 修复登录密码错误无提示 bug’
# 合并回 master 分支
$ git checkout master
$ git merge hotfix/login-alert
# 推送 master 到远程(发布修复)
$ git push origin master
# 删除热修复分支
$ git branch -d hotfix/login-alert - 4. 把 master 的热修复同步到支付功能分支
# 切换回 feature/payment 分支
$ git checkout feature/payment
# 变基到 master(同步热修复代码,保持历史干净)
$ git rebase master
#(如果有冲突,解决后 git add + git rebase –continue) - 5. 支付功能开发完成,推送到远程,等待审核
$ git push origin feature/payment
# 此时可以在 GitLab/GitHub 上创建合并请求(MR/PR),让团队审核代码 - 6. 审核通过后,合并到 master 并发布
#(管理员操作)合并 feature/payment 到 master
$ git checkout master
$ git merge feature/payment
$ git push origin master
# 删除本地和远程的功能分支
$ git branch -d feature/payment
$ git push origin –delete feature/payment
Git 分支是开发的“必备技能”,掌握这些核心点就能应对 99% 的场景:
- 💡 分支本质:轻量级指针,指向提交快照
- 💡 基础操作:git branch/git checkout/git checkout -b/git branch -d
- 💡 合并分支:git merge(快进 / 三方合并)+ 解决冲突
- 💡 团队协作:远程分支 +git fetch/git push/git pull+ 跟踪分支
- 💡 进阶技能:git rebase(本地分支用,公共分支禁用)
要不要我帮你整理一份Git 分支常用命令速查表?包含命令格式、场景说明和注意事项,打印出来就能随时查阅,帮你快速巩固这些知识点~