如何知道最新的提交是否已经推送到远程的主分支?

48

我已将一个分支合并到主分支(master),现在我可以在我的git log中看到它。

一段时间过去了,现在我想知道之前是否也推送(master)到远程仓库,如何判断它是否已经被推送了呢?

我可以想到一些解决方法,例如在其他地方重新克隆存储库,或者重置然后检查再重新合并,但我感觉可能有更简单的答案。

顺便提一下,这与如何在git中检查一个分支是否已经被合并到主分支(master) 不同,因为我知道它已经被合并,只是不确定远程是否也推送了。


你尝试过了吗:git status - Vinay Veluri
这将向我展示它是否已添加到暂存区,以及它是否已经被暂存到索引中。在哪里可以查看它是否已经被推送到远程? - Michael Durrant
2
如果它是自动合并的,那么它会显示您的分支领先 XXX 次提交。通过这些信息,可以判断远程分支滞后于本地仓库。 - Vinay Veluri
我也有这个问题。 - ramwin
6个回答

53

> git status

如果输出结果为

# On branch master
nothing to commit, working directory clean

那么你已经推送了当前的提交。

如果输出以

开始,

# On branch master
# Your branch is ahead of 'origin/master' by 1 commit.
#   (use "git push" to publish your local commits)

那么你有一个还没有推送到服务器的本地提交。你之所以能看到这个信息是因为远程分支origin/master指向了上次推送到源仓库的提交。然而,你的分支比'origin/master'要领先,说明你有一个在最后一次推送提交之后创建的本地提交。

如果你感兴趣的提交不是最新的,那么可以执行:

> git log --decorate --oneline

要找出所讨论的提交是否在由origin/master指向的提交之前还是之后。
如果该提交在origin/master之后(在日志中更高),则表示它尚未被推送。


2
它并不总是有效的。例如,在某些随机的Github存储库中,它对我有效。然而,当我在我们本地项目中使用git status时,该行就会消失,即在On branch master之后立即跟着Untracked files行。 - Hi-Angel
1
@Hi-Angel 这是一个完全本地的项目,还没有推送到远程吗?也就是说,这个项目没有对应的远程仓库?在这样的项目中,git status 永远不会提到任何 origin - Klas Mellbourn
不,我的意思是“本地”的意思是它不是一个公共项目。 它确实有“远程源”。 - Hi-Angel
3
偶尔我在IRC上找到了答案:我漏掉了git branch --set-upstream-to origin/master master这个命令。当使用git clone时,git通常会自动设置它,但在我的情况下,是本地创建的代码然后添加了“origin”,所以显然我必须手动调用它。现在我也能看到与远程的区别了。 - Hi-Angel
如果您从未将分支推送到远程,则这并不正确:它仍将显示“nothing to commit, working directory clean”。 - Connor Low
@ConnorLow 但这不是问题的重点。OP曾经试图回忆自己是否“之前也推送了主分支”,如果他根本没有向远程推送,这种困惑就不会发生。 - Klas Mellbourn

25

如果您提交了多个commit,但不确定哪一个已经被推送到远程仓库,请尝试以下方法:

git log origin/<remote-branch>..<local-branch>

范例:

git log origin/master..master
这将列出本地分支中所有未推送到所述远程分支的提交记录。

2
我发现这个答案比被选中的答案更可靠。由于某种原因,在我的系统上,“git status”并不总是报告本地分支是否领先。 - Obromios

20

通过编程(例如,在脚本中):

git merge-base --is-ancestor HEAD @{u}

您可能还想检查一下本地目录是否干净,例如是否没有未提交的文件更改:

test -z "$(git status --porcelain)"

1
很好 - 对我的使用非常完美(+1),只需要进行一些小的调整:请注意,如果您没有命名为“upstream”的远程,则@{u}将失败。在这种情况下,请改用git rev-parse refs/remotes/<remote-name>/<remote-branch> - 例如,如果您的远程命名为“origin”并且要检查其“master”分支,则使用git rev-parse refs/remotes/origin/master - Izzy
1
@{u}HEAD的比较只能告诉你你的HEAD是否恰好与origin上的HEAD相同。如果origin的HEAD现在比你的HEAD多了10个提交,那么你的测试将失败,即使你的HEAD已经被推送了。 - tanager
@tanager 我认为你是正确的。我已经更改了代码,检查提交是否为祖先而不是相等。感谢您的指正! - VasiliNovikov
1
我认为你需要交换参数的位置。--is-ancestor A B 如果A是B的祖先,则返回0(成功)。当A是上游分支而B是本地分支时,这几乎总是成立的。 - Brecht Machiels
@BrechtMachiels 我认为你是对的,感谢你的撰写!已编辑答案。 - VasiliNovikov
显示剩余2条评论

6
我建议你运行这个命令:
$ git fetch --all
Fetching origin
Fetching upstream

这将从所有远程获取最新数据。
然后你运行:
$ git branch -v
  master       ef762af [ahead 3] added attach methods
* testing      4634e21 added -p flag
  upstream     1234567 [ahead 1, behind 7] updated README.md

这将显示您在哪些分支上领先或落后。
我发布这篇文章是因为其他答案都没有提到获取远程数据,这一步非常关键。

6
你可以使用git log --graph --all --decorate命令,它会显示每个引用所在的位置(HEAD、master、origin/master等)。

这是我最喜欢的答案,因为它明确地给出了信息:“commit XYZ(origin/master)”。其他答案中的命令仅通过不显示有关未推送提交的信息来暗示它。谢谢! - Travis Wilson

3
尝试以下命令:git branch -r --contains <sha1> 对于我存储库中的提交,我可以看到它存在于远程开发分支中。
git branch  -r --contains 7914e54ea7e30c7f446e791df66bd3a5805c978a
origin/develop

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接