master和分支之间的进度信息?

我已经在我的本地repo (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
    

    但我想知道是否有一种方法可以分别看到之前后面提交。即:是否有一种方法可以单独显示提前做出承诺,然后单独显示那些2次提交 ?< / p >

154083 次浏览

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

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

首先,要查看你在本地落后了多少个修订,你应该执行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的“前修订”中的差异,我可以从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 rev-list --left-right --count master...test-branch < / p > 对于远程分支: git rev-list --left-right --count origin/master...origin/test-branch < / p >

输出如下所示:

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

在这里,每个commit sha之前都有<>来表示它可以在哪个分支上找到(左边或右边,分别是mastertest-branch)。

查看代码

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

  1. 定义最近的公共祖先
$ git merge-base master test-branch
c22faff7468d6d5caef217ac6b82f3ed95e9d902
  1. 将任何一个分支与上面获得的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)