如果你在两个分支上都改了同一个文件的同一部分内容,Git就没办法干净的合并这两个分支。举例如果我们工程里只有一个"a.txt,里面的内容是
目前只有两次普通的提交,和主分支master
$ git log --oneline --decorate --graph --all * e3bf2f8 (HEAD -> master) 提交2 * 6308f04 提交1现在,我们创建分支B并进入
$ git branch b $ git checkout b Switched to branch 'b'我们修改a文件的内容为
然后提交 $ git log --oneline --decorate --graph --all * 7d27397 (HEAD -> b) 分支b的第一次提交 * e3bf2f8 (master) 提交2 * 6308f04 提交1
然后我们回到master分支
$ git checkout master Switched to branch 'master'修改a的内容为
提交
$ git commit -a -m "master分支修改了a" [master f5ab6c5] master分支修改了a 1 file changed, 1 insertion(+), 1 deletion(-)查看现在的分支情况
$ git log --oneline --decorate --graph --all * f5ab6c5 (HEAD -> master) master分支修改了a | * 7d27397 (b) 分支b的第一次提交 |/ * e3bf2f8 提交2 * 6308f04 提交1我们尝试合并
$ git merge b Auto-merging a.txt CONFLICT (content): Merge conflict in a.txt Automatic merge failed; fix conflicts and then commit the result.Git并没有自动创建新的合并提交。它会暂停整个合并过程,等待你来解决冲突。在发生合并冲突后,要查看哪些文件没有被合并,可以执行git status
$ git status On branch 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: a.txt no changes added to commit (use "git add" and/or "git commit -a")可以看到,a.txt被both modified(两个分支都修改)了。打开a文件,可以看到
其中HEAD版本的内容显示在上半部分(======以上),b分支的内容则在下半部分。其中HEAD指向的是master分支,因为在执行merge前我们已经切换到了master分支。
我们现在要将a的这五行内容换成
再次提交,Git便会开始合并 $ git commit [master 8b57566] Merge branch 'b'
再次查看分支
$ git log --oneline --decorate --graph --all * 8b57566 (HEAD -> master) Merge branch 'b' |\ | * 7d27397 (b) 分支b的第一次提交 * | f5ab6c5 master分支修改了a |/ * e3bf2f8 提交2 * 6308f04 提交1至此,冲突解决