Git 合并和重设基础如何工作?
我试图理解合并和重基在数学中的集合运算方面做了什么 在下面的例子中,“-”表示Git 合并和重设基础如何工作?,git,git-merge,git-rebase,Git,Git Merge,Git Rebase,我试图理解合并和重基在数学中的集合运算方面做了什么 在下面的例子中,“-”表示diff(类似于在数学中取集差,但“A-B”表示A中的集差而不是B中的集差,减去B中的集差而不是A中的集差),“+”表示patch(即在数学中取不相交的并集。我以前没有用过patch,所以我不确定) 来自Chacon的ProGit 最近的共同祖先C2在这方面扮演什么角色 合并 C5=(C4-C2)+(C3-C2)+C2正确吗 对于重设基础而不是合并: C4'=(C4-C2)+C3正确吗 那么merge中的C5和re
diff
(类似于在数学中取集差,但“A-B”表示A中的集差而不是B中的集差,减去B中的集差而不是A中的集差),“+”表示patch
(即在数学中取不相交的并集。我以前没有用过patch
,所以我不确定)
实验
(在您的示例中)中所做的哪些更改尚未出现在主
(其论点是,在最后一个公共祖先之后,从实验
分支的分支端可以访问的所有提交都不是主分支的一部分
当使用git merge experiment
将experiment
分支合并到master
中时,git然后使用要合并的分支的公共祖先和分支尖端之间的增量(experiment
,在本例中)来确定要在合并提交中应用哪些更改
在您为问题选择的集合表示法中,我将其表示为C5=C3+(C4-C2)
C4'=(C4-C2)+C3正确吗
那么merge中的C5和rebase中的C4’有相同的内容吗
这两个假设都是正确的。请记住,git-rebase
保持提交的增量不变,因此在您的示例中表达式(C4'-C3)=(C4-C2)是正确的
W',X',Y'和Z'是如何生成的
如前所述,git-rebase
保留提交的增量。这意味着(例如)W与其父提交B(或W-B,您也可以使用git-diff-B..W
生成)之间的差异
然后,一个重基简单地将相同的增量应用于一个新的父提交;因此在您的示例中(W'-E)=(W-B)(相应地,对于X、Y和Z)
c2
c3+c4
重基而不是合并的整个要点是,您将拥有一条“直线”,而不是途中的所有分叉(蛇形)
你拿着你的作品,把它放在分支的顶端,作为一条单行线,在合并中,你至少有两个父节点(提交)到合并点。你不能用“diff”和“patch”正确地解释Git语义。原因是Git不跟踪更改;它跟踪内容。当您有一个提交
a
和一个父提交B
,那么对于Git,a
不是B
和a
之间的区别,即从B
到a
所需的更改,而是实际的更改A
的内容。您可以自行进行提交,此时您就可以重建存储库了
出于这个原因,我不会遵循您的“提交算法”,而是尝试用文字解释每个案例
- 应用了补丁的C3可以让你从C2到C4
- C4加上补丁可以让你从C2到C3
C4
将具有与(1)中的C5
相同的内容
对于你的“算术”,我通常会说(C3-C2)+C2=C3
。所以这两个公式在这里也是等价的W' = E + (W - B) (the patch from B to W, applied on E)
X' = W' + (X - W) (the patch from W to X, applied on W')
Y' = X' + (Y - X) (the patch from X to Y, applied on X')
Z' = Y' + (Z - Y) (the patch from Y to Z, applied on Y')
因此,W
的基础更改为E
而不是B
,所有后续提交都只是更新为跟随新提交W'
但是,结果Z'
的内容与合并E
和Z
的合并提交的内容相同