合并时,Git是否会覆盖整个文件,或者只是更改了部分?

时间:2016-10-07 12:52:35

标签: git github git-merge pull-request

此问题适用于任何使用Git与其他队友配对的情况。假设我们两个都在更改同一个文件,但不会导致冲突。

假设我有代码:

#define client_view 500
#define server_view 1000
#define client_destroy 750
#define server_destroy 1250

我要求更改client_view相关内容,我的同事被要求更改server_view

我将其client_view更改为570,例如我认为在这个假设情景中570是一个很好的价值。同样,我的同事为1066选择了server_view

当我们都拉取请求时,经理将这些请求合并到主人,

它会显示什么?

#define client_view 570
#define server_view 1000
#define client_destroy 750
#define server_destroy 1250

#define client_view 500
#define server_view 1066
#define client_destroy 750
#define server_destroy 1250

#define client_view 570
#define server_view 1066
#define client_destroy 750
#define server_destroy 1250

我问这个是因为我想知道我的更改是否会覆盖我的同事变更。我从来没有在其他人工作过的同一个文件上发送拉取请求,因此我不知道答案,也无法在SO或其他地方找到答案。

1 个答案:

答案 0 :(得分:0)

Git正在做一种叫做" 3路合并的事情。这意味着,将涉及三个提交:

  • 答:你的提交
  • B:他们的提交
  • C:A和B的共同祖先

3-way-merge现在(基本上)找到C-A和C-B之间的所有变化。如果一组特定的行仅由A或B更改,则它将应用它们。如果在A和B中都更改了任何行(相对于C),则会将其标记为冲突,并且您需要手动选择分辨率。

Git中使用的算法通常非常非常擅长为您提供您直观期望的内容。因此,在您的情况下,您的两个更改都将被简单地应用(因为它们彼此不冲突)。所以你得到了第三个结果。

很明显,经常让人困惑的是,Git并不关心C ... A或C ... B之间发生的事情。例如,您可以在两者之间删除和还原文件,它根本不会影响合并操作。

此外,以某种方式通过所有中间提交,它只会查看这三个提交。这对于现在非常有用,因为在合并冲突的极端情况下(例如,如果你的一个同事改变了所有行的缩进,使整个文件发生了很大的冲突),你可以通过改变A或B来帮助自己。他们自己(在这个例子中,撤消他们的缩进,或对你的文件应用相同的缩进),提交更改,然后尝试再次合并,希望得到一个较小的冲突。