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