我已经在我的本地repo (test-branch)中创建了一个用于测试的分支,我将其推送到Github。

如果我去我的Github账户,选择这个测试分支,它会显示信息:

This branch is 1 commit ahead and 2 commits behind master

我的问题是:

我如何在本地显示这些信息(即:在终端上显示此命令,而不是必须打开Github才能看到它)? 我知道我可以看到分支之间的区别使用: Git diff master..test-branch 或者使用Meld(我更喜欢): Git difftool master..test-branch 但我想知道是否有一种方法可以分别看到前提交和后提交。也就是说:有没有一种方法可以显示1个先提交,然后2个后提交?


在获取git之后,你可以运行git status来显示本地分支领先或落后于远程分支的提交数。

但是,这不会显示它在不同分支的前面或后面提交了多少次。你的选择是完全不同的,看github,或使用像Vimhsa上面链接的解决方案:Git状态所有的回购


首先,为了查看你在本地落后了多少个修订,你应该进行git获取,以确保你从远程获得了最新的信息。

git状态的默认输出会告诉你你已经完成了多少个修订,但通常我觉得这太啰嗦了:

$ 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状态

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

事实上,我将其别名为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

第1部分

为了回答你的问题1,这里有一个我发现的比较两个分支并显示每个分支比另一个分支多提交多少的技巧(对你的问题1的更一般的回答):

本地分支机构: Git revlist -left-right -count master - test-branch

对于远程分支: Git rev-list -left-right -count origin/master

输出如下所示:

2 1

这个输出意味着:“与master相比,test-branch提前1次提交,向后2次提交。”

你也可以比较本地分支和远程分支,例如origin/master…Master来找出一个本地分支(这里是Master)领先/落后于远程分支的提交数。

第2部分

要回答你问题的第二部分,解决方案取决于你到底想要实现什么。

查看提交

为了让git rev-list返回两边唯一的提交列表,将——count参数替换为类似于——pretty=oneline的参数,使完整的命令执行:

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之前都有<或>来表示它可以在哪个分支上找到(左边或右边,分别是master或test-branch)。

查看代码

如果你想查看只在两个分支上发现的所有新提交的差异,你需要分两步完成:

定义最近的公共祖先

$ git merge-base master test-branch
c22faff7468d6d5caef217ac6b82f3ed95e9d902

将任何一个分支与上面获得的commit sha区别对待(通常是短格式)

显示仅在master上找到的所有提交的差异

git diff c22faff7..master

以显示仅找到test-branch的所有提交的差异

git diff c22faff7..test-branch

在Git 2.5+中,你现在有了另一个选项,可以查看所有被配置为推送到某个分支的分支的前面/后面。

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

详见“查看未推送Git提交”


你也可以使用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"

你可以使用下面的命令来获取当前特性分支的提交数:

git rev-list --left-right --count master...$(git branch --show-current)