1. 介绍
在使用 Git 进行版本控制时,合并冲突是常见的情况。冲突通常发生在以下操作中:
- 分支合并(git merge)
- 变基(git rebase)
- 变更提取(git pull)
冲突的原因
合并冲突通常发生在以下情况下:
- 同一文件的同一行被不同分支修改:如果两个分支对同一文件的同一行进行了不同的修改,Git 无法自动确定哪个修改是正确的。
- 文件的删除与修改:一个分支删除了文件,而另一个分支修改了同一文件。
- 重命名冲突:一个分支对文件进行了重命名,而另一个分支在旧名称上进行了修改
2. 解决冲突的基本步骤
-
查看冲突文件: 使用
git status查看哪些文件存在冲突。git status -
手动解决冲突: 打开冲突文件,查找冲突标记(例如,
<<<<<<<,=======,>>>>>>>),并手动编辑解决冲突。 -
标记已解决的冲突: 使用
git add <file>标记解决了冲突的文件。git add <file> -
提交合并: 使用
git commit提交解决冲突后的合并。git commit -m "Resolved merge conflicts in <file>"
示例
假设你在 git pull 后遇到冲突,git status 的输出可能如下:
On branch main
You have unmerged paths.
(fix conflicts and run "git commit")
Unmerged paths:
(use "git add <file>..." to mark resolution)
both modified: README.md
deleted by them: src/main.py
modified by us: src/utils.py
no changes added to commit (use "git add" and/or "git commit -a")
在这个示例中:
README.md在两个分支中都被修改,需要手动解决内容冲突。src/main.py在一个分支中被删除,而在另一个分支中被修改,需要决定是否保留修改还是删除。src/utils.py在两个分支中都有修改,需要手动解决内容冲突。
通过解决这些冲突,并按照上述步骤进行操作,你就可以完成合并并继续进行其他 Git 操作。
3. 冲突类型
当你在 git pull 过程中遇到冲突后,使用 git status 可以查看冲突文件的具体提示信息。以下是各种类型的冲突在 git status 中的显示信息及其解释:
1. 内容冲突(Content Conflicts)
提示信息:
both modified: <file>
解释: 该文件在两个分支中都有修改,且这些修改发生了冲突,需要手动解决。
2. 添加/删除冲突(Add/Delete Conflicts)
提示信息:
deleted by them: <file>
modified by us: <file>
或
deleted by us: <file>
modified by them: <file>
解释: 一个分支删除了该文件,而另一个分支修改了该文件。需要手动决定是保留修改还是删除文件。
3. 重命名冲突(Rename Conflicts)
提示信息:
both added: <new_file>
或
both renamed: <old_file> -> <new_file>
解释: 两个分支对同一个文件进行了重命名,但重命名后的名称不同,需要手动解决重命名冲突。
4. 同时修改同一个文件但不同部分的冲突
提示信息:
both modified: <file>
解释: 该文件在不同分支的不同部分都有修改,但这些修改导致了冲突。需要手动解决冲突。