Git-通过编程确定是否未推送本地提交
我看到了很多关于如何显示所有未提交的本地分支的所有本地提交的帖子/答案 我有一个狭窄的用例,还没有找到答案 我需要从bash脚本中确定当前分支是否有未被推送到同一分支上游的提交。数一数就可以了,但我真的只需要知道是否还没有推过。我不关心除当前分支以外的任何分支,在本例中,我已经检查了分支是否是本地的(即尚未设置上游原点) 主要是,我不想打印提交,我只想知道未推送的提交数量>0。您正在寻找的。它将为您提供如下输出: 分支干管上的Git-通过编程确定是否未推送本地提交,git,push,script,Git,Push,Script,我看到了很多关于如何显示所有未提交的本地分支的所有本地提交的帖子/答案 我有一个狭窄的用例,还没有找到答案 我需要从bash脚本中确定当前分支是否有未被推送到同一分支上游的提交。数一数就可以了,但我真的只需要知道是否还没有推过。我不关心除当前分支以外的任何分支,在本例中,我已经检查了分支是否是本地的(即尚未设置上游原点) 主要是,我不想打印提交,我只想知道未推送的提交数量>0。您正在寻找的。它将为您提供如下输出: 分支干管上的 您的分支比“origin/main”早1个提交。 (使用“git p
您的分支比“origin/main”早1个提交。
(使用“git push”发布本地提交)
没什么要承诺的,正在清理树
您可以通过以下方式实现此目的:
git status | grep-E“通过([0-9]*)提交,您的分支位于“.*”之前。”
当前分支的上游是@{u}
@
是头的同义词
@..@{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不经常与网络通信这一事实
(我从你那儿借的)
有关
@
、。
以及选择修订的多种方法的更多信息,请参阅。假设分支为foo
git fetch origin foo
git rev-list FETCH_HEAD..foo --count
第一个命令获取远程存储库中foo
的最新头部,并将其commit sha1存储在FETCH\u head
中
git rev list
返回一个数字。如果为0,则本地存储库中foo
的所有提交都已包含在远程存储库中的foo
分支中。如果大于0,则远程foo
中尚未包含此数量的提交
如果过程涉及一个挂起的更改,如拉请求或合并请求,则被包含与被推送是不同的。这些命令可以确定本地分支的提交是否已合并到(包含在)远程分支。虽然这对人类来说没什么问题,但是,
git status的格式输出不稳定。
从“git移动[远程跟踪分支](每当您进行任何网络通信时)开始。因此,请确保您最近执行了一个基于网络的命令,如fetch
。我可以看到这如何为本地和远程提供提交标记,但如果它们不匹配,它不会告诉我是在前面还是在后面。@svenyonson如果它们不同,如果git branch--包含@{upstream}
则说明您在后面。否则的话,我们就要走了。(在电话上)(对不起,我错误地接受了上面的错误答案,现已修复)是的,没错。我可能还想知道当地是否需要拉。所以我可以做两个测试。我想这就是我想要的。问题:返回的计数是否为负数?如果是,这是否意味着本地repo落后于远程的(n次提交)?或者我执行相同的命令,将参数反转为foo..FETCH_HEAD以确定本地repo是否落后?@svenyonson它不能为负数foo..FETCH\u HEAD
指的是可从FETCH\u HEAD
访问且不可从foo
访问的提交。如果大于0,则表示在远程分支中有一个或多个提交尚未合并到本地foo
。这与“如果本地提交未被推送”完全不同。这是否假设foo
的远程上游也被命名为foo
?使用git rev list--count
比我做的要好得多。我把我们的答案结合起来。