查看未推送的Git提交

我如何查看我所做的任何本地提交,尚未推送到远程存储库?偶尔,git status会打印出我的分支在origin/master之前提交了X次,但并非总是如此。

这是我安装Git的bug,还是我错过了什么?

1309282 次浏览
git diff origin

假设您的分支设置为跟踪起源,那么这应该向您展示差异。

git log origin

将为您提供提交的摘要。

您可以使用#0

git log origin/master..

这假设origin是上游远程的名称,master是上游分支的名称。在..之后省略任何修订名称意味着HEAD,它列出了尚未推送的新提交。

这不是bug。您可能看到的是自动合并失败后的git状态,其中来自远程的更改已获取但尚未合并。

要查看本地repo和远程之间的提交,请执行以下操作:

git fetch

这是100%安全的,不会模拟您的工作副本。如果有更改git status将显示X commits ahead of origin/master

您现在可以显示远程但不在本地的提交日志:

git log HEAD..origin

这给出了源/主和HEAD之间所有提交的日志:

git log origin/master..HEAD

当HEAD位于master分支上时,这会给出未推送提交的日志。


类似地,要查看diff:

git diff origin/master..HEAD

要查看尚未推送的所有分支上的所有提交:

git log --branches --not --remotes

要查看每个分支上的最新提交,以及分支名称:

git log --branches --not --remotes --simplify-by-decoration --decorate --oneline

方便的git别名,用于在当前分支中查找未推送的提交:

alias unpushed = !GIT_CURRENT_BRANCH=$(git name-rev --name-only HEAD) && git log origin/$GIT_CURRENT_BRANCH..$GIT_CURRENT_BRANCH --oneline

这基本上是做什么的:

git log origin/branch..branch

还可以确定当前分支名称。

显示您在本地但不是上游的所有提交:

git log @{u}..

@{u}@{upstream}表示当前分支的上游分支(详见#2#3)。

我相信最典型的方法是运行如下内容:

git cherry --abbrev=7 -v @{upstream}

不过,我个人更喜欢跑步:

git log --graph --decorate --pretty=oneline --abbrev-commit --all @{upstream}^..

它显示来自所有分支的未合并上游的提交,加上上游最后一次提交(显示为所有其他提交的根节点)。我经常使用它,以至于我为它创建了别名noup

git config --global alias.noup \'log --graph --decorate --pretty=oneline --abbrev-commit --all @{upstream}^..'

有一个名为未推的工具,它扫描指定工作目录中的所有Git、Mercurial和Subversion存储库,并显示已提交文件和未推送提交的列表。Linux下安装简单:

$ easy_install --user unpushed

$ sudo easy_install unpushed

在系统范围内安装。

用法也很简单:

$ unpushed ~/workspace* /home/nailgun/workspace/unpushed uncommitted (Git)* /home/nailgun/workspace/unpushed:master unpushed (Git)* /home/nailgun/workspace/python:new-syntax unpushed (Git)

有关更多信息,请参阅unpushed --help官方描述。它还有一个cronwork脚本unpushed-notify,用于在屏幕上通知未提交和未推送的更改。

我使用以下别名来获取已提交但尚未推送的文件列表(以及状态)(对于当前分支)

git config --global alias.unpushed \"diff origin/$(git name-rev --name-only HEAD)..HEAD --name-status"

那就做:

git unpushed

我建议你去看看脚本https://github.com/badele/gitcheck,我已经编写了这个脚本,以便在所有git存储库中一次检查,它显示谁没有提交,谁没有推/拉。

这里有一个示例结果在此处输入图像描述

你可以试试……

gitk

我知道它不是一个纯粹的命令行选项,但如果您安装了它并在GUI系统上,这是一个很好的方式来查看您正在寻找的内容以及更多内容。

(实际上我有点惊讶到目前为止没有人提到它。

git show

将显示本地提交中的所有差异。

git show --name-only

将显示本地提交ID和提交的名称。

如果未推送的提交数是个位数,通常是个位数,最简单的方法是:

$ git checkout

git会告诉你,相对于你的来源,你“领先N次提交”。所以现在在查看日志时记住这个数字。如果你“领先3次提交”,则历史上的前3次提交仍然是私有的。

git cherry -v

这将列出您的本地评论历史记录(尚未推送)以及相应的消息

类似:查看未合并的分支:

git branch --all --no-merged

这些可能是可疑的,但我推荐cxreg的答案

要轻松列出所有未推送的提交在所有分支,您可以使用此命令:

 git log --branches  @{u}..

所有其他的答案都提到了“上游”(你拉出来的分支)。
但是本地分支可以推送不同分支,而不是它拉出来的分支。

Amaster可能无法推送到远程跟踪分支“origin/master”。
master上游分支可能是origin/master,但它可以推送到远程跟踪分支origin/xxx甚至anotherUpstreamRepo/yyy
这些由branch.*.pushremote设置为当前分支以及global remote.pushDefault值。

它是远程跟踪分支,在寻找未推送的提交时计数:跟踪branch at the remote的分支,其中本地分支将被推送到。
branch at the remote可以是origin/xxx甚至anotherUpstreamRepo/yyy

Git 2.5+(2015年第二季度)为此引入了一个新的快捷方式:#0

提交29bc885提交3dbe9db提交adfe5d0提交48c5847提交a1ad0eb提交e291c75提交979cb24提交1ca41a1提交3a429d0提交29bc8850,提交29bc8851,提交29bc8852,提交29bc8853,提交29bc8854,提交29bc8855[全部从2015年5月21日起],和提交29bc8856[2015年5月1日]由提交29bc8857.
(由Junio C Hamano----#0----合并于提交c4a8354,2015年6月5日)

提交adfe5d0解释:

sha1_name:实现@{push}速记

在三角形工作流中,每个分支可能有两个不同的兴趣点:通常从@{upstream}拉取的目标和通常推送到的目标。后者没有简写,但有它很有用。

例如,你可能想知道哪些提交你还没有

git log @{push}..

或者作为一个更复杂的例子,假设您通常从origin/master(您设置为@{upstream})提取更改,并将更改推送到您的分叉(例如,作为myfork/topic)。
您可以从多台机器推送到您的分叉,需要您整合来自推送目的地,而不是上游的变更
使用此补丁,您可以执行以下操作:

git rebase @{push}

而不是输入全名。

提交29bc885添加:

for-each-ref:接受“%(push)”格式

就像我们有“%(upstream)”来报告每个参考的“@{upstream}”一样,这个补丁添加了“%(push)”来匹配“@{push}”。
它支持与上游相同的跟踪格式修饰符(因为例如,您可能想知道哪些分支有提交要推送)。

如果您想查看与您要推送到的分支相比,您的本地分支有多少个提交前面/后面

git for-each-ref --format="%(refname:short) %(push:track)" refs/heads

这对我来说更好:

git log --oneline @{upstream}..

或:

git log --oneline origin/(remotebranch)..

对于每个本地分支,git branch -v将显示它是否“领先”。

一种方法是列出一个分支上可用但另一个分支上不可用的提交。

git log ^origin/master master

我以前做过提交,没有推送到任何分支,也没有远程或本地。只有提交。其他答案对我没有任何作用,但是:

git reflog

在那里,我找到了我的承诺。

这是我的便携式解决方案(外壳脚本也可以在Windows上运行,无需额外安装),它显示了所有分支的差异:获取日志管理

输出示例:

==== branch [behind 1]
> commit 652b883 (origin/branch)| Author: BimbaLaszlo <bimbalaszlo@gmail.com>| Date:   2016-03-10 09:11:11 +0100||     Commit on remote|o commit 2304667 (branch)Author: BimbaLaszlo <bimbalaszlo@gmail.com>Date:   2015-08-28 13:21:13 +0200
Commit on local
==== master [ahead 1]
< commit 280ccf8 (master)| Author: BimbaLaszlo <bimbalaszlo@gmail.com>| Date:   2016-03-25 21:42:55 +0100||     Commit on local|o commit 2369465 (origin/master, origin/HEAD)Author: BimbaLaszlo <bimbalaszlo@gmail.com>Date:   2016-03-10 09:02:52 +0100
Commit on remote
==== test [ahead 1, behind 1]
< commit 83a3161 (test)| Author: BimbaLaszlo <bimbalaszlo@gmail.com>| Date:   2016-03-25 22:50:00 +0100||     Diverged from remote|| > commit 4aafec7 (origin/test)|/  Author: BimbaLaszlo <bimbalaszlo@gmail.com>|   Date:   2016-03-14 10:34:28 +0100||       Pushed remote|o commit 0fccef3Author: BimbaLaszlo <bimbalaszlo@gmail.com>Date:   2015-09-03 10:33:39 +0200
Last common commit

可以使用传递给日志的参数,例如--oneline--patch

如上所述:

git diff来源/主… HEAD

如果你使用git gui

打开gui界面后,选择“仓库”->在“可视化历史”下

注意:有些人喜欢使用CMD提示符/终端,而有些人喜欢使用Git GUI(为了简单起见)

如果您有git子模块…

无论你做git cherry -v还是git logs @{u}.. -p,不要忘记通过子模块包含你的子模块git submodule foreach --recursive 'git logs @{u}..'.

我正在使用以下bash脚本来检查所有这些:

    unpushedCommitsCmd="git log @{u}.."; # Source: https://stackoverflow.com/a/8182309
# check if there are unpushed changesif [ -n "$($getGitUnpushedCommits)" ]; then # Check Source: https://stackoverflow.com/a/12137501echo "You have unpushed changes.  Push them first!"$getGitUnpushedCommits;exit 2fi
unpushedInSubmodules="git submodule foreach --recursive --quiet ${unpushedCommitsCmd}"; # Source: https://stackoverflow.com/a/24548122# check if there are unpushed changes in submodulesif [ -n "$($unpushedInSubmodules)" ]; thenecho "You have unpushed changes in submodules.  Push them first!"git submodule foreach --recursive ${unpushedCommitsCmd} # not "--quiet" this time, to display detailsexit 2fi

我真的迟到了,我不确定它是什么时候实现的,但要看看git push会做什么,只需使用--dry-run option

$ git push --dry-runTo ssh://bitbucket.local.lan:7999/qarepo/controller.git540152d1..21bd921c  imaging -> imaging