我已经看到很多关于如何显示所有尚未提交的本地分支的所有本地提交的帖子/答案。
我有一个狭窄的用例,还没有找到答案。
我需要从 bash 脚本中确定我的 CURRENT 分支是否有尚未被上游推送到同一分支的提交。计数就可以了,但我真的只需要知道是否还没有完成推送。我不关心除了当前分支之外的任何分支,在这种情况下,我已经检查了分支是否是本地的(即尚未设置上游来源)。
主要是,我不想打印出提交,我只想知道未推送的提交数> 0。
当前分支的上游是@{u}
. @
是 的同义词HEAD
。
@..@{u}
选择上游的提交,但不是本地的。如果有任何你落后。我们可以用 来计算它们git rev-list
。
# Move 4 commits behind upstream.
$ git reset --hard @{u}^^^
$ git rev-list @..@{u} --count
4
@{u}..@
相反。它选择本地但不是上游的提交。
# Move to upstream
$ git reset --hard @{u}
# Add a commit
$ git commit --allow-empty -m 'test'
[main 6dcf66bda1] test
$ git rev-list @{u}..@ --count
1
如果两者都是 0,那么你就是最新的。
注意:这只会是您上次获取时的“最新”。是否要将其与 fetch 结合起来取决于您,但应该习惯 Git 不定期与网络通信这一事实。
(我借用了ElpieKay 的回答)。
请参阅gitrevisions了解更多关于@
,..
以及选择修订的多种方法。
假设分支是foo
。
git fetch origin foo
git rev-list FETCH_HEAD..foo --count
第一个命令获取foo
远程存储库中的最新头,并将其提交 sha1 存储在FETCH_HEAD
.
git rev-list
返回一个数字。如果为 0,foo
则本地存储库中的所有提交都已包含在foo
远程存储库的分支中。如果它大于 0,那么这个数量的提交还没有包含在远程中foo
。
如果过程涉及诸如拉取请求或合并请求之类的未决更改,则被包含与被推送不同。这些命令可以确定本地分支的提交是否已合并到(包含在)其远程副本中。
你正在寻找git status
. 它会给你这样的输出:
On branch main
Your branch is ahead of 'origin/main' by 1 commit.
(use "git push" to publish your local commits)
nothing to commit, working tree clean
你可以grep
为此:
git status | grep -E "Your branch is ahead of '.*' by ([0-9]*) commit."