Git是否合并完整文件或更改了部分文件?

时间:2014-09-27 08:38:24

标签: git merge

文档说Git merge合并了文件更改。我不确定它是否意味着它取代了完整的已更改文件或仅更改了部分文件。

让我说明一下我的担忧。有A和B的人在同一个项目上工作但在不同的分支上工作。

Project--- Branch ---Master
                 ---B's branch

" b分支"在Master分支的第10版分支。

Master v1--2--...--10--11--
                 --v1--v2--

如果我们都在v11 / v2中更改了文件MyFile.java并且我想在Master v12上合并它,那么Git是否会完全从B< v2中移动文件,或者它只会合并添加的行(让我们说Master v10没有冲突或改变方法吗?

例如,MyFile v11看起来像

1: 
2: void someMethod() {}
3:
4: void anotherMethod() {}
5:

和B&#39的MyFile v2看起来像

1: 
2: void someMethod() {}
3:
4: void myCoolMethod() {}
5:
6: void anotherMethod() {}

如果MyFile是空的,但是存在,当发生分支时,将仅将挤压方法myCoolMethod合并到代码中,或者将MyFile的全部内容从分支B复制到分支A上的MyFile中?

2 个答案:

答案 0 :(得分:5)

没有复制涉及的文件。它更加微妙;粗略地说,合并涉及逐行比较文件(或者更确切地说, blob

在您的问题中概述的简单合并示例中,Git将应用3-way merging。基本上,这种合并策略不仅使用了你想要合并的两个提交,而且还使用了他们最近共同祖先的提示。

共同祖先中包含的信息允许Git在许多情况下找出如何合并事物,在这种情况下,更简单的合并策略,例如双向合并(不使用共同的祖先) (根本),会导致合并冲突并要求用户进行干预。

无冲突3向合并的示例

例如,在以下情况中,

enter image description here

如果你通过查看共同祖先(B)中记录的文件内容,告诉Git合并提交CA,即三向合并策略,会意识到您所做的就是在baz中记录的版本中的foobar行之间添加C行。因此,合并只会导致

enter image description here

3向合并期间的冲突示例

然而,在某些情况下,共同的祖先仍然没有提供足够的信息来让Git自己解决问题。您问题中描述的示例就是这种情况。

enter image description here

即使Git会尝试在您的示例中执行3向合并,仍会出现合并冲突,因为在共同祖先中保存MyFile.java内容的blob是完全空的;因此,它无法提供关于在共同祖先(B)的后代(CA)中添加或删除行的位置的任何提示。

Git本身无法确定要保留的版本是包含foo\nbar的版本还是包含foo\nbaz\nbar的版本(\n代表换行符,这里)。因此,Git会停下来(发出合并冲突)并寻求帮助。

enter image description here

答案 1 :(得分:-1)

更改仅在更改的行中合并。只有在发生冲突时才能用B版本替换A版本,并且通过接受整个文件版本手动解决。

A或B中的一个将是第一个在历史中出现的第一个更改文件的人。让我们说A先生。他的更改将合并到master的先前版本中。如果合并后没有提取A的更改,B先生将无法合并。所以B先生的变化将在A合并之后进入合并期间合并。如果A和B在文件中编辑了相同的行,则会发生冲突。