1. 代码冲突(Merge Conflict)
场景
- 两个分支修改了 同一个文件的同一行,导致 Git 无法自动合并。
- 一个分支删除了文件,而另一个分支修改了同一文件。
解决方案
- 执行
git status
看到冲突文件列表。 - 手动编辑冲突文件,解决
<<<<<<<
、=======
、>>>>>>>
标记部分。 - 运行
git add <冲突文件>
标记为已解决。 - 执行
git commit
记录合并。
2. 误合并到错误的分支
场景
- 在 错误的分支 上执行
git merge
,导致代码错误。 - 例如,在
master
上误合并feature-branch
,而应该合并到develop
。
解决方案
- 如果合并 未提交,可以使用:
git merge --abort
- 如果合并 已提交但未推送,可以回滚:
git reset --hard HEAD~1 # 回滚到合并前的状态
- 如果合并 已推送,可以使用
git revert
生成新的回滚提交:git revert -m 1 <合并提交的commit ID>
3. 远程分支变更导致的 Fast-Forward 失败
场景
- 在本地
git pull
时出现:fatal: Not possible to fast-forward, aborting.
- 由于远程分支发生变化,本地分支 落后于远程。
解决方案
- 先同步远程分支:
git fetch origin
- 再合并远程分支:
git merge origin/main
- 或者使用
git pull --rebase
使本地变更基于最新远程提交:git pull --rebase origin main
4. 误删除了本地或远程分支
场景
- 误执行
git branch -D <branch>
删除了本地分支。 - 误执行
git push origin --delete <branch>
删除了远程分支。
解决方案
恢复本地分支:
git reflog # 找到分支最后的 commit ID
git checkout -b <branch> <commit ID>
恢复远程分支(如果本地有该分支):
git push origin <branch>
5. Submodule(子模块)未正确更新
场景
- 合并后
git submodule
的版本错误,导致无法正确 checkout 子模块。
解决方案
- 运行以下命令更新子模块:
git submodule update --init --recursive
6. 文件权限变化导致的伪冲突
场景
- 在 Linux 和 Windows 之间切换时,文件权限位变更,Git 误认为文件内容发生了更改。
- 合并时会看到无意义的冲突。
解决方案
- 忽略文件权限变更:
git config core.fileMode false
7. 遗漏 .gitignore
规则,导致意外合并
场景
.gitignore
变更后未及时更新,导致本应忽略的文件被合并。
解决方案
- 重新应用
.gitignore
:git rm -r --cached . git add . git commit -m "Update .gitignore"
8. Binary 文件(如图片、视频)冲突
场景
- Git 不能自动合并二进制文件,如
.png
、.xlsx
。 - 发生冲突时,只能手动选择一个版本。
解决方案
- 如果希望保留自己的版本:
git checkout --ours path/to/file git add path/to/file
- 如果希望使用对方的版本:
git checkout --theirs path/to/file git add path/to/file
- 建议:对于二进制文件,使用 Git LFS(Large File Storage)管理。
总结
问题 | 产生原因 | 解决方案 |
---|---|---|
代码冲突 | 两个分支修改了相同的文件 | 手动解决冲突并 git add |
误合并到错误分支 | 在错误的分支执行 git merge | git merge --abort 或 git reset --hard HEAD~1 |
远程分支变化导致 merge 失败 | 远程分支发生更新 | git fetch && git merge 或 git pull --rebase |
误删除分支 | 误用 git branch -D 或 git push origin --delete | git reflog 还原 |
Submodule 未正确更新 | 子模块未初始化 | git submodule update --init --recursive |
文件权限变更冲突 | 跨系统合并时权限变化 | git config core.fileMode false |
.gitignore 规则遗漏 | 代码库 .gitignore 变更未生效 | git rm -r --cached . 重新提交 |
二进制文件冲突 | Git 不能自动合并二进制文件 | 选择 --ours 或 --theirs 版本 |