学习前提

能阅读提交日志并建立提交。

使用Git 2.35+与Bash兼容终端(Windows可用Git Bash)。每章完整代码都会创建独立临时目录;仅在练习仓库运行。git config仅修改该仓库,示例身份不是你的真实提交身份。临时目录不会自动删除,可在完成后自行清理。

本课完成后你能做什么

在独立分支开发,区分快进和合并提交。

先理解机制

分支是指向提交的可移动引用,不是复制一整个项目目录。switch改变当前分支与相应工作内容;切换前先检查未提交修改,Git可能因为潜在覆盖而拒绝切换。

当目标分支是来源分支的祖先时,可以快进到来源提交。--ff-only明确要求这种情况;若双方各有新提交,则需要合并或经约定重放历史。

本例强制创建合并提交,以便在图中保留功能分支完成的边界。团队可根据历史阅读需求选择快进或合并提交,不能把某一种形式当作所有项目的唯一标准。

可运行示例

lab=$(mktemp -d)
cd "$lab"
git init -b main .
git config user.name "Honeysuck Learner"
git config user.email 'learner'@'example.invalid'
git config commit.gpgsign false
git config core.autocrlf false
printf 'Start learning\n' > notes.txt
git add notes.txt
git commit -m "Start learning notes"
git switch -c feature/checklist
printf 'Review before commit\n' > checklist.txt
git add checklist.txt
git commit -m "Add review checklist"
git switch main
git merge --no-ff feature/checklist -m "Merge review checklist"
git log --graph --oneline --all
git rev-list --parents -n 1 HEAD
git branch --merged

推演与验证

最终main包含checklist.txt,最新提交有两个父提交。图中能看到功能提交与合并节点;两个分支都在已合并列表中。

常见错误与边界

合并发生在当前分支:先确认git branch --show-current。不要把切到feature再merge main误认为已经把功能交付到main。

动手练习

在新的临时示例中将合并命令改为git merge --ff-only feature/checklist,比较提交数量。

参考解法与理由

原示例共3次提交;快进版本只有2次,main直接移动到功能提交,没有额外合并节点,但最终文件相同。

进一步阅读