我怎样才能知道有多少 master 中的提交不在我的分支中?

How can I find out how many commits in master are not in my branch?

我们正在使用 GitHub 来存储我们的代码存储库,我们希望所有开发人员在进行本地开发人员测试和合并之前确保分支与 master 保持同步。

有两种方法可以使用 master 的提交更新分支:

  1. 合并 master 到我的分支 feature_branch,然后推送 feature_branch
  2. 将我的分支 feature_branch 重新设置到 master 上,并强制推送 feature_branch

鉴于有问题的团队目前正在使用 1.(合并工作流程),我如何查看:

  1. 远程 master 分支中的 提交数 ,但不在远程 feature_branch.
  2. 如果 1 中的数字大于 0,则为真值,否则为假。

最好有与 GitHub 集成的东西来执行此操作,但我也想知道如何从命令行执行此操作。

我知道我可以做 git diff master..feature_branch,但这实际上给了我所有的更改(并且是针对本地分支机构的)。我只想知道前后提交的数量,其方式与本地 master 和远程 master

之间显示的方式相同

而不是diff

git diff master..feature

使用log

git log master..feature

请参阅 this answer 以获得很好的解释。

因此,如果您只想要计数,请使用 --oneline 并将其通过管道传输到字数统计行。

git log --oneline master..feature | wc -l

is fine, and you should follow his link to this other answer 还有。但你想要的实际上直接内置于 Git:

git rev-list --count master..feature

和:

git rev-list --count feature..master

您可能希望将其组合成非常短的别名或脚本:

echo feature is $(git rev-list --count master..feature) commits ahead of master
echo and $(git rev-list --count feature..master) commits behind master

事实上,这正是 git statusgit branch -vv 所做的,尽管它们也会先检查零提交或落后。

这是一个简短的(对我来说非常简短:-))的解释。

Git的logrev-list几乎是同一个命令

git loggit rev-list 都查看整个提交范围。最重要的区别是 git log 向您显示 日志消息 (以及可选的补丁),而 git rev-list 默认情况下仅向您显示原始提交哈希。

然而,你可以让 git rev-list 给你一个 count 多少 提交它会列出,而不是他们的原始哈希 ID。而且,正如您将在 that other answer 上的漂亮图表中看到的那样,stop..start 双点语法( 除了 git diff 很特别1) 告诉 Git "give me all the commits you can find starting from start, excluding all the commits you can find starting from stop".

如果您找到 feature 上的所有提交,然后删除 两个 分支上的所有提交,您只剩下提交在 feature 上仅 。然后你有 git rev-list count 个。这些是您 "ahead" 的提交,所以这就是您的领先程度。

(让 git log 记录它们,每个记录在一行上,然后让 wc 来计算行数,当然也可以。)

颠倒两个名称,使用 feature..master,Git 找到 master 上的提交,然后删除两个分支上的提交。这些就是你 "behind".

git rev-list 的输出很少对人类有用,主要用于脚本。事实上,这正是我在上面建议的:两行脚本(或者甚至只有一行,但在我这里的屏幕上不太合适)。

这里有一个思考问题:我们如何知道使用名称 masterfeature?我们如何指示 Git 知道这些?但是让我们稍后再说。


1这里的问题是 git diff 迫切希望 最多与 两个 提交。带有两个和三个点的范围符号 master..featuremaster...feature,通常会产生一长串提交。 Git 的 diff 无论如何都无法处理这些。它 可以 只是拒绝采用这些符号——这本来是非常合理的,真的——但是相反,Git 作者决定他们将重新使用这些符号来表示某些东西相关。

这意味着无论您在使用 master..featuregit diff 时学到了什么,在处理其他 Git 命令时都必须忘记它。 sic transit gloria Git.