另一个用户在我的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 write
和rest 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来帮助您合并。