【问题标题】:Branch is ahead of origin by more than one commit after merge合并后分支在原点之前超过一次提交
【发布时间】:2021-08-12 11:17:31
【问题描述】:

我有两个看起来像这样的分支:

    X--X [origin/master, master]
.../ 
   \         
    ----X--X--X--X--X--X [origin/x, x]

然后我将x 合并到master 所以现在我有了这个:

       [origin/master]
    X--X------------------X [master]
.../                     /
   \                    /
    ----X--X--X--X--X--X [origin/x, x]

现在当我git status 我得到:

On branch master
Your branch is ahead of 'origin/master' by 7 commits.
  (use "git push" ...)
...

为什么是 7 次提交?从图片(我在git log --graph 画的)看来,它应该领先 1 次提交。其他 6 个提交用于分支 x

【问题讨论】:

    标签: git git-merge git-branch


    【解决方案1】:

    其他 6 个提交用于分支 x

    啊哈,这就是你错的地方。 ? 请记住,Git 中的一个分支不是一个提交链,正如你所想的那样。这是一个提交。通过沿着父链向后走,其他所有内容都只是从该一次提交可访问的提交。

    嗯,一个合并提交,比如你刚刚创建的,有 两个 父级,其中一个是刚刚合并的分支提交。所以在合并之后,所有提交以前只能从 x 访问,现在也可以从 master 访问(因为 x 现在是 master 的父级之一,即合并提交)。

    所以,Git 在这里所做的就是计算现在有多少从 master 可访问而从 origin/master 不可访问的提交,如下所示:

           [origin/master]    7
        X--X------------------X [master]
    .../                     /
       \                    /
        ----X--X--X--X--X--X [origin/x, x]
            1  2  3  4  5  6
    

    Git 不关心造成这种情况的拓扑;它只是报告一个数字。

    所以 Git 报告的数字可能看起来不直观,但实际上它是完全准确的。这是一个有用的数字! Git 正确地报告说,如果您现在要推送,导致 origin/master 向上移动到 masterorigin/master 将能够达到它目前无法达到的 7 个提交,并且远程存储库将获得 7 个提交目前没有。

    【讨论】:

    • 这是有原因的吗?因为正如你提到的,这是不直观的。 Ahead 就是前面,遥不可及!
    • 我并没有说 Git 的消息措辞特别优美。相反,Git 在与您交谈时使用的许多名称和术语具有误导性。我从不喜欢“前面”和“后面”。 (事实上​​,我对git status 说话的方式任何东西 都不喜欢。)不过,我试图向您展示“领先”确实有一定的意义:master 确实达到了origin/master 尚不知道的 7 个提交,因此就进度(或大小?)而言,master 是 7 个“提前”提交。
    • @ParSal 如果你的思想停留在线性历史中,那么行为可能是“不直观的”,但是一旦你熟悉了分支和合并历史,你就会欣赏 Git 计算提交的方式.
    猜你喜欢
    • 2012-08-31
    • 2015-04-16
    • 1970-01-01
    • 1970-01-01
    • 2012-03-02
    • 2021-10-13
    • 2019-09-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多