Git下冲突的产生和解决

1、冲突的场景

内容冲突
两个用户修改了同一个文件的同一块区域,git会报告内容冲突。我们常见的都是这种,后面的解决办法也主要针对这种冲突。

文件名冲突

比如另外一个人修改了文件名,但我还使用老的文件名,这种情况下自动处理是能成功的,但实际上是有问题的。
又比如,函数返回值含义变化,但我还使用老的含义,这种情况自动处理成功,但可能隐藏着重大BUG。这种问题,主要通过自动化测试来保障。所以最好是能够写出比较完备的自动化测试用例。
这种冲突的解决,就是做一次BUG修正。不是真正解决git报告的冲突。

2、冲突解决方法

本篇文章主要介绍内容冲突的解决办法。

内容冲突的解决办法
(1)备份
(2)还原代码(回退提交、撤销操作)
(3)拉取最新代码
(4)把自己的代码重新加到最新的文件上
(5)提交并推送代码

3、实战演示

3.1 冲突场景
在项目工程里创建TestFile.txt文件,添加内容为"11111",并提交到远程master分支。
用户A对该文件追加“22222”,并先于用户B提交到远程master分支。
用户B对该文件追加"33333",并提交到master分支,此时产生内容冲突!

用户A操作截图
Git下冲突的产生和解决
用户B操作截图
Git下冲突的产生和解决
Git下冲突的产生和解决

3.2 解决办法

(1)备份

备份好自己修改的文件,以便步骤(4)使用。

(2)还原代码

把自己修改的所有文件还原到修改前的状态。该环节主要有两个步骤:回退提交和撤销本地操作。在讲解这两个步骤前先解释两个概念。

四个工作空间

Git下冲突的产生和解决
工作区(WorkSpace):修改文件,新增文件的地方。比如对某个文件增加一行代码然后保存。此时文件并未提及,该文件目前所处于工作区。

暂存区(Index):比如在工作区新增一个文件,然后把该文件右键Add到暂存区,该文件目前就处于暂存区。暂存区只是工作区和本地仓库的一个缓冲带,大家没必要深入纠结这个概念。

本地仓库(Repository)、远程仓库(Remote)的概念想必大家都很熟悉,本篇文件不做详解。

Reset(回退)和Revert(撤销)的区别

简单来说,Reset回退的是本地仓库上的提交记录,Revert撤销的是工作区的操作。比如修改某个文件并提交到本地仓库。Reset是回退本地仓库上的提交记录。但此时工作区里的文件修改内容还存在,要想还原得继续Revert该文件。

了解了以上概念,我们再回过头来看刚才用户B的操作场景。此时,修改的内容已经commit到了本地仓库,但是push到远程仓库就产生了冲突。所以如果还原代码的话,就要先从本地仓库上回退提交记录(Reset),再从工作区撤销修改的操作(Revert)。详细操作步骤如下截图:

Reset到用户B添加33333前的一次操作。
Git下冲突的产生和解决
Revert工作区里的操作
Git下冲突的产生和解决
已还原到自己修改代码前的状态
Git下冲突的产生和解决

(3)拉取最新代码

接下来就是从服务器上Pull最新的代码。
Git下冲突的产生和解决

(4)合并自己的代码

在最新代码的基础上,把自己修改的内容重新加进来。推荐大家使用Beyond Compare软件,只需要点击[箭头]按钮,就可把修改的内容追加到目标文件上。
注意:不要覆盖别人的代码。
Git下冲突的产生和解决

(5)提交代码并推送到远程分支

把自己追加的代码Commit并Push到远程分支,冲突问题至此已解决完毕。
Git下冲突的产生和解决