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

问题描述

我看过很多关于如何显示所有未提交的本地分支的本地提交的帖子/答案。

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

我需要从 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."