【问题标题】:Check if a git branch is ahead of another using a script使用脚本检查 git 分支是否在另一个之前
【发布时间】:2018-12-30 17:06:25
【问题描述】:

我有branch1branch2,我想要一些:

git branch1 isahead branch2

这将显示branch1 是否有branch2 没有的提交(也可能指定这些提交)。我无法检查差异,因为 branch2 isbranch1 之前(有 branch1 没有的提交)。

有办法吗?我浏览了git diff 并找不到任何东西

【问题讨论】:

  • 我认为“领先”或“落后”一词仅适用于将本地分支与远程分支进行比较。我不确定使用比较两个分支这一术语是否有意义,因为它们可能具有完全不同的历史。

标签: linux git scripting git-branch


【解决方案1】:

你可以使用

git log branch2..branch1

如果branch1branch2 之前没有提交,则输出将为空。

你也可以使用git rev-list --count branch2..branch1

这将显示前面的提交次数

Source

【讨论】:

  • 两者都很棒 - 第二个更适合脚本。谢谢!
  • --right-only(或任何相关选项)仅对三点对称差分语法有用。在这里,它没有任何作用,可以简单地省略。
  • 感谢torek,我根据您的评论编辑了答案;)
【解决方案2】:

matthiasbe's answer 适用于多种用途,但对于脚本,只要您的 Git 不是太古老,1,您通常会希望使用:

if git merge-base --is-ancestor commit-specifier-1 commit-specifier-2; then
    # commit specifier #1 is an ancestor of commit specifier 2
else
    # commit specifier #1 is NOT an ancestor of commit specifier 2
fi

作为测试。这是因为git merge-base --is-ancestor 将结果编码为其退出状态,因此您不必运行单独的测试来比较数字。

请注意,一个分支尖端可能同时在 在另一个之前:

$ git rev-list --left-right --count stash-exp...master
1       6473

这里,没有一个指定的提交是另一个的祖先。但是,鉴于这些其他说明符:

$ git rev-list --left-right --count master...origin/master
0       103

我们看到这里的master 严格在origin/master 后面,所以:

$ git merge-base --is-ancestor master origin/master && echo can fast-forward
can fast-forward

这与您从git rev-list --count origin/master..master 中看到零计数得到的答案相同:

$ git rev-list --count origin/master..master
0

1git merge-base --is-ancestor 在 Git 版本 1.8.0 中引入。一些系统仍在使用 Git 1.7...

【讨论】:

    【解决方案3】:

    你已经得到了答案。所以我再补充一点。

    git cherry 命令可用于执行此操作。

    git cherry branch1 branch2
    

    这将列出branch2 中的提交,而不是branch1 中的提交。如果需要,您可以使用 -v 标志使其打印提交消息以及哈希。

    git cherry -v branch1 branch2
    

    https://git-scm.com/docs/git-cherry

    希望对你有帮助:)

    【讨论】:

      猜你喜欢
      • 2019-06-17
      • 2015-12-11
      • 2017-02-21
      • 1970-01-01
      • 1970-01-01
      • 2011-01-03
      • 1970-01-01
      • 1970-01-01
      • 2017-08-06
      相关资源
      最近更新 更多