问题描述
我看过很多关于如何显示所有未提交的本地分支的本地提交的帖子/答案。
我的用例范围很窄,还没有找到答案。
我需要从 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's answer那里借来的)。
有关 @
、..
和多种选择修订的方法的更多信息,请参阅 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."