Git 冲突解决完全指南
概述
Git 冲突(Merge Conflict)发生在两个分支对同一文件的同一位置进行了不同的修改,Git 无法自动合并时。冲突是团队协作中不可避免的现象,掌握正确识别、分析和解决冲突的方法,是每个开发者的必备技能。
基础语法
冲突通常发生在以下场景:两个分支修改了同一文件的同一行;一个分支删除了某个文件,另一个分支修改了它;多个分支对同一文件的多个位置进行了不兼容的修改。
- <<<<<<< HEAD:当前分支的冲突起始标记。
- =======:分隔线,上方是当前分支的版本,下方是待合并分支的版本。
- >>>>>>> branch-name:待合并分支的冲突结束标记。
- git status:查看当前仓库状态,冲突文件会显示为 unmerged。
完整代码示例+注释
# === 触发冲突的场景 ===
git checkout -b feature/user-profile
echo "name: Alice" > config.txt
git add config.txt
git commit -m "Update config on feature branch"
git checkout main
echo "email: alice@example.com" > config.txt
git add config.txt
git commit -m "Update config on main branch"
git merge feature/user-profile
=== 查看冲突状态 ===
git status
cat config.txt
=== 手动解决冲突 ===
编辑 config.txt,保留需要的部分
删除冲突标记
git add config.txt
git commit -m "Resolve merge conflict in config.txt"
=== 使用 git mergetool 图形化解决冲突 ===
git mergetool
=== 使用 git checkout 保留某一方的全部修改 ===
git checkout --ours config.txt
git checkout --theirs config.txt
git add config.txt
git commit -m "Resolve conflict by accepting their version"
=== 放弃合并,恢复到合并前的状态 ===
git merge --abort
运行效果
执行 merge 操作后,如果出现冲突,Git 会在冲突文件中插入标记。开发者的任务是逐一处理每个冲突区域,决定保留哪一方的内容,然后删除所有冲突标记。使用 git mergetool 可以启动图形化合并工具,非常直观。
常见问题
Q1:解决冲突时如何判断应该保留哪一方的代码
需要根据业务逻辑判断。如果两个修改都是必要的(如一个改了这行,另一个改了另一行),则合并两者。
Q2:rebase 过程中出现冲突怎么办
解决冲突后执行 git add 暂存,然后 git rebase --continue 继续重放下一个提交。
Q3:冲突文件很多,如何高效处理
可以使用 git diff --name-only --diff-filter=U 列出所有冲突文件。
Q4:合并提交后才发现解决冲突时有错误怎么办
可以使用 git revert 撤销合并提交,或用 git reset --hard 回到合并前的状态重新合并。
延伸阅读
- Git 官方文档 - 高级合并:https://git-scm.com/book/zh/v2/Git-工具-高级合并