合并后分支比原点领先多个提交

Par*_*Sal 4 git git-merge git-branch

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

    X--X [origin/master, master]
.../ 
   \         
    ----X--X--X--X--X--X [origin/x, x]
Run Code Online (Sandbox Code Playgroud)

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

       [origin/master]
    X--X------------------X [master]
.../                     /
   \                    /
    ----X--X--X--X--X--X [origin/x, x]
Run Code Online (Sandbox Code Playgroud)

现在当git status我得到:

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

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

mat*_*att 5

其他 6 个提交用于分支 x

啊哈,那正是你错的地方。请记住,Git 中的分支不是提交链,正如您所想的那样。这是一次提交。通过沿着父链向后走,其他一切都只是可以从一次提交中到达的提交。

嗯,一个合并提交,比如你刚刚创建的,有两个父级,其中一个是刚刚合并的分支提交。所以合并后,以前只能xmaster()访问的所有提交现在也可以从(因为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
Run Code Online (Sandbox Code Playgroud)

Git 不关心导致这种情况的拓扑结构;它只是报告一个数字。

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

  • 我并没有说 Git 的消息措辞特别优美。相反,Git 在与您交谈时使用的许多名称和术语都具有误导性。我从来不喜欢“前面”和“后面”。(事实上​​,我不喜欢`git status`的说话方式。)不过,我试图向你展示“ahead”确实有一定的意义:`master`确实达到了`origin/的7次提交。 master` 还不知道,所以就进度(或大小?)而言,`master` 是“领先”的 7 个提交。 (2认同)