如何知道对 master 的最新提交是不是已推送到远程?

Posted

技术标签:

【中文标题】如何知道对 master 的最新提交是不是已推送到远程?【英文标题】:How to know if latest commit to master has been pushed to the remote?如何知道对 master 的最新提交是否已推送到远程? 【发布时间】:2014-03-26 05:04:47 【问题描述】:

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

一段时间过去了,现在我想知道我之前是否也将 master(带有该提交)推送到远程。如何判断是否已推送?

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

仅供参考,这与How can I know in git if a branch has been already merged into master? 不同,因为我知道它已被合并,只是不知道远程推送。

【问题讨论】:

你试过了吗:git status 这将告诉我它是否已被添加到暂存区域以及它是否已被暂存到索引中。它会在哪里显示它是否真的被推送到遥控器? 如果它是自动合并的,那么它表示您的分支领先于 XXX 次提交。通过该信息,可以判断远程分支滞后于本地 repo 具有的一些提交。 我也有这个问题。 【参考方案1】:

> 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 指向上次推送到源的提交。但是,您的分支是 ahead of 'origin/master',这意味着您有一个本地提交,该提交是在最后一次推送提交之后创建的。

如果你感兴趣的提交不是最新的,那么你可以这样做

> git log --decorate --oneline

找出有问题的提交是在origin/master指向的提交之前还是之后。 如果提交在origin/master 之后(在日志中高于),那么它还没有被推送。

【讨论】:

它并不总是有效。例如。它在随机 github 存储库中对我有用。但是,当我在本地项目中使用git status 时,该行根本不存在,即在On branch master 之后紧跟Untracked files 行。 @Hi-Angel 这是一个没有被推送到远程的完全本地项目吗?也就是没有对应远程仓库的项目?在这样的项目中,git status 永远不会提及任何origin 不,我的意思是“本地”,因为它不是一个公共项目。它确实有一个“遥远的起源”。 所以,我偶尔会在 IRC 上找到答案:我错过了 git branch --set-upstream-to origin/master master 命令。使用git clone 时,git 通常会自动设置它,但在我的情况下,它是本地创建的代码,然后添加了“origin”,所以显然我不得不手动调用它。现在我也看到了与遥控器的区别。【参考方案2】:

如果您进行了多次提交,但不确定其中哪一个被推送到远程,试试这个:

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

例子:

git log origin/master..master

这将列出本地分支中尚未推送到提到的远程分支的所有提交。

【讨论】:

我发现这比选择的答案更可靠。出于某种原因,在我的系统上,git status 并不总是报告本地分支是否在前面。【参考方案3】:

以编程方式执行此操作的解决方案:

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

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

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

【讨论】:

好一个 - 非常适合我的使用 (+1) 并稍作调整:请注意,如果您没有名为“upstream”的遥控器,@u 将失败。在这种情况下,请改用 git rev-parse refs/remotes/&lt;remote-name&gt;/&lt;remote-branch&gt; - 例如git rev-parse refs/remotes/origin/master 如果你的遥控器被命名为“origin”并且你想检查它的“master”分支。 添加您的最后一个示例 - 这将如何使您的脚本退出?您正在子 shell 中执行 exit 1 命令。相反,您可以使用 分组,它使用当前 shell:test your_condition || echo "ERROR: you have local changes"; exit 1; - 中的空格和分号很重要。 @dwelle 我一直在使用-euET bash 的标志。 @uHEAD 的比较仅告诉您您的 HEAD 是否恰好与原点的 HEAD 相同。如果 origin 的 HEAD 现在比你的 HEAD 早 10 次提交怎么办?那么即使你的 HEAD 已经被推送,你的测试也会失败。 我认为你需要交换你的论点。 --is-ancestor A B 如果 a 是 B 的祖先,则返回 0(成功)。当 A 是上游分支而 B 是您的本地分支时,这几乎总是正确的。【参考方案4】:

我建议你运行这个:

$ 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

这将显示您领先或落后的分支。

我发布这个是因为其他答案都没有提到获取远程数据,这一步至关重要。

【讨论】:

【参考方案5】:

您可以使用git log --graph --all --decorate,它将显示每个 ref 的位置(HEAD、master、origin/master 等)

【讨论】:

这是我最喜欢的答案,因为它明确给出了信息:“提交 XYZ(原点/主控)”。其他答案中的命令仅通过不显示有关未推送提交的信息来暗示它。谢谢!【参考方案6】:

试试这个。 git branch -r --contains &lt;sha1&gt;

对于我的存储库中的提交,我可以看到它存在于远程开发分支中

git branch  -r --contains 7914e54ea7e30c7f446e791df66bd3a5805c978a
origin/develop

【讨论】:

以上是关于如何知道对 master 的最新提交是不是已推送到远程?的主要内容,如果未能解决你的问题,请参考以下文章

更改 Git 提交的日期时间 [重复]

将本地提交的更改推送到新分支

如何查看所有未推送到远程分支的本地提交?

如何将特定提交推送到远程,而不是以前的提交?

撤销对 origin/master 的提交

git 分支