前言
上一篇我们大概讲解了一下分支,如何创建分支以及分支的检出,那么在我们工作的时候,每个人很大概率拥有自己的分支,当我们在自己的分支愉快地完成了开发工作的时候,我们提交到了自己的分支上,一切都相安无事,但是很不幸,当有时候我们进行分支合并的时候,可能会出现意料之外的情况,例如自己分支与主分支合并的时候产生了冲突。冲突虽然能通过预先的计划尽量减少,但是是不可避免的,在一些情况下,还是会出现恼人的冲突。那么对于出现的冲突,我们该如何解决呢?
冲突复现
初始化master分支
下面我们来复现一下冲突,首先新建一个版本库,然后增加一些文件,然后提交到本地仓库。
$ git init
$ vim hello.s
$ cat hello.s
This is hello.s create in master~~
这里我们已经简单建立了一个仓库,然后添加了一个hello.s文件,并且在里面写了一些内容。下面我们提交到本地仓库。
$ git add hello.s
$ git commit -m"first commit in master"
[master (root-commit) b4010f7] first commit in master
1 file changed, 1 insertion(+)
create mode 100644 hello.s
查看状态,工作树是干净的,提交已经完成。
$ git status
On branch master
nothing to commit, working tree clean
checkout 新分支
主分支已经建立完成,接下来我们假设有一个开发者dev参加了进来,dev开发者checkout一个dev分支来完成自己的开发工作。下面我们来模拟一下这个工作流程。
~/Desktop/conflict (master)
$ git checkout -b dev
Switched to a new branch 'dev'
~/Desktop/conflict (dev)
$ ls
hello.s
可以看到新checkout的dev分支拥有master主分支所有的文件,共同的文件是冲突的来源,如果两个分支同时修改了一个文件,在进行分支合并的时候,就会出现合并冲突的情况。
下面我们来模拟一下这个冲突。
我们假设dev开发者对hello.s进行了修改
~/Desktop/conflict (dev)
$ vim hello.s
~/Desktop/conflict (dev)
$ cat hello.s
This is hello.s create in master~~
dev has changed it in dev branch,what would happend after?
修改完成后,dev开发者把修改提交到dev分支上
~/Desktop/conflict (dev)
$ git add hello.s
warning: LF will be replaced by CRLF in hello.s.
The file will have its original line endings in your working directory.
~/Desktop/conflict (dev)
$ git commit -m"dev change hello.s"
[dev 0802ff0] dev change hello.s
1 file changed, 2 insertions(+)
~/Desktop/conflict (dev)
$ git status
On branch dev
nothing to commit, working tree clean
提交成功,没有问题。
同时master分支也对hello.s进行了修改
~/Desktop/conflict (master)
$ vim hello.s
~/Desktop/conflict (master)
$ git add hello.s
~/Desktop/conflict (master)
$ git commit -m"change hello.s in master"
[master 052f60c] change hello.s in master
1 file changed, 2 insertions(+)
~/Desktop/conflict (master)
$ git status
On branch master
nothing to commit, working tree clean
提交修改的时候也没有发生报错,在本分支上一切正常。这时候一切都还相安无事,看起来都没有问题。
接下来我们合并分支,会发生什么
~/Desktop/conflict (master)
$ git merge dev
Auto-merging hello.s
CONFLICT (content): Merge conflict in hello.s
Automatic merge failed; fix conflicts and then commit the result.
之前一切正常的分支,合并的时候出现了冲突。
合并出现的冲突需要我们手动去合并发生冲突的文件。
我们先来查看一下发生了冲突的内容是什么
~/Desktop/conflict (master|MERGING)
$ cat hello.s
This is hello.s create in master~~
<<<<<<< HEAD
master has changed it in master branch,what would happend after?
=======
dev has changed it in dev branch,what would happend after?
>>>>>>> dev
这个就是我们刚刚修改的地方,显而易见的就是我们修改了同一个文件,造成了合并的冲突。
如果你不想合并冲突,只需要简单的退出合并即可。可以通过git merge --abort
来简单地退出合并。
~/Desktop/conflict (master|MERGING)
$ git diff -b
diff --cc hello.s
index 2ec140a,0a490ab..0000000
--- a/hello.s
+++ b/hello.s
@@@ -1,3 -1,3 +1,7 @@@
This is hello.s create in master~~
++<<<<<<< HEAD
+master has changed it in master branch,what would happend after?
++=======
+ dev has changed it in dev branch,what would happend after?
++>>>>>>> dev
zhangguang@DESKTOP-T9RMAQ8 MINGW32 ~/Desktop/conflict (master|MERGING)
$ cat hello.s
This is hello.s create in master~~
<<<<<<< HEAD
master has changed it in master branch,what would happend after?
=======
dev has changed it in dev branch,what would happend after?
>>>>>>> dev
手动合并之后,我们查看工作树的状态,可以看到一个待提交的hello.s文件,我们可以git merge --abort
简单退出合并,也可以用git add
来完成我们的合并。这里我们提交到master分支来完成我们的合并。
~/Desktop/conflict (master|MERGING)
$ 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: hello.s
no changes added to commit (use "git add" and/or "git commit -a")
~/Desktop/conflict (master|MERGING)
$ git add hello.s
~/Desktop/conflict (master|MERGING)
$ git commit -m"fix conflict"
[master f08d749] fix conflict
我们可以来查看一下提交历史和合并的分支情况。
$ git log --graph
* commit f08d7494707c63e883b2be215939358536e05c92 (HEAD -> master)
* commit f08d7494707c63e883b2be215939358536e05c92 (HEAD -> master)
|\ Merge: 052f60c 0802ff0
| | Author: codegitz <codegit@foxmail.com>
| | Date: Sun Dec 16 13:39:32 2018 +0800
| |
| | fix conflict
| |
| * commit 0802ff0d22b91215d1757495ebb00ad262547a6a (dev)
| | Author: codegitz <codegit@foxmail.com>
| | Date: Sun Dec 16 12:18:36 2018 +0800
| |
| | dev change hello.s
| |
* | commit 052f60c173ab4f13aaef5043cf956de867988e74
|/ Author: codegitz <codegit@foxmail.com>
| Date: Sun Dec 16 13:05:22 2018 +0800
|
| change hello.s in master
|
* commit b4010f765f1f11fafa13fd36e96a4a68fa492b78
Author: codegitz <codegit@foxmail.com>
Date: Sun Dec 16 11:53:51 2018 +0800
first commit in master
这里就简单的完成了一个冲突分支的合并,合并之后的文件拥有了两个分支的修改。