07- git合并冲突

231 阅读3分钟

1. 介绍

在使用 Git 进行版本控制时,合并冲突是常见的情况。冲突通常发生在以下操作中:

  • 分支合并(git merge)
  • 变基(git rebase)
  • 变更提取(git pull)

冲突的原因

合并冲突通常发生在以下情况下:

  • 同一文件的同一行被不同分支修改:如果两个分支对同一文件的同一行进行了不同的修改,Git 无法自动确定哪个修改是正确的。
  • 文件的删除与修改:一个分支删除了文件,而另一个分支修改了同一文件。
  • 重命名冲突:一个分支对文件进行了重命名,而另一个分支在旧名称上进行了修改

2. 解决冲突的基本步骤

  1. 查看冲突文件: 使用 git status 查看哪些文件存在冲突。

    git status
    
  2. 手动解决冲突: 打开冲突文件,查找冲突标记(例如,<<<<<<<, =======, >>>>>>>),并手动编辑解决冲突。

  3. 标记已解决的冲突: 使用 git add <file> 标记解决了冲突的文件。

    git add <file>
    
  4. 提交合并: 使用 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>

解释: 该文件在不同分支的不同部分都有修改,但这些修改导致了冲突。需要手动解决冲突。

git系列文章

01-git常用命令汇总

02-git config介绍

03-git工作区、暂存区、版本库介绍

04-git log命令介绍

05-git关联远程仓库

06-git分支管理策略

07-git合并冲突

07-git合并冲突场景

08-git配置多个ssh密钥