如果你在两个分支上都改了同一个文件的同一部分内容,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
至此,冲突解决