git冲突解决

拉回操作(git pull)实际由两个步骤:获取操作(git fetch),合并操作(git merge)。
合并命令:git merge [选项…] <\commitId>
只需提供一个提交ID或对应的引用作为参数。
合并操作将commitId对应的目录树和当前工作分支的目录树的内容进行合并,合并后的提交以当前分支的提交作为第一个父提交,以commitID为第二个父提交。

默认情况下,合并后的结果可以自动提交,但是如果提供–no-commit选项,则合并后的结果会放入暂存区。用户对合并结果检出、修改后可以手动提交。

合并的不同提交可能同时修改了同一文件相同区域的内容,导致冲突。冲突会造成合并操作的中断。

一、自动合并
a、修改不同的文件
分别在不同用户的工作区执行下面的两个操作,确保版本库的状态保持一致:
这里写图片描述
查看远程版本库与本地版本库提交历史,两个不同用户此时会有相同的提交历史:
这里写图片描述

1、用户user1修改team/user1.txt 文件,并将修改推送到服务器
这里写图片描述
这里写图片描述
2、用户user2修改team/user2文件,提交推送到服务器,但是遇到非快进式提交,推送失败:
这里写图片描述
这里写图片描述
3、用户user2执行获取操作。将远程版本库中的master分支更新到本地引用origin/master中,此时user1.txt文件并没有被修改:
这里写图片描述
4、用户user2执行合并操作,完成自动合并,合并后,user1.txt文件被修改:
这里写图片描述
5、用户user2推送合并后的本地版本库到共享版本库
这里写图片描述
这里写图片描述
6、查看提交日志
这里写图片描述

二、修改相同文件的不同区域
不同用户在本地提交中修改相同的文件,但是修改的是文件的不同位置时,则这两个用户的提交仍可以合并成功。
1、为确保本地版本库和共享版本库状态一致,执行拉回操作:
这里写图片描述
2、用户user1修改README文件,直接在文件的第一行插入内容:
这里写图片描述
3、用户user1对修改进行本地提交并推送到共享版本库:
这里写图片描述
这里写图片描述
4、用户user2修改README文件,直接在文件的最后插入内容:
这里写图片描述
5、对user2进行本地提交
这里写图片描述
6、用户user2执行获取操作,将共享版本库中的master分支更新到本地的origin/master分支中:
这里写图片描述
7、用户user2执行合并操作,完成自动合并:
这里写图片描述
8、用户user2推送合并后的本地版本库到共享版本库:
这里写图片描述
这里写图片描述
9、追溯每一行README文件的来源
这里写图片描述
10、查看提交日志:
这里写图片描述

三、同时更改文件名和文件内容
一个用户将文件移动到其他目录(或修改文件名),另一个用户对重命名前的文件进行修改,git可以自动解决冲突,实现合并。
1、为确保本地版本库和共享版本库状态一致,执行拉回操作:
这里写图片描述
2、用户user1在自己的工作区将文件README进行重命名,本地提交并推送到共享版本库:
这里写图片描述
这里写图片描述
3、用户在自己的工作区修改README文件,在文件最后插入内容,并本地提交:
这里写图片描述
4、用户user2执行获取操作,将共享版本库中的master分支更新到本地的origin/master中:
这里写图片描述
5、用户user2执行合并操作,自动完成合并:
这里写图片描述
6、用户user2推送合并后的本地版本库到共享版本库
这里写图片描述
这里写图片描述
7、查看提交日志
这里写图片描述
8、查看合并操作所做的修改:
这里写图片描述

三、冲突解决
如果两个用户修改了同一文件的同一区域,则在合并的时候会遇到冲突而导致合并过程中断。GIT会标识出合并冲突。
例子中两个用户都修改doc/README.TXT文件:
1、确保本地版本库与共享版本库状态一致,执行拉回操作:
这里写图片描述
2、用户user1直接在自己的工作区中修改文件(修改了第二行):
这里写图片描述
3、用户user1对修改进行本地提交,并推送到共享版本库
这里写图片描述
这里写图片描述
4、用户user2也修改相同的文件相同的位置,并将修改提交到本地:
这里写图片描述
5、用户user2执行拉回操作(获取与合并),遇到冲突:
这里写图片描述
6、查看状态,发现文件处于未合并的状态,这个文件在两个不同的提交中都做了修改:
这里写图片描述
7、查看当前工作区中冲突的文件:
这里写图片描述
特殊标识<<<<与====之间的内容是当前分支所更改的内容;
特殊标识====与>>>>之间的内容是所合并的版本库更改的内容。
此时,文件中的内容变成:
这里写图片描述
8、手工编辑完成冲突解决,将冲突标识符所标识的文字替换为合适的内容,并去掉冲突标识符:
这里写图片描述
9、添加到暂存区,并提交:
这里写图片描述
10、查看提交日志,最新的提交就是一个和并提交:
这里写图片描述
11、将提交推送到远程共享版本库:
这里写图片描述
这里写图片描述

四、树冲突
如果一个用户将某个文件改名,另外一个用户将同样的文件改为另外的名字,当这两个用户的提交进行合并操作,会产生冲突。
因为文件名修改而造成的冲突,称为树冲突。
1、确保本地版本库与远程共享版本库保持一致,执行拉回操作:
这里写图片描述
2、将文件名README改为readme,提交并推送到共享版本库:
这里写图片描述
这里写图片描述
3、用户user2也修改同一文件名称,但是改成不一样的名字,并在本地提交:
这里写图片描述
4、用户user2执行拉回操作(获取和合并),遇到合并冲突:
这里写图片描述
5、查看状态,后面解决冲突就是对这三个不同的文件进行增删操作:
这里写图片描述

手工操作解决树冲突
用户user1与用户user2应该确认使用的文件名称。如果双方最终确认使用user2的重命名的名称,则user2应该完成冲突解决
1、删除文件readme.txt (user1的修改文件名):
这里写图片描述
2、删除文件doc/README.txt (之前的文件名):
这里写图片描述
3、添加文件READ (新的重命名名称):
这里写图片描述
4、提交完成冲突解决,并推送到远程共享版本库:
这里写图片描述
这里写图片描述
5、查看提交日志:
这里写图片描述
同步之后,会发现在user2中doc/README.txt文件夹不见了,但是多了一个README文件;
在user1中还存在doc文件夹,但是里面为空,并且多了一个README文件。

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值