跳到内容

第 0 卷 / 第 3 章 / 第 3 课

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  <- HEAD

HEAD 通常指向当前分支,experiment 指向新提交 B,main 仍指向 A。切换分支会让工作区匹配目标提交;如果未提交改动会被覆盖,Git 通常拒绝切换。此时应提交、stash、移动或明确丢弃改动,而不是强行绕过检查。

快进合并 ​

bash
git diff main...experiment
git switch main
git merge --ff-only experiment
git branch -d experiment

main 从 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 中三点语法含义不同,查命令手册时不要混用解释。

→ 下一步:解决合并冲突

Built with VitePress | Software Systems Atlas