代码之家  ›  专栏  ›  技术社区  ›  SilentDev

人们对git说“祖先”是什么意思?

git
  •  3
  • SilentDev  · 技术社区  · 7 年前

    我看过很多关于它的讨论,但当我搜索它的意思时,我找不到它。什么是祖先?

    我猜分支x的祖先是分支的任何父母、祖父母、祖父母等?

    所以如果分支x从主分支分支,分支y从x分支,分支z从y分支,那么z的祖先是y,x和主分支?只是猜测一下。

    1 回复  |  直到 7 年前
        1
  •  5
  •   VonC    7 年前

    introduced in April 2005 one month later


    commit f76412e


    (n+1)th head_rev

    August 2005

    <name> <num> ^
    master~4 master master^^^^


    clarified in 2007

    reachable:
    

    distance between two commits

    count_distance()

        2
  •  3
  •   torek    7 年前

    VonC has said

    ... <-F <-G <-H   <-- master
    

    master H

            D--E
           /    \
    A--B--C      H--I--J   <-- master
           \    /
            F--G--K---L   <-- develop
    

    A B C E G

    L K F J

    develop D I 在主人身上。所有其他提交都已启动 两个分支 .这就是问题所在 可达性 VonC所描述的概念。

    从数学上讲,在DAG中,我们定义 前任 继承人 观念。对于前置或前置,我们使用弯曲小于–‰º符号:A–‰ºB,如果可以从A到B。我们使用弯曲大于–‰º(“后续”或“成功”)符号表示相反。这些定义了 partial order 在图中的节点上。当然,一个节点等于它自己,我们可以说,给定一个节点,a=a,但也有a和a。

    由于Git是反向工作的,所以情况正好相反:如果可以从B转到A,那么A就是B的前身!为了避免大家太困惑,Git使用 是祖先吗 而不是 先于 .一般来说,Git还定义 是祖先吗 如果将一个节点与自身进行比较,则为true,这样所有节点都是它们自己的祖先。

    因为Git的内部箭头只能向后工作,所以Git不提供 是后代吗 操作人员你必须扭转局面 是祖先吗 测试(但见下文)。如果你想知道“节点X是节点Y的后代吗”,你可以先问“Y是X的祖先吗?”。记住,如果两个哈希ID匹配,祖先会说“是”!

    自Git版本1.8.0以来,测试提交是否由哈希标识的简单方法 $H1 $H2 与此有关的祖先概念是:

    if git merge-base --is-ancestor $H1 $H2; then
        echo commit $H1 is an ancestor of $H2
    else
        echo commit $H1 is not an ancestor of $H2
    fi
    

    请注意,因为只定义了 部分的 命令,事实上 H1美元 祖先 H2美元 这并不意味着 那个 H2美元 必然是人类的祖先 H1美元 .例如,在我们上面的示例中 J L 他们只是兄弟姐妹: J 不是孩子的父母 L 但是 L 不是孩子的父母 J 任何一个这意味着,如果is祖先说“是”,你就完成了,但如果它说“否”,你仍然需要测试相反的情况,以决定“是后代”和“是兄弟姐妹”。

    你也可以 不相交子图 在存储库中。这里至少有两个根和两个分支提示,但节点之间没有连接:

    A--B--C   <-- branch1
    
    D--E--F   <-- branch2
    

    任何顶层行提交和任何底层行提交之间都没有关系。然而,如果我们加上 合并 ,这让他们 成为 从某种意义上说,相关的:

    A--B--C
           \
            G   <-- branch1
           /
    D--E--F   <-- branch2
    

    现在提交 A-B-C D-E-F 是“婚姻关系”,可以说,是在 G 因为现在我们可以从 G 然后倒向任何一个方向 A. D 也不 A. 也没有 D 是彼此的祖先,但都是 G .