3.3 分支与合并
前置知识:暂存区、差异和安全撤销
预计时间:12 分钟
练习环境:继续使用上一页已清理的临时仓库
完成标志:能画出分支指针,并区分快进和三方合并
撤销实验结束后,新任务要求“先试验,不要影响主线”。Git 不会为此复制整个项目;分支只是一个会随提交移动的引用。
创建主题分支
bash
git switch -c experiment
printf '%s\n' "print('from experiment')" >> main.py
git add main.py
git commit -m 'Add experimental output'
git branch --show-current
git log --graph --oneline --decorate --all此时可以把提交图想成:
text
main A
\
experiment B <- HEADHEAD 通常指向当前分支,experiment 指向新提交 B,main 仍指向 A。切换分支会让工作区匹配目标提交;如果未提交改动会被覆盖,Git 通常拒绝切换。此时应提交、stash、移动或明确丢弃改动,而不是强行绕过检查。
快进合并
bash
git diff main...experiment
git switch main
git merge --ff-only experiment
git branch -d experimentmain 从 A 直接移动到 B,这叫 fast-forward。--ff-only 在提交图已经分叉时拒绝操作,适合只接受线性快进的场景。
删除 experiment 这个名字不会删除 B,因为 main 仍然能到达它。未合并分支用 git branch -d 会被拒绝;-D 会强制删除引用,使用前应确认提交仍可找回或确实不需要。
三方合并
若 main 和主题分支从共同祖先后各有提交,普通 git merge topic 会比较共同祖先与两边结果。没有内容冲突时,Git 通常创建合并提交:
text
B---C topic
/ \
A---D-------M main是否保留合并提交、squash,或要求线性历史是团队策略。实际合并前先用 git status --short 确认工作区,再用 git log --graph --oneline --decorate --all 查看提交图,并以 git diff main...主题分支名 审查准备合入的净变化。
A...B 在 diff 中通常比较共同祖先到 B 的变化;在 log 中三点语法含义不同,查命令手册时不要混用解释。