【问题标题】:git ahead/behind info between master and branch?主和分支之间的 git 前/后信息?
【发布时间】:2013-12-24 09:25:30
【问题描述】:

我在本地仓库 (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
    

    但我想知道是否有办法分别查看 aheadbehind 提交。 IE:有没有办法显示 1 次提交 本身,然后那些 2 次提交后 自己?

【问题讨论】:

  • Git 2.5+(2015 年第二季度)将引入git for-each-ref --format="%(push:track)" refs/heads。见my answer below
  • 因为我无法使用我要写的关键字找到这个问题,所以我只想指出,这相当于在构成这些分支的提交集之间使用 relative complement (or "set difference") (然后计算元素)。希望这能成为搜索引擎索引。
  • 非常有帮助!为了帮助通过搜索引擎找到这个,我将添加一个两个数字都是复数的示例:This branch is 164 commits ahead, 85 commits behind master.

标签: git github


【解决方案1】:

第 1 部分

作为对问题 1 的回答,我发现了一个技巧来比较两个分支并显示每个分支领先于另一个分支的提交次数(对问题 1 的更一般的回答):

对于本地分支: 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)在其远程分支之前/之后有多少次提交。

第 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 前面都有 &lt;&gt; 以指示可以在哪个分支上找到它(左或右,这里分别为 mastertest-branch)。

查看代码

如果您想查看仅在任一分支上找到的所有新提交的差异,您需要分两步执行此操作:

  1. 定义最近的共同祖先
$ git merge-base master test-branch
c22faff7468d6d5caef217ac6b82f3ed95e9d902
  1. diff 任一分支到上面获得的提交 sha(通常可以使用短格式)

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

git diff c22faff7..master

为了显示所有提交的差异,只找到测试分支

git diff c22faff7..test-branch

【讨论】:

  • 这是一个很好的解决方案,让我知道我是否可以删除一个分支,或者它是否仍然领先于开发。
  • @Maverick1st,是的,这个命令在你关注gitflow workflow(我就是)时特别有用
  • 这对于我的用例来说是最好的,它可以查找您当前的功能分支是否位于远程主控 (git rev-list --left-right --count origin/master...@) 之后——前提是用户之前执行过git fetch;有助于防止来自过时分支的拉取请求。
  • 检查 behind 有多少提交是当前分支:git rev-list --left-right --count origin/master...@ | cut -f1
  • @jakub.g 如果您使用--left-only--right-only,则无需剪切
【解决方案2】:

首先要查看您在本地落后了多少修订版,您应该发送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

【讨论】:

  • 您使用的是哪个版本的git?我无法重现您使用git statusgit status -sb 获得的内容。如果我尝试任何一个命令(在执行git fetch 之后),我不会得到任何关于提交之前/之后的信息。
  • 您查看前后提交的方式适用于masterorigin/master,我想查看master 和另一个分支test-branch 的差异。你能重新格式化你的答案来解决这个问题吗?
  • 只有当我在分支名称之间使用 3 个点(而不是 2 个)时,“后面”和“前面”版本中的差异才对我有用。 ^ 和 ^^ 在这里似乎并不重要 例如: git diff master...origin/master git diff origin/master...master 无论如何,“git status -sb”非常有用。
【解决方案3】:

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

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

在“Viewing Unpushed Git Commits”查看更多信息

【讨论】:

  • 您能只对当前分支及其远程跟踪分支执行此操作吗?
  • @spex 是:用当前分支的名称完成refs/heads (stackoverflow.com/a/12142066/6309):refs/heads/$(git rev-parse --abbrev-ref HEAD)
【解决方案4】:

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

【讨论】:

    【解决方案5】:

    要获取当前功能分支的提交数量在 master 之前,您可以使用以下命令:

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

    【讨论】:

      【解决方案6】:

      执行 git fetch 后,您可以运行 git status 来显示本地分支的提交次数比远程版本的分支领先或落后。

      这不会显示它在不同分支之前或之后的提交次数。您的选择是完整的差异,查看 github,或使用上面链接的 Vimhsa 之类的解决方案:Git status over all repo's

      【讨论】:

        猜你喜欢
        • 2014-01-15
        • 2018-09-25
        • 1970-01-01
        • 2012-03-03
        • 1970-01-01
        • 2020-11-05
        • 2015-10-06
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多