来源:https://www.liuhaolin.com/git/115.html
git中合并冲突是在不同的分支中同一个文件的内容不同导致的,如果进行合并就会冲突。文件可能是新增的文件,比如在两个分支中都新建了同一个文件,但是他们的内容不同,或是在两个分支中都更新了同一个文件,但是更新的内容不同。最终导致同一文件在不同的分支中内容不同。如果需要进行合并,就必须人工解决冲突,或者撤销合并。
"创建一个有冲突的合并"
git解决冲突示例
初始化一个仓库,然后创建一个 dev
分支,分支里添加一个文件 master-dev.txt
,然后提交到 dev
分支。切换到 master
分支,同样的操作也是提交了同一个文件master-dev.txt
,同样提交到master 分支中,但是这两个文件的内容是不同的。如果想把 dev
的分支提交到master
中,代码就会有冲突。
创建“冲突”
echo "测试-代码提交冲突" > README git init . git add . git commit -m 'init' # 创建一个 dev 分支,并切换到dev分支 git checkout -b dev # 当前的分支 dev git branch #* dev # master echo "dev" > master-dev.txt # 在dev分支中提交 git commit -m '[dev branch ]add file master-dev.txt' git checkout master echo "master" > master-dev.txt git add . git commit -m '[master branch ]add file master-dev.txt'
把dev分支的代码合并的master中,看看什么情况。
# 把 dev分支的代码合并到当前的分支,也就是 master 分支中 git merge dev #自动的合并文件 master-dev.txt Auto-merging master-dev.txt # 提示了冲突, 合并冲突在 master-dev.txt CONFLICT (add/add): Merge conflict in master-dev.txt # 自动合并失败, 修改一个冲突,然后提交结果 Automatic merge failed; fix conflicts and then commit the result.
出现了冲突,这是时候 master-dev.txt
的内容会被修改,会把两个分支中的文件内容都 汇集 master-dev.txt 文件中。
cat master-dev.txt <<<<<<< HEAD master ======= dev >>>>>>> dev
需要注意的地方是,产生了冲突,并且当前的文件 master-dev.txt
被修改了。这个时候,只能是先解决冲突。再进行下一步操作。比如想看一下 dev分支
中的文件 master-dev.txt
的内容是否也被修改了,这个时候看不了,因为要先解决冲突。事实上,出现冲突的时候,是不能切换分支的。这样有个好处就是,就是防止有问题的代码污染了其他的分支。
git checkout dev master-dev.txt: needs merge # 必须先解决当前的索引区的冲突 error: you need to resolve your current index first
解决代码合并中的冲突
git使用 7个左键箭头 + 当前分支,7个等号和7个右箭头 + 当前分支 来表示冲突的代码,一共是三行。解决冲突就是修改代码后,并删除这三行。比如本次的修改就是删除这三行。
cat master-dev.txt master dev
修改后看下当前的状态
git status On branch master # 存在没有合并成功的部分 You have unmerged paths. # 修正错误,并提提交 (fix conflicts and run "git commit") # 使用 git merge --about 终止合并 (use "git merge --abort" to abort the merge) # 没有合并的文件 Unmerged paths: (use "git add <file>..." to mark resolution) both added: master-dev.txt
修改了冲突的文件,冲突并没有得到解决 ,因为文件并没有提交。没有继续合并,或者撤销合并。所以依然不能切换分支的。
git checkout dev master-dev.txt: needs merge error: you need to resolve your current index first
这里进行提交一下看看结果。
git add master-dev.txt git commit -m 'both commit' # 当前的分支是 master cat master-dev.txt master dev # 切换到dev分支 cat master-dev.txt dev # 可以看到dev分支的内容换是原来的内容,并没有改变。
这样就合并了有冲突的分支, 现在有一个问题,就是 dev分支的内容和 master分支的内容是不同的。如何同步能?
# 在dev分支中,更新master中的内容 git rebase master #First, rewinding head to replay your work on top of it... #Fast-forwarded dev to master. # 这个表明,现在 dev分支的内容和master分支的内容是一致的。 cat master-dev.txt master dev