Git - 以编程方式确定是否未推送本地提交

Git - Programatically determine if local commits have not been pushed

我看过很多关于如何显示尚未提交的所有本地分支的所有本地提交的posts/answers。

我的用例范围很窄,还没有找到答案。

我需要从 bash 脚本中确定我的 CURRENT 分支是否有尚未向上游推送到同一分支的提交。计数会很好,但我真的只需要知道推送是否尚未完成。我不关心除当前分支之外的任何分支,在这种情况下我已经检查过分支是否是本地的(即尚未设置上游来源)。

主要是,我不想打印出提交,我只想知道未推送的提交数> 0。

您正在寻找 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."

当前分支的上游是@{u}@HEAD 的同义词。

@..@{u} selects 提交是上游的,但不是本地的。如果有的话,你落后了。我们可以用 git rev-list.

来计算它们
# Move 4 commits behind upstream.
$ git reset --hard @{u}^^^

$ git rev-list @..@{u} --count
4

@{u}..@ 则相反。它 selects 提交是本地的而不是上游的。

# 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,则表示您是最新的。

注意:这只会是您上次获取时的“最新”。是否要将其与获取结合起来取决于您,但是应该习惯 Git 不定期与网络通信这一事实。

(我从那里借来的)。

有关 @.. 以及 select 修订的许多方法,请参阅 gitrevisions

假设分支是foo

git fetch origin foo
git rev-list FETCH_HEAD..foo --count

第一个命令获取远程存储库中 foo 的最新头部并将其提交 sha1 存储在 FETCH_HEAD.

git rev-list returns 一个数字。如果为 0,则本地存储库中 foo 的所有提交都已包含在远程存储库中的 foo 分支中。如果它大于 0,则远程 foo 中尚未包含此提交数。

如果程序涉及未决更改(如拉取请求或合并请求),则被包含与被推送是不同的。这些命令可以确定本地分支的提交是否已合并到(包含在)其远程副本中。