有两种可能冲突:
1、不同分支合并时,两个分支修改了同一个文件
2、同一个分支,两个不同的人修改了同一个文件
分支合并时冲突解决
假设我们有两个分支,master和feature1,我们分别修改了这两个分支的同一个文件,如readme.txt。
现在,master
分支和feature1
分支各自都分别有新的提交,变成了这样:
这种情况下,Git无法执行“快速合并”(快速合并只修改指针,如果master比feature1要新的话,master指针就不变,如果feature1从master分出来,然后feature1再做了修改,即feature1比master要新,则直接修改master的指针,让其指向feature1),因为master和feature1都有各自修改的内容,只能试图把各自的修改合并起来,如果各自修改的文件不同,则可以顺利合并成一个新的节点,然后master指向该新节点,feature1指向不变,如果修改了同一个文件,就会有冲突,我们试试看,把feature1分支合并到master分支:
$ git merge feature1
Auto-merging readme.txt
CONFLICT (content): Merge conflict in readme.txt
Automatic merge failed; fix conflicts and then commit the result.
果然冲突了!Git告诉我们,readme.txt
文件存在冲突,必须手动解决冲突后再提交。git status
也可以告诉我们冲突的文件.
$ git status
On branch master
Your branch is up to date with 'origin/master'.
You have unmerged paths.
(fix conflicts and run "git commit")
(use "git merge --abort" to abort the merge)
Unmerged paths:
(use "git add <file>..." to mark resolution)
both modified: README.md
Untracked files:
(use "git add <file>..." to include in what will be committed)
.classpath
.project
.settings/
no changes added to commit (use "git add" and/or "git commit -a")
我们打开readme.txt文件,可以看到
<<<<<<< HEAD
master修改的内容
=======
feature1修改的内容
>>>>>>> feature1
Git用<<<<<<<
,=======
,>>>>>>>
标记出不同分支的内容,我们把冲突解决后,再次把该文件提交到master分支:
$ git add README.md
$ git commit -m 解决分支合并冲突
$ git push origin master
现在,master
分支和feature1
分支变成了下图所示:
用带参数的git log
也可以看到分支的合并情况。
假如我们还想进一步把master分支合并到feature1分支,可以直接执行下面命令即可,不会再有冲突了,因为master的内容包含了feature1,并且比feature1的要新,执行合并之后,feature1只需把指针指向master即可:
git checkout feature1
git merge master
git push origin dev
同一个分支冲突解决
假如别人修改了dev分支上的readme.txt文件,自己也修改了该分支的readme.txt文件,在add、commit、push命令时提示需要先更新,执行git pull origin dev命令时,提示有冲突,此时本地打开readme.txt文件,看到标记出冲突的内容,和前面说的一样,本地手动把冲突的内容合并,然后再一次执行add、commit、push命令即可。