当前位置:首页 > git > 正文

git合并分支出现冲突

  • git
  • 2024-06-05 02:33:25
  • 6851

⑴如何解决Git中的合并冲突
冲突的发生
很多命令都会发生冲突,但基本上来说,冲突发生在合并和修补的时候。
Rebase是重置基线然后应用补丁的过程,所以会发生冲突。
Gitpull会自动合并,reposync会自动rebase,所以Gitpull和reposync也会冲突。 当然,没有提到gitrebase。
冲突类型
逻辑冲突
Git自动化处理(合并/应用补丁)成功,但逻辑有问题。
比如别人修改了文件名,但我还是用旧的文件名,这种情况下,自动处理可能成功,但实际上是有问题的。
对于第二个例子,函数返回值的含义发生了变化,但我仍然使用旧的含义。 这种情况会自动处理成功,但可能隐藏了一个重大错误。 这类问题主要通过自动化测试来解决。 因此,最好能够编写比较完整的自动化测试用例。
解决此类冲突的方法是修复错误。 实际上git报告的冲突并没有得到解决。
内容冲突
如果两个用户修改同一个文件的同一区域,git会报告内容冲突。 这是我们经常看到的,下面的解决方案主要是针对这类冲突的。
树冲突
由于文件名修改引起的冲突称为树冲突。
例如,如果用户a重命名文件a.c,用户b重命名同一个文件b.c,那么当b合并两个提交时,就会发生突。
⑵我在gitmerge的时候遇到了冲突,怎么解决?

首先我们来看看为什么会发生冲突。 git冲突的原因很简单,就是两个分支对同一个代码做了不同的修改。 那么git在合并的时候就会很混乱,不知道要做什么,所以就会产生冲突。

实践

光说不练是没有意义的。

首先我们创建一个文件test.txt并在其中写入测试行。 gitadd和gitcommit。

然后我们检查-b来创建一个新分支。 在此分支中,我们将test.txt之前的行更改为getconflict。 然后我们还添加提交。

最后,我们回到master分支并尝试mergetest_conf分支。 合并后,您将看到以下输出:

输出日志提醒我们这两个第八个.md文件之间存在冲突,即当前正在编辑的文章。 所以也会发生冲突。 不过,文章中的冲突似乎不太方便,所以我们不会提出相关的冲突。 让我们重点关注test.txt文件,这是我们刚刚创建的演示文件。

>>>>>、=======和<<<<<<<<等符号来简要分隔它们的含义。

其实,这是很明显的。 这个<<<<<<<>>>>>>test_conf就是我们合并到的分支的代码。

除了直接打开文件之外,我们还可以运行gitdiff命令来查看冲突情况。

解决冲突

手动解决

>>>>,======,<<<<<<。 最后添加回提交。

废除合并

合并当然可以完成,但显然不友好。 如果变化量很小的话就可以了。 大了,显然要花费很大的力气。 如果你觉得改动太大,想先放弃合并,可以先考虑其他方法。 您可以使用命令gitmerge--abort,它可以将代码恢复到合并前的状态。 如果您在运行gitmerge后进行了一些人为更改,它们也会在中止后回滚。

gitmerge--abort

mergetool

除了手动合并和中止之外,我们还有其他几种整合工具。 比如git官方开发了一个专门用于合并的工具,叫做gitmergetool。 它会找到两个分支的祖先代码的副本作为基础或基准,然后列出两个分支的变化进行比较。 保存在git编辑器中。

打开后是这样的。 我只用过一次,因为我发现它太难用了。

gitmergetool

IDE工具

除了官方的git之外,常规IDE还提供合并工具。 例如,vscode中的git插件为我们提供了一个非常有用的合并功能,它可以用不同的颜色突出显示不同分支的代码。 并且它还提供了一些非常有用的功能。 他们必须保留当前分支的代码,保留合并分支的代码,并保留两者并比较更改。

使用vscode打开test.txt后,我​​们将看到:

当我单击“比较”时,它将两个文件对齐在一起,以便我们观察它们各自的更改。 我必须说它非常容易使用。