主分支和分支之间的git ahead/behind信息是什么?

302

我在我的本地代码库中创建了一个用于测试的分支(test-branch),并将其推送到了Github

如果我转到我的Github帐户并选择此test-branch,则会显示以下信息:

This branch is 1 commit ahead and 2 commits behind master

我的问题:

  1. 如何在本地显示这些信息(比如使用命令在终端上显示,而不是必须打开 Github 查看)?
  2. 我知道可以使用以下命令查看分支之间的差异:

    git diff master..test-branch
    

    或者使用 Meld (这是我喜欢的):

    git difftool master..test-branch
    

    但我想知道是否有一种方法可以分别查看和提交。即:是否有一种方法可以仅显示<1 commit ahead>,然后再单独显示那些<2 commits behind>?


https://dev59.com/U3fZa4cB1Zd3GeqPTJFs - usha
2
Git 2.5+(2015年第二季度)将引入git for-each-ref --format="%(push:track)" refs/heads。请参见下面的答案 - VonC
2
因为我无法使用即将写入的关键字找到这个问题,所以我想指出这相当于取这些分支所组成的提交集合之间的相对补集(或“集合差”),然后计算元素数量。希望这能被搜索引擎索引到。 - smheidrich
非常有帮助!为了在搜索引擎中找到它,我会添加一个例子,其中两个数字都是复数:这个分支比主分支超前164次提交,落后85次提交。 - nealmcb
6个回答

454

第一部分

针对你的第一个问题的回答,这里有一个小技巧可以比较两个分支并显示每个分支相对另一个分支超前的提交数(关于你的第一个问题的更普遍的回答):

对于本地分支: git rev-list --left-right --count master...test-branch

对于远程分支: git rev-list --left-right --count origin/master...origin/test-branch

这会给出如下输出:

2 1

这个输出意味着: "相对于 master, test-branch 超前了1次提交且落后了2次提交."

你也可以比较本地分支和远程分支,例如origin/master...master来查找本地分支(这里是master)比其远程对应分支超前/落后了多少次提交.

第二部分

要回答你问题的第二部分,解决方案取决于你想要实现什么目标.

查看提交

为了让git rev-list返回完全独特于另一侧的提交列表,请用类似--pretty=oneline的参数替换--count参数,使得完整的执行命令如下:

git rev-list --left-right --pretty=oneline master...test-branch

这将生成如下输出:

<bba27b56ad7072e281d529d4845e4edf877eb7d7 unique commit 2 on master
<dad0b69ec50ea57b076bfecabf2cc7c8a652bb6f unique commit 1 on master
>4bfad52fbcf0e60d78d06661d5c06b59c98ac8fd unique commit 1 on test-branch

这里每个提交的 sha 值前面都有 < 或者 >,用以表示它所在的分支(左边或右边,这里分别为 mastertest-branch)。

查看代码

如果你想要查看仅存在于其中一个分支上的所有新提交差异,你需要进行以下两个步骤:

  1. 定义最近的共同祖先
$ git merge-base master test-branch
c22faff7468d6d5caef217ac6b82f3ed95e9d902
  1. 对比任意一个分支与上面获取到的提交SHA(短格式通常就可以)

展示仅存在于主分支的所有提交的差异

git diff c22faff7..master

仅显示所有提交在test-branch中的差异

git diff c22faff7..test-branch

2
这对我来说是一个很好的解决方案,可以找出我是否可以删除一个分支,或者它是否仍然领先于develop分支。 - Maverick1st
1
@Maverick1st,是的,当你遵循gitflow工作流程(我正在遵循)时,这个命令特别有用。 - user1834095
3
这是我用来查找当前特性分支是否落后于远程主分支的最佳方法(git rev-list --left-right --count origin/master...@) - 前提是用户在使用前执行了git fetch; 这对于防止拉取请求从过时的分支中进行非常有用。 - jakub.g
12
为了检查当前分支落后于多少次提交: git rev-list --left-right --count origin/master...@ | cut -f1 - jakub.g
14
如果使用 --left-only--right-only,就不需要删减了。 - jasonkarns
显示剩余2条评论

63

首先,为了查看本地落后多少个版本,您应该执行 git fetch 确保您从远程获取了最新信息。

git status 的默认输出会告诉您自己领先或者落后了多少个版本,但通常我认为这太冗长了:

$ git status
# On branch master
# Your branch and 'origin/master' have diverged,
# and have 2 and 1 different commit each, respectively.
#
nothing to commit (working directory clean)

我更喜欢使用git status -sb命令:

$ git status -sb
## master...origin/master [ahead 2, behind 1]

事实上,我将其简单地别名为git s,这是我用于检查状态的主要命令。

为了查看master中“ahead revisions”的差异,我可以从origin/master中排除“behind revisions”:

git diff master..origin/master^

要查看 origin/master 的“落后版本”差异,可以从 master 中排除“前进版本”:

git diff origin/master..master^^

如果有5个版本需要更新或回滚,可以这样编写代码:

git diff master..origin/master~5
git diff origin/master..master~5

更新

要查看前后修改的版本,分支必须配置为跟踪另一个分支。对于我来说,这是克隆远程仓库时的默认行为,在使用git push -u remotename branchname 命令推送分支之后。我的版本是1.8.4.3,但我记得它一直以来都是这样工作的。

从版本1.8开始,您可以像这样设置跟踪分支:

git branch --track test-branch

从1.7版本开始,语法有所不同:

git branch --set-upstream test-branch

你使用的是哪个版本的 git?我无法通过 git statusgit status -sb 重现你得到的结果。如果我尝试任何一个命令(在执行 git fetch 后),我都无法获得有关提交超前/滞后的任何信息。 - Gabriel
9
你查看提交的前后差异方式适用于 masterorigin/master,我想查看 master 和另一个分支 test-branch 的差异。请重新格式化你的答案以解决这个问题。 - Gabriel
如果我在分支名称之间使用3个点(而不是2个点),则"behind"和"ahead"版本之间的差异对我有效。 而且,这里似乎没有关系符号^和^^的影响。例如: git diff master...origin/master git diff origin/master...master无论如何,“git status -sb”都非常有用。 - Victor Basso

15

通过 Git 2.5+,你现在有另一个选项可以查看所有配置为推送到分支的分支的前后状态。

git for-each-ref --format="%(push:track)" refs/heads

请查看 "查看未推送的Git提交",例如,它说明了您可能想要知道哪些提交尚未推送:

git log @{push}..

你能只针对当前分支及其远程跟踪分支执行此操作吗? - spex
1
@spex 是的:使用当前分支的名称完整填写 refs/heads(https://dev59.com/Hm025IYBdhLWcg3wCxZN#12142066):`refs/heads/$(git rev-parse --abbrev-ref HEAD)`。 - VonC
1
@RickyLevi 很好的建议,我已经编辑了答案以使该选项更加明显。 - VonC

6
要获取当前功能分支比主分支超前的提交数,您可以使用以下命令:
git rev-list --left-right --count master...$(git branch --show-current)

4

你也可以使用awk来使它更加美观:

git rev-list --left-right --count  origin/develop...feature-branch | awk '{print "Behind "$1" - Ahead "$2""}'


你甚至可以创建一个别名,首先获取 origin 内容,然后再比较分支。
commit-diff = !"git fetch &> /dev/null && git rev-list --left-right --count"

1
在执行git fetch后,您可以运行git status来显示本地分支相对于远程版本的分支超前或落后多少次提交。
但是,这不会向您显示它比另一个分支超前或落后多少次提交。您可以选择完整的差异、查看github或使用像Vimhsa上面链接的解决方案:Git状态在所有仓库中

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接