版本控制工具排行榜:新手开发核心技能
摘要
Git分支本质是可移动指针,支持创建、切换、删除等操作。合并分为快进合并与三方合并,
第四章 分支 —— Git 的杀手级特性
在Git的所有亮点中,分支模型无疑是最令人惊叹的设计。初学者或许觉得它有些抽象,但本质其实很简单:分支就是一个可移动的指针,指向某个提交对象。Git 默认的分支名是 master 或 main,但这只是业界惯例,你完全可以按项目需要自定义。
用 Git 记录项目历史时,流程大致是这样的:
master 分支
v
C0 --- C1 --- C2 --- C3 (HEAD->master)
创建新分支时,实际发生了什么?只是生成了一个新指针,指向上一次提交。就这么直接:
C0 --- C1 --- C2 --- C3 (HEAD->master, develop)
切换到哪个分支,工作目录就自动恢复成该分支的最新快照。因此切换分支时能立即看到内容更新,这正是 Git 设计的精妙之处。
基本分支操作
日常开发中,以下命令几乎每天都会用到:
# 列出所有本地分支(当前分支带 *)
git branch
# 列出远程分支
git branch -r
# 列出所有分支(本地 + 远程)
git branch -a
# 创建新分支(但不会切换)
git branch feature-login
# 切换到一个分支
git checkout feature-login
# 或使用新命令
git switch feature-login
# 创建并切换到新分支(一步到位)
git checkout -b feature-login
git switch -c feature-login
# 删除分支(必须确保不在该分支上)
git branch -d feature-login # 已合并的分支
git branch -D feature-login # 强制删除未合并的分支
# 重命名当前分支
git branch -m new-name
# 重命名任意分支
git branch -m old-name new-name
注意一个细节:git branch -d 只删除已合并的分支;若尝试删除未合并的分支,Git 会友好地提醒你。真的想删?用 -D 强制删除即可。
合并(Merge)—— 整合分支
合并是分支管理的核心操作,但执行起来非常直接:
# 首先切换到目标分支(例如 master)
git checkout master
# 将另一个分支(例如 feature)合并到当前分支
git merge feature
# 合并时创建合并提交(非快进模式)
git merge --no-ff feature
合并有两种常见场景:
快进合并(Fast-forward):当目标分支直接是源分支的后继时,指针直接向前移动即可:
Before:
master → C1 → C2
feature → C3(基于 C2)
After (fast-forward):
master → C1 → C2 → C3 (master 指向 C3)
三方合并(3-way merge):两个分支出现分叉时,Git 会创建一个新的合并提交:
Before:
C1 → C2 → C4 (master)
→ C3 (feature)
After:
C1 → C2 → C4 → C5 (合并提交)
→ C3 ---
关键区别:快进合并不会留下合并提交,历史保持一条直线;三方合并则会生成一个合并提交,明确标记两个分支的交汇点。
合并冲突解决
提到合并,就绕不开冲突。当两个分支修改了同一文件的同一行,或一个分支删除了另一个分支修改的文件时,Git 无法自动合并。冲突发生时的提示如下:
$ git merge feature
Auto-merging hello.py
CONFLICT (content): Merge conflict in hello.py
Automatic merge failed; fix conflicts and then commit the result.
冲突标记的样式:
<<<<<<< HEAD
print("Hello from master")
=======
print("Hello from feature")
>>>>>>> feature
解决步骤非常简洁:
- 手动编辑冲突文件,删除标记,只保留最终的代码
- 执行
git add标记为已解决 - 执行
git commit完成合并提交
还有两个实用命令:
# 使用图形化工具解决冲突
git mergetool # 会打开配置的合并工具(如 vimdiff, kdiff3)
# 取消本次合并,回到合并前状态
git merge --abort
想模拟冲突场景?试试这个流程:
# 创建并切换到 feature 分支
git checkout -b feature
echo "Feature line" > test.txt
git add test.txt && git commit -m "feature: add test.txt"
# 切回 master,修改同一文件
git checkout master
echo "Master line" > test.txt
git add test.txt && git commit -m "master: add test.txt"
# 合并冲突
git merge feature
# 解决冲突后提交
变基(Rebase)—— 另一种整合方式
如果希望历史更干净,可以尝试变基。git rebase 会将一系列提交按顺序“复制”到另一个分支的顶端,使历史变成线性:
# 在 feature 分支上执行
git checkout feature
git rebase master
# 效果:将 feature 分支中从 master 分叉后的所有提交,应用到 master 的最新提交之后
分叉的情况:
C1 --- C2 (master)
C3 --- C4 (feature)
执行 git rebase master 后:
C1 --- C2 (master)
C3' --- C4' (feature) # C3' 和 C4' 是新的提交对象
然后切换到 master 执行快进合并:
git checkout master
git merge feature # 现在是快进合并

这里有一条黄金法则必须牢记:不要对已经推送到远程仓库的分支执行 rebase! 否则会导致他人基于旧分支的工作混乱,后果难以收拾。
交互式变基(Interactive Rebase)—— 修改历史
需要整理提交历史时,交互式变基是利器:
# 对最近 3 个提交进行交互式变基
git rebase -i HEAD~3
执行后会打开编辑器,列出提交列表,你可以对每个提交执行操作:
pick 7c6a5b8 Add login feature
pick 3a7c8f9 Fix typo in login
pick 2b9d4e1 Add logout feature
# Rebase 2b9d4e1..7c6a5b8 onto 2b9d4e1
#
# Commands:
# p, pick = use commit
# r, reword = use commit, but edit the commit message
# e, edit = use commit, but stop for amending
# s, squash = use commit, but meld into previous commit
# f, fixup = like "squash", but discard this commit's log message
# d, drop = remove commit
几个常用操作:
- squash:将当前提交合并到前一个提交
- reword:修改提交信息
- edit:修改提交内容(如添加遗漏文件)
- drop:删除提交
例如,想把最后两个提交合并为一个:
pick abc123 Add feature
squash def456 Fix typo
保存后,你就可以编辑合并后的提交信息了。这样整理后的历史看起来会非常清爽。
来源:互联网
本网站新闻资讯均来自公开渠道,力求准确但不保证绝对无误,内容观点仅代表作者本人,与本站无关。若涉及侵权,请联系我们处理。本站保留对声明的修改权,最终解释权归本站所有。