与git合并 - 我如何找出“新”代码的结束位置?

时间:2016-11-12 01:32:50

标签: git merge

我的git上的另一个用户创建了一个分支,无法弄清楚如何通过eclipse合并它。因此我将它与主人合并。

开始:

git pull origin master
git pull origin garbage (this is what his branch is named)

我在文件中遇到合并冲突。如果我写了所有的代码,通常我可以想出这些,但在这种情况下,我不能。它看起来像这样:

<<<<<<<<<<<HEAD
//a bunch of code
=========
>>>>>>>>>>> A bunch of numbers (I'm assuming the hash of the new branch)
//code that I didn't write
//the rest of the code

我找不到code I didn't writerest of code之间的差距。 “新”代码后面不应该有另一条========行吗?合并这个的最佳方法是什么?

3 个答案:

答案 0 :(得分:1)

这种特殊的冲突风格只显示冲突的两个部分 - 但实际上有三个部分,只是通常会抛弃一部分。

请记住,该文件有“基本”版本,还有两个 tip 版本。在master上进行 更改之前,基本版本就是所启动的 - 而开始基础版本之前他他的更改。这就是基础版本“基础”的原因:你们都有相同的文件,过去的某个时间。

从那以后 - 因为那个共同的基础-Git认为这是“你做了一些提交(至少有1个,也许很多),并且他做了一些提交(至少有一个,也许很多)”:

          o--o--A   <-- you (master)
         /
...--o--*
         \
          o--o--o--B   <-- him

为了结合这些变化,Git运行从*(基数)到A(您的master)的差异,以及从*到{{的第二个差异1}}(他的B,你通常会调用garbage代替。 Git在“你做了什么”和“他做了什么”之间发现了某种冲突,并使用冲突标记将其放入组合(大部分已完成)的文件中:

origin/garbage

这是Git对文件最终形式的最佳猜测,解决没有冲突的部分,同时将的部分留在那里作为冲突两组代码。缺少一件大事:Git认为你们开始的是什么?

比如说,Git错误地认为你们都保持了第17个完全空行,因为你的新文件附近有一个空白行,而他的新文件附近有一个空白行(尽管实际上是只是意外匹配)。然后Git能够确定他在之后所做的一切空白行没有冲突,所以这是在你的合并文件中,但没有标记冲突标记。

与此同时,Git决定,由于这个“保持”的空白行,你添加了第一个[there might be stuff up here too] <<<<<<<<<<< HEAD //a bunch of code ========= >>>>>>>>>>> A bunch of numbers (I'm assuming the hash of the new branch) //code that I didn't write //the rest of the code 部分,他没有。 (这实际上可能是在原始文件中,但是当Git错误同步时,它会“看起来很新”。或者它可能 全新。)

在该部分之后,在最初的// a bunch of code V形和<<<行之间,Git包含它认为添加的代码:那是{{1之后的任何内容行,直到===行。 (在这种情况下,它认为他没有在这里添加任何:可能,它认为他已删除某些内容,例如空行。)

其余代码(包括===)已经在基础中,或者Git能够在不发生冲突的情况下添加。

我发现将>>>设置为// code that [you] didn't write会更好。这改变了Git如何将两个冲突的部分插入到最终的文件中:它放入它可以自己处理的部分,然后放入merge.conflictstyle标记,然后它认为你添加了什么,然后是一系列垂直条diff3,然后是Git认为要替​​换的基本代码,然后是<<<<<<<标记,然后是他的代码,然后是结束|||||||标记。

Git认为您可能会删除基本代码并使用HEAD或其他分支代码部分中的一个或另一个,或者甚至可能混合使用HEAD和其他部分。但是,如果 base 部分完全是胡说八道,你可以立即告诉Git在某些虚假信息上同步,例如空白行和只包含=======的行。

答案 1 :(得分:0)

这就是为什么当另一个人要执行拉动请求以将其分支更改推送到原始主控时,您需要使用diff。如果你要做差异,那么你会在合并之前看到任何冲突并且之前会修复它们。现在您需要逐行进行并修复这些代码行以删除不必要的代码/添加相关代码。

答案 2 :(得分:0)

你能试试吗

  

git mergetool

git mergetool运行多个合并实用程序之一来解决合并冲突。它通常在git merge之后运行。

安装一些合并工具,如kdiff3或meld,以帮助您合并。