给定一个包含主服务器和功能分支的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上是否相同?
答案 0 :(得分:3)
假设你使用命令git merge
而没有 --squash
选项,Git会创建C6
提交,称为merge commit
,在合并其内容后,它类似于跟踪文件的快照。默认策略是递归,它通过考虑C5
和C1
之间以及C2
和C1
之间的变化进行合并。
由于这是合并提交,因此其父级将为C5
和C2
。
您的困惑可能来自于您没有考虑提交的内容:它们只是指向文件树状态的指针。他们不存储差异(为了简单起见,让我们跳过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,了解merge
和rebase
的不同之处。
答案 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'
的格式完全不同,C2
与C3
的格式不同,等等。
但是在合并的情况下,你不会得到其中任何一个。你得到了
C1
&#39; M&#39;是单个提交,但与壁球的C0 <-- C1 <-- C2 <------ M master
\ /
C3 <-- C4 <-- C5 feature
不同,C3C4C5
有两个父母。其M
(内容)与TREE
的不同之处在于C2
C5
与[{1}}的不同之处,因此它与相似到壁球。但它通常被解释为不引入变化(合并冲突或邪恶合并除外);相反,它标志着此时TREE
及其祖先的变化被引入C1
。因此,默认情况下C5
不会显示master
的补丁,但会包含提交git log
,M
和C3
答案 2 :(得分:1)
你们两个都没有....直接。
首先,git中的合并是这样的:
C1
C2
和C5
为共同父级合并时可以使用壁球(git merge --squash
)。这在this出色的答案中有解释。