git 冲突解决

git 在多个分支同时向一个分支进行合并,且有共同修改的文件就会产生冲突。

产生冲突时需要手动合并冲突。

模拟冲突的产生

创建一个仓库

# 创建一个仓库模拟冲突的发生
mkdir conflict
cd conflict
git init
vim README.md

README.md内容如下

# git conflict

创建两个新的分支,并同时修改README文件

# 创建两个新的分支,并同时修改README文件
git checkout -b b1
echo "modify by b1" >> README.md
git add -A
git commit -m "modify by b1"

git checkout master
git checkout -b b2
echo "modify by b2" >> README.md
git add -A
git commit -m "modify by b2"

合并分支

git checkout master
# 此时可以正常合并,b1与master不冲突
git merge b1
# 此时发生冲突,因为此时master已经合并过b1
git merge b2

冲突提示如下

自动合并 README.md
冲突(内容):合并冲突于 README.md
自动合并失败,修正冲突然后提交修正的结果。

打开冲突文件可看到以下内容

# git conflict

<<<<<<< HEAD
modify by b1
=======
modify by b2
>>>>>>> b2

其中<<<<<<< HEAD=======之间的是当前HEAD的内容,也就是master分支的内容。

=======>>>>>>> b2之间的内容是待合入的分支的内容,即b2分支的内容。

冲突后可执行的操作

取消合并

取消合并可以回到合并之前的状态

git merge --abort

此时README.md的内容变回b1分支的内容

# git conflict

modify by b1

解决冲突

解决冲突只需要将文本中的<<<<<<< HEAD=======以及>>>>>>> b2标签删除即可,内容上可自行选择留下哪些内容。

例如可以留下b2的内容删除原本master中的内容

# git conflict

modify by b2

也可以都留下,甚至做额外修改

# git conflict

modify by b1
modify by b2
merge b1 and b2

修改之后重新创建一次提交即可完成合并。

此时使用git status可看到如下内容

位于分支 master
您有尚未合并的路径。
  (解决冲突并运行 "git commit")
  (使用 "git merge --abort" 终止合并)

未合并的路径:
  (使用 "git add <文件>..." 标记解决方案)
	双方修改:   README.md

修改之后继续进行合并

# 将刚才的修改加入缓冲区
git add README.md
git commit -m "merge b1 and b2"

本次提交后会有额外的信息,git log的第一行就标注了哪两次提交进行了合并

Merge: 35c0dba 22c9390
Author: cxcc <xiaolong.cxcc@qq.com>
Date:   Wed Apr 17 10:59:53 2024 +0800

    merge b1 and b2
0%