git在master和branch之间的信息之前/之后?


201

我已在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
    

    但我想知道如果有一个办法看到前面后面分别提交。IE:有没有一种方法可以显示出1个自己在前面提交,然后那2个自己在后面提交



1
Git 2.5+(2015年第二季度)将推出git for-each-ref --format="%(push:track)" refs/heads。请在下面
VonC

1
因为我无法使用我要编写的关键字来查找此问题,所以我只想指出,这等于对构成那些分支(和分支的提交集之间进行相对补码(或“集差”)。然后计算元素)。希望这使它成为搜索引擎索引。
pmos

Answers:


309

这是我发现比较两个分支并显示每个分支领先另一个分支的提交数量的技巧(对问题1的更一般性回答):

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

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

这样给出的输出如下:

1 7

此输出的意思是:“与相比mastertest-branch提前7次提交,落后1次提交。”

您还可以将本地分支与远程分支进行比较,例如origin/master...master,找出本地master分支在其远程对等之前/之后的提交次数。


1
对于我来说,这是一个很好的解决方案,可以确定我是否可以删除分支或该分支是否仍在开发之前。
Maverick1st

1
@ Maverick1st,是的,当您遵循gitflow工作流程(我是)时,此命令特别有用
user1834095 2015年

2
对于我的用例来说,这是最好的选择,git rev-list --left-right --count origin/master...@前提是您当前的功能分支是否位于远程主机()的后面-如果用户git fetch之前这样做过;防止过时分支的拉取请求很有用。
jakub.g,

9
要检查当前分支背后的提交数量,请执行以下操作:git rev-list --left-right --count origin/master...@ | cut -f1
jakub.g

8
@ jakub.g,如果您使用--left-only或,则无需剪切--right-only
jasonkarns

39

首先,要查看您在本地留下了多少修订,您应该执行一次操作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]

实际上,我将其别名为simple git s,这是我用来检查状态的主要命令。

要查看的“修订版”中的差异master,我可以从origin/master以下内容中排除“修订版” :

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 status,也不符合git status -sb。如果我尝试执行任何一个命令(执行完之后git fetch),都不会获得有关向前/向后提交的任何信息。
加百利

8
用自己的方式看到前方和后方提交应用到masterorigin/master我希望看到把这些差异对于master和另一个分支test-branch。您能否重新格式化您的答案以解决这个问题?
加百利

如果在分支名称之间使用3个点(而不是2个),则“ behind”和“ ahead”修订版中的差异仅对我有用。和^和^^在这里似乎无关紧要,例如:git diff master ... origin / master git diff origin / master ... master无论如何,“ git status -sb”非常有用。
Vituel 2014年

10

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

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

在“ 查看未推动的Git提交 ”中查看更多信息


您可以仅对当前分支及其远程跟踪分支执行此操作吗?
spex

@spex是:完成refs/heads与当前分支的名称(stackoverflow.com/a/12142066/6309):refs/heads/$(git rev-parse --abbrev-ref HEAD)
VonC

3

您还可以使用awk它来使其更漂亮:

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

您甚至可以创建一个别名,该别名始终先获取原始数据,然后比较分支

commit-diff = !"git fetch &> /dev/null && git rev-list --left-right --count"

1

完成git fetch之后,您可以运行git status来显示本地分支在分支的远程版本之前或之后的提交数量。

但是,这不会向您显示在不同分支之前或之后的提交数量。您的选择是完整的差异,查看github,或使用上面链接的Vimhsa之类的解决方案:所有回购协议的Git状态

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.