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
中尚未包含此提交数。
如果程序涉及未决更改(如拉取请求或合并请求),则被包含与被推送是不同的。这些命令可以确定本地分支的提交是否已合并到(包含在)其远程副本中。
我看过很多关于如何显示尚未提交的所有本地分支的所有本地提交的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
中尚未包含此提交数。
如果程序涉及未决更改(如拉取请求或合并请求),则被包含与被推送是不同的。这些命令可以确定本地分支的提交是否已合并到(包含在)其远程副本中。