上一篇讲了不同用户之间的工作协同,但是协同总是会出现问题的,只要有合并就会有冲突。知道
git full = git fetch + git merge
下面根据合并操作是否遇到冲突,以及不同的冲突类型,可以分为:自动合并、逻辑冲突、真正的冲突和树冲突。
1.自动合并
下面三种情况下可以实现自动合并:
1.1 修改不同的文件
1.2 修改相同文件的不同地方
1.3 同时修改文件名和文件内容
1.1修改不同文件。用户user1和用户user2在本地提交中修改了不同的文件,其中一个用户要尝试合并提交。具体过程如下:
(1)用户user1修改了team/user1.txt文件,提交并推送。
$ cd /path/to/user1/workspace/project/
$ echo "user1 date" >> team/usre1.txt
$ git add -u
$ git commit -m "update user1"
$ git push
(2)用户user2修改team/user2.txt文件并提交。
$ cd /path/to/user2/workspace/project/
$ echo "user2 date" >> team/user2.txt
$ git add -u
$ git commit -m "update user2"
(3)用户user2在推送时没回遇到非快进式推送错误而终止。
(4)下面操作可以实现合并并推送。
$ git fetch
$ git merge origin/master
$ git push
1.2修改相同文件的不同区域。当用户user1和user2在本地提交中修改不同位置时仍可以提交并成功合并。具体操作同上。
1.3同时更改文件名和文件内容。即有一个用户将文件移动到其他目录或修改文件名,另一个用户针对重命名前的文件进行修改,还能实现合并吗?具体操作过程如下:
(1)两用户对本地版本库执行拉回操作。
$ git pull
(2)用户user1在自己的工作区将文件README进行重命名,并提交推送。
$ cd /path/to/user1/workspace/project/
$ mkdir doc
$ git mv README doc/README.txt
$ git commit -m "move to doc/."
$ git push
(3)用户user2在自己的工作区修改了README文件,在文件的最后插入内容,并提交。
$ cd /path/to/user2/workspace/project/
$ echo "user2 hacked." >> README
$ git add -u
$ git commit -m "changed by user2."
(4)如下几部操作可以实现合并。
$ git fetch
$ git merge refs/remotes/origin/master
$ git push
用下面一条命令可以查看合并操作所做出的修改:
$ git log -l -m --stat
2.逻辑冲突
自动合并可以成功完成,但是在某些情况下,合并后的结果可能存在着逻辑冲突。如有一个用户修改了一个文件的文件名,而另外的用户在其他文件中引用旧的文件名,这样的合并就存在着逻辑冲突。
3.真正的冲突
如果两个用户修改了同一文件的同一区域,则在合并时会遇到冲突而导致合并中断。如下过程:
(1)两用户对本地版本库执行拉回操作。
(2)用户user1在自己的工作区修改doc/README.txt文件。
user1 hacked.
hello, user1.
(3)然后user1对本地修改实施提交并推送到共享版本库。
(4)用户user2也在自己的工作区修改doc/README.txt文件。
user1 hacked.
hello, user2.
(5)用户user2进行本地提交。
(6)然后user2执行拉回操作,遇到冲突。可以用下面的命令来查看冲突文件的多个不同的版本。 git ls-files -s
查看当前工作区的冲突文件,可用下面的命令:$ cat doc/README.txt
(7)手工编辑完成冲突解决。打开文件doc/README.txt,将冲突标识符所标识的文字替换成两者接受的语句,如:hello,user1 and user2.。然后再进行提交推送。
4.树冲突
如果一个用户将某个文件改名,另一个用户将同样的文件改为另外的名字,当进行合并时,GIT显然无法替用户做出裁决,就发生了冲突。具体过程如下:
(1)两个用户的本地版本库执行拉回操作。
(2)用户user1将文件doc/README.txt改名为readme.txt,并推送。
(3)用户user2将文件doc/README.txt改名为README,并做本地提交。
(4)用户user2执行git pull 操作,遇到合并冲突。
手工操作解决树冲突。具体过程如:
a.删除文件readme.txt 用此命令$ git rm readme.txt
b.删除文件 doc/README.txt
c.添加文件README。
d.提交推送即可。