Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/git/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Git 合并和重设基础如何工作?_Git_Git Merge_Git Rebase - Fatal编程技术网

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
,所以我不确定)

  • 来自Chacon的ProGit

    最近的共同祖先C2在这方面扮演什么角色 合并

    C5=(C4-C2)+(C3-C2)+C2正确吗

  • 对于重设基础而不是合并:

    C4'=(C4-C2)+C3正确吗

    那么merge中的C5和rebase中的C4’有相同的内容吗

  • 来自Loeliger使用Git的版本控制

    W',X',Y'和Z'是如何生成的

  • 最近的共同祖先C2在此合并中扮演什么角色

    C5=(C4-C2)+(C3-C2)+C2正确吗

    最新的共同祖先用于确定在分支
    实验
    (在您的示例中)中所做的哪些更改尚未出现在
    (其论点是,在最后一个公共祖先之后,从
    实验
    分支的分支端可以访问的所有提交都不是主分支的一部分

    当使用
    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在此合并中扮演什么角色

  • c2
    c3+c4

    重基而不是合并的整个要点是,您将拥有一条“直线”,而不是途中的所有分叉(蛇形)


    你拿着你的作品,把它放在分支的顶端,作为一条单行线,在合并中,你至少有两个父节点(提交)到合并点。

    你不能用“diff”和“patch”正确地解释Git语义。原因是Git不跟踪更改;它跟踪内容。当您有一个提交
    a
    和一个父提交
    B
    ,那么对于Git,
    a
    不是
    B
    a
    之间的区别,即从
    B
    a
    所需的更改,而是实际的更改
    A
    的内容。您可以自行进行提交,此时您就可以重建存储库了

    出于这个原因,我不会遵循您的“提交算法”,而是尝试用文字解释每个案例

  • C5是一个合并提交,两个父级C3和C4都以C2为父级。因此,假设没有冲突,并且Git能够自行解决整个合并,那么C5将包含以下两个等价表达式表示的内容:

    • 应用了补丁的C3可以让你从C2到C4
    • C4加上补丁可以让你从C2到C3
    所以在某种程度上,你可以用你的公式来表达它

  • 重新基础基本上会使您处于完全相同的情况。唯一的区别是它实际上重写了重新基础的提交,将其更改(补丁)重新应用到另一个提交。因此结果
    C4
    将具有与(1)中的
    C5
    相同的内容

    对于你的“算术”,我通常会说
    (C3-C2)+C2=C3
    。所以这两个公式在这里也是等价的

  • 如上所述,rebase只是将提交补丁重新应用到另一个父级上。Git正在编写新的提交,其中包含与原始提交相同的更改,但这些新提交将应用到不同的父级上

    所以,如果你想得到它的公式,它可能会是这样的:

    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
    的合并提交的内容相同

  • 这就给我们留下了一个问题:如果合并和重新基址产生相同的内容,那么两者之间的区别是什么?因为两种方式都不会丢失提交(重新基址将创建新的提交对象,但这些对象将保留所有原始信息),基本上都是关于更改历史的外观:

    合并创建了一个合并提交,它可以清楚地看到历史在哪里发散(分支在哪里创建)以及它在哪里再次合并。这很好,因为您可以跟踪确切的发展。但它也可能变得混乱,特别是如果您有多个并发分支行,则最终会合并多次

    另一方面,重定基调使历史变得平淡。它“伪造”了我的记忆