git ahead/behind info between master and branch?
我创建了一个分支来测试我的本地repo(test-branch),我把它推到Github上。
如果我转到我的Github帐户并选择这个test-branch,它将显示以下信息:
1
| This branch is 1 commit ahead and 2 commits behind master |
我的问题是:
如何在本地显示此信息(即:在终端上显示此信息的命令,而不是必须打开Github才能看到此信息)?
我知道我可以通过以下方式看到分支之间的差异:
1
| git diff master..test-branch |
或者使用Meld(我更喜欢):
1
| git difftool master..test-branch |
但是我想知道是否有一种方法可以分别看到前面和后面的承诺。例如:有没有一种方法可以证明1个先承诺自己,然后2个先承诺自己?
- stackoverflow.com/questions/19163803/…
- Git 2.5+(2015年第二季度)将推出git for-each-ref --format="%(push:track)" refs/heads。请看下面我的答案
- 因为我不能用我要写的关键字找到这个问题,我只想注意,这相当于在组成这些分支的提交集之间进行相对补码(或"设置差异")(然后对元素进行计数)。希望这能成为搜索引擎的索引。
下面是我比较两个分支并显示每个分支领先于另一个分支的提交数的一个技巧(关于问题1的更一般的答案):
对于本地分支机构:git rev-list --left-right --count master...test-branch
对于远程分支:git rev-list --left-right --count origin/master...origin/test-branch
这将产生如下输出:
1 7
这个输出意味着:"与master相比,test-branch是提前7次提交,后1次提交。"
您还可以将本地分支与远程分支进行比较,例如origin/master...master以了解本地master分支在其远程对应分支之前/之后有多少提交。
- 对于我来说,这是一个很好的解决方案,可以确定我是否可以删除一个分支,或者它是否还在开发之前。
- @Maverick1st,是的,当您遵循Gitflow工作流(我是)时,此命令特别有用。
- 这对于我查找当前功能分支是否位于远程主服务器(git rev-list --left-right --count origin/master...@)后面的用例是最好的,前提是用户以前执行过git fetch;这对于防止来自过时分支的拉请求很有用。
- 检查当前分支的提交数量:git rev-list --left-right --count origin/master...@ | cut -f1
- @Jakub.g如果你使用--left-only或--right-only,你不需要切割。
首先,要想了解您在本地落后了多少次修改,您应该执行一个git fetch,以确保从远程获得最新的信息。
git status的默认输出告诉您前面或后面有多少修订,但通常我觉得这太冗长了:
1 2 3 4 5 6
| $ 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:
1 2
| $ git status -sb
## master...origin/master [ahead 2, behind 1] |
事实上,我将其简单地命名为git s,这是用于检查状态的主要命令。
为了区分master的"前修订",我可以从origin/master中排除"后修订"。
1
| git diff master..origin/master^ |
为了区分origin/master的"后修订",我可以将master中的"前修订"排除在外:
1
| git diff origin/master..master^^ |
如果前面或后面有5个修订,这样写可能更容易:
1 2
| git diff master..origin/master~5
git diff origin/master..master~5 |
更新
要查看前面/后面的修订,必须将分支配置为跟踪另一个分支。对于我来说,这是克隆远程存储库时的默认行为,在我使用git push -u remotename branchname推送分支之后。我的版本是1.8.4.3,但我记得它一直是这样工作的。
从1.8版开始,您可以这样设置跟踪分支:
1
| git branch --track test-branch |
从1.7版开始,语法不同:
1
| git branch --set-upstream test-branch |
- 您使用的是什么版本的git?我不能复制你从git status或git status -sb中得到的东西。如果我尝试任何一个命令(在执行git fetch之后),我不会得到任何关于提前/延迟提交的信息。
- 你看前面和后面的承诺的方式适用于master和origin/master,我想看看master和另一个分支test-branch的差异。你能重新格式化你的答案来解决这个问题吗?
- @加布里埃尔看我最新的答案
- 只有当我在分支名称之间使用3个点(不是2个)时,"后面"和"前面"修订版中的差异才对我有效。这里的^和^^似乎并不重要,例如:git diff master…origin/master git diff origin/master…master anyway,"git status-sb"非常有用。
对于Git2.5+,您现在有了另一个选项来查看配置为推送到分支的所有分支的前面/后面。
1
| git for-each-ref --format="%(push:track)" refs/heads |
在"查看未提交的git提交"中查看更多信息
- 您可以只为当前分支及其远程跟踪分支执行此操作吗?
- @spex是:用当前分支的名称(stackoverflow.com/a/12142066/6309)完成refs/heads:refs/heads/$(git rev-parse --abbrev-ref HEAD)。
在执行git获取之后,可以运行git status来显示本地分支在远程版本分支之前或之后提交了多少提交。
不过,这不会显示在不同分支前面或后面有多少提交。您的选项是完整的diff,查看github,或者在所有repo上使用类似于vimhsa链接的解决方案:git状态