学习前提

理解分支和普通merge;会查看status。

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

本课完成后你能做什么

复现同一行冲突,检查、编辑并完成合并。

先理解机制

两个分支从共同祖先修改同一处内容时,Git可能无法自动选择结果。冲突不是数据已经全部丢失,而是合并过程暂停,等待你决定最终内容。

查看git status和git diff --name-only --diff-filter=U确认冲突文件。标记之间的文本分别来自合并两侧;不能只删除标记而不判断业务意图。本例把不同建议合成一条完整路线。

编辑正确结果后git add表示该文件已解决,commit完成合并。如果决定放弃,可在提交前使用git merge --abort;合并前保持干净工作区能减少恢复复杂度。

可运行示例

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/route
printf 'Start with HTML\n' > notes.txt
git add notes.txt
git commit -m "Suggest HTML first"
git switch main
printf 'Start with Git\n' > notes.txt
git add notes.txt
git commit -m "Suggest Git first"
if git merge feature/route; then
  printf 'No conflict occurred; inspect your earlier steps.\n'
else
  git status --short
  git diff --name-only --diff-filter=U
fi
printf 'Start with Git, then build HTML\n' > notes.txt
git add notes.txt
git commit -m "Combine both learning routes"
cat notes.txt
git status --short

推演与验证

合并阶段应出现UU notes.txt;解决后的文件为Start with Git, then build HTML。最终状态干净,合并提交有两个父提交。

常见错误与边界

示例故意产生一次非零退出的merge,并用if处理。真实项目中合并失败也可能有其他原因,应先查看报错和未解决文件,不能无条件覆盖文件。

动手练习

重新运行独立示例,在出现冲突后先执行git merge --abort,检查main的内容。

参考解法与理由

abort后notes.txt应回到Start with Git,feature/route分支仍保留Start with HTML。未完成的合并不会生成合并提交。

进一步阅读