合并时git branch是否被压扁或重放?

时间:2017-08-17 11:33:04

标签: git github merge

给定一个包含主服务器和功能分支的repo,并通过C0提交C5,如下所示:

C0 <-- C1 <-- C2 <------ ???   master
       \                /
        C3 <-- C4 <-- C5      feature

当我合并时,???点会发生什么?

我是否获得一次提交C6,即&#34;壁球&#34;将合并作为单个提交:

C0 <-- C1 <-- C2 <------ C6    master
       \                /
        C3 <-- C4 <-- C5      feature

或者&#34;重播&#34;,即C6 <-- C3' <-- C4' <-- C5'(使用',因为这些提交现在还包含C2):

C0 <-- C1 <-- C2 <------ C6 <-- C3' <-- C4' <-- C5'   master
       \                /
        C3 <-- C4 <-- C5                              feature

从同一个repo的分支合并盒标准拉取请求时,GitHub上是否相同?

3 个答案:

答案 0 :(得分:3)

假设你使用命令git merge 而没有 --squash选项,Git会创建C6提交,称为merge commit ,在合并其内容后,它类似于跟踪文件的快照。默认策略是递归,它通过考虑C5C1之间以及C2C1之间的变化进行合并。

由于这是合并提交,因此其父级将为C5C2

您的困惑可能来自于您没有考虑提交的内容:它们只是指向文件树状态的指针。他们不存储差异(为了简单起见,让我们跳过gc完成的压缩),他们存储状态。所以Git会合并你的文件,保存它们,散列它们并创建一个哈希(代表一个树对象),它允许我们重建那个状态,这就是你的C6提交所指向的。 Git From The Inside Out在解释整个过程方面做得非常出色。

另一方面,如果您使用了git merge --squash,Git也会在合并后创建一个状态提交,但生成的提交就像正常提交一样,没有两个父节点。有关详细信息,请参阅Git: To squash or not to squash?

最后,这个&#34;重播&#34;过程由rebase完成,但不是您所描述的方式。阅读Merging vs. Rebasing,了解mergerebase的不同之处。

答案 1 :(得分:2)

你得到的既不是壁球也不是重播。

要获得壁球,您可以使用<?php // working here $GLOBALS['x'] = "Root of the file"; echo $x; // same things are not working in the function. function checkglobal() { $GLOBALS['z'] = "In the function."; echo $z; } checkglobal(); 选项--squash。然后你就

merge

其中C0 <-- C1 <-- C2 <-- C3C4C5 master \ C3 <-- C4 <-- C5 feature 是一个提交,其中一个父项的C3C4C5的差异等于C2 C5的差异(禁止冲突)。

重播分支的更改,您可以执行重新定位操作。这可能会产生

C1

(或某些变化,具体取决于您的行为)。在这种情况下,提交C0 <-- C1 <-- C2 <-- C3' <-- C4' <-- C5' master featurE_ref \ C3 <-- C4 <-- C5 feature_ref_used_to_be_here C3'的格式完全不同,C2C3的格式不同,等等。

但是在合并的情况下,你不会得到其中任何一个。你得到了

C1

&#39; M&#39;是单个提交,但与壁球的C0 <-- C1 <-- C2 <------ M master \ / C3 <-- C4 <-- C5 feature 不同,C3C4C5有两个父母。其M(内容)与TREE的不同之处在于C2 C5与[{1}}的不同之处,因此它与相似到壁球。但它通常被解释为不引入变化(合并冲突或邪恶合并除外);相反,它标志着此时TREE及其祖先的变化被引入C1。因此,默认情况下C5不会显示master的补丁,但会包含提交git logMC3

答案 2 :(得分:1)

你们两个都没有....直接。

首先,git中的合并是这样的:

  1. 找到两个头的共同祖先,在你的情况下,这是C1
  2. 合并两个方面的'找到那些和共同的祖先之间的区别并把它放在一起,无论我在哪里都无法做到这个确定性我要问用户`
  3. 当我完成后,我创建了一个新的提交,即合并提交,其中C2C5为共同父级
  4. 合并时可以使用壁球(git merge --squash)。这在this出色的答案中有解释。