合并如何确定'new'代码的结束位置?



另一个用户在我的git上创建了一个分支,但不知道如何通过eclipse合并它。因此,我将它与master合并。

开始:

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之间的差距。在"新"代码之后不应该有另一条========线吗?合并这个的最好方法是什么?

这种特殊的冲突样式只显示了冲突的两个部分——但实际上有三个部分,只是其中一个通常被丢弃。

请记住,该文件有一个"基本"版本,以及两个提示版本。基本版本是您在master上进行更改之前开始使用的,并且在进行更改之前以相同的基本版本开始。这就是为什么基础版本是"基础"的原因:在过去的一段时间里,你们都有相同的文件,以相同的形式。

从那时起——因为git认为这是"你做了一些提交(至少一次,可能很多),他做了一些提交(至少一次,可能很多)"。:

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

为了合并这些更改,Git从*(基础)到A(您的master)运行一次diff,从*B(您的garbage,通常称为origin/garbage)运行第二次diff。Git发现"what you did"one_answers"what he did"之间存在某种冲突,并使用冲突标记将其放入合并(基本完成)的文件中:

[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对文件最终形式的最佳猜测,解决了不与冲突的部分,而将冲突的部分作为两组代码保留在那里。遗漏了一个大问题:Git认为你们都以开头的是什么?

例如,假设Git错误地认为你们都保留了第17行完全空白,因为你的新文件在那里附近有一个空白行,他的新文件在那里附近有一个空白行(即使实际上这只是一个意外的匹配)。然后Git就可以决定他在空行之后所做的一切都不冲突,所以它在你的合并文件中,但没有标记冲突标记。

同时,Git决定,因为这个"保留"的空行,你添加了第一个// a bunch of code部分,他没有。(这实际上可能在原始文件中,但是当Git错误同步时,它会"看起来是新的"。或者真的是全新的

之后,在最初的<<<符号和===行之间,Git包含了它认为添加的代码:这是===行之后的代码,直到>>>行。(在这种情况下,它认为他没有在这里添加任何内容:可能,它认为他删除了

内容,例如空白行。)

其余的代码,包括// code that [you] didn't write,要么已经在基础中,要么Git能够添加而不会看到冲突。

我发现最好将merge.conflictstyle设置为diff3。这改变了Git将两个冲突的部分插入到大部分最终文件中的方式:它放入它自己可以处理的部分,然后是<<<<<<<标记,然后是它认为您添加的内容,然后是一系列垂直条|||||||,然后是Git认为要替换的基本代码,然后是=======标记,然后是他的代码,然后是结束的>>>>>>>标记。

Git认为你可能会放弃基本代码,使用HEAD或其他分支代码段中的一个或另一个,或者甚至是HEAD和其他的混合。但是,如果部分被证明是完全无意义的,您可以立即告诉Git同步了一些虚假的东西,例如空行和仅由}组成的行。

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

你能试试吗

git mergetool

git mergetool运行其中一个合并工具来解决合并冲突。它通常在git merge之后运行。

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

最新更新