查看未推送的Git提交


1752

如何查看尚未提交到远程存储库的本地提交内容?有时,git status会打印出我的分支是X origin/master,但并非总是如此。

这是我安装的Git的错误,还是我缺少某些东西?


18
从Git 2.5+(2015年第二季度)开始,实际答案将是git log @{push}..@{push}下面的我的答案中
VonC 2015年

59
@Torek-Git使又一个简单的任务变得困难。每当Git问题出现数百或数千个投票和数百万个视图时,就会有人思考:哇,我们真的搞砸了这个工作流程。las,Git开发人员在开发生命周期中省略了反馈步骤,因此未合并反馈。相反,他们不断重复犯同样的错误。对于这个问题,git status --all应该在2010年出现;或git status -v实际上应该提供包含额外信息的详细输出。
jww '16

4
我不同意“ git status -v”应提供此信息,因为它旨在提供有关工作树的状态,因为它仅与检出的分支有关。但是,请参阅下面有关“ git branch -v”的答案,我认为这应该是公认的答案
JoelFan

13
这个特定的StackOverflow问题的正确答案数量最多,所有答案都可行,但没有任何意义。
皮特·阿尔文

@ josh-buhler对不起,我无意中拒绝了投票...试图点击“ STAR”时。重新尝试投票,但是没有用!
RafiAlhamd

Answers:


1827
git log origin/master..HEAD

您也可以使用相同的语法查看差异

git diff origin/master..HEAD

3
这对我有用-由于某些原因,git log origin ..本身就抛出错误。看起来我的本地分支配置方式也有问题-进行更改后,我在这里找到了:wincent.com/blog / ...…问题已解决,我可以再次使用git status来查看我想要的内容。
乔什·布勒

6
不可估量:我做了git config --global alias.ahead "log origin/master..HEAD --oneline"这么多,所以我很快就能知道自己在哪里。更多糖果:for i in *; do echo $i && git ahead 2>/dev/null; done
Jamie 2012年

15
git log --stat origin/master..HEAD带来一点额外的成就
Cory Danielson

141
这不是最佳解决方案。源/主服务器可能并不总是上游分支。更好的解决方案是使用@ {u}而不是“ origin / master”来指示上游分支。由于默认情况下隐含HEAD,因此也可以将其省略。参见@本灵的答案。即将进行的更改:git log @ {u} ..即将进行的更改:git log .. @ {u}
PlagueHammer 2013年

12
@Nocturne我只想指出,发布此答案时,该@{u}语法尚不可用,仅在20102月12日可用。此外,@{u}如果未在本地分支配置上游,则将不起作用。最后,@{u}当前不支持制表符完成,<remote>/<branch>制表符完成仍然是获取此信息的最快方法之一,无论是否配置了上游,它都将起作用。

703

如果要查看尚未推送的所有分支上的所有提交,则可能正在寻找以下内容:

git log --branches --not --remotes

而且,如果您只想查看每个分支上的最新提交以及分支名称,请执行以下操作:

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

8
这太棒了。在一个相关的场景中,我有两个本地分支和两个上游分支,并且一只本地手已合并到另一只本地手中。我想知道哪些提交可以安全地重新设置基准,但是git log master..HEAD由于存在多个上游,因此正常操作不起作用。这篇文章使我git log MyBranch --not --remotes展示了一个分支中尚未推送到任何上游的所有提交。
pavon 2014年

这是如此有用,我在zsh配置中将其作为别名。谢谢。
Scotty C.

我知道您的第二个命令还列出了尚未推送的提交,每个分支仅显示一个。
Stephane

--decorate也显示分支。--graph使它更加明显。

请注意,这些命令仅列出尚未在任何分支中推送的提交。示例:假设您使用分支功能NewThing开发了分支。您可以在本地对feat-NewThing进行更改。(日志已更改。)然后将feat-newThing推送到它的远程分支。(日志为空)。您合并本地专长newThing以在本地开发。假定快进,日志仍然没有更改。
Patrick W

325

您可以显示您在本地但不在上游的所有提交

git log @{u}..

@{u}@{upstream}表示当前分支的上游分支(请参阅git rev-parse --helpgit help revisions了解详细信息)。


17
在Windows上,我需要将最后一个参数用引号引起来,例如:git log“ @ {u} ..”
Jon Schneider

git log @{u}.. -p-p 是最有用的选项之一,它显示了每个确认中引入的差异。
mQuiroz

可能更好的git log @ {push} ..,请参阅另一个答案
汉斯·彼得·斯特尔

183

21
我认为这应该是主要的答案,因为这给出了更简洁的提交列表,而不是在所有文件中难以理解的冗长差异!
ViFI

1
git-cherry- “查找尚未提交到上游的提交”,似乎提供了OP所要求的内容,但仅带有提交主题,而不是整个提交消息。
Eido95 '17

2
值得注意的是,这只会告诉您当前已签出的分支上是否有未推送的提交。它不会告诉您是否具有未推送提交的本地分支(当前未检出)。
Dave Yarwood '17

66

您可以使用git log

git log origin..

假设origin是你上游的名称,后不留任何关修订名字..暗示HEAD,它列出了尚未推向新的提交。


1
每当我看到一个答案git log,“2 -点-不-3”,它总是让我想起stackoverflow.com/questions/53569/... ;)
VonC

1
只是将其添加到答案中-如果没有上游设置,则此命令导致没有上游设置。git branch --set-upstream master origin/<branch>如果您倾向于使用此命令来查看已暂存的提交,请运行以进行上游设置。
asyncwait 2013年

这将与源中的默认分支(而不是当前远程分支)进行比较。
greuze

43

所有其他答案都涉及“上游”(从中提取分支)。
但是,本地分支可以送到与其所在分支不同的分支。

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

远程跟踪分支,寻求unpushed提交时数:在一个轨道branch at the remote当地的分支机构将被推到。
branch at the remote可再次origin/xxx或甚anotherUpstreamRepo/yyy

Git 2.5+(2015年第二季度)引入了一个新的快捷方式: <branch>@{push}

请参阅提交29bc885提交3dbe9db提交adfe5d0提交48c5847提交a1ad0eb提交e291c75提交979cb24提交1ca41a1提交3a429d0提交a9f9f8c提交8770e6f提交da66b27提交f052154提交9e3751d,从5月9提交 2015],然后提交Jeff King(peff提交e41bf35 [2015年5月1日] 。
(由Junio C Hamano合并--gitstercommit 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}”。
它支持与上游相同的跟踪格式修饰符(例如,因为您可能想知道哪些分支已提交push)。

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

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

42

方便的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

而且还确定当前的分支名称。


8
这太棒了!对于那些不熟悉别名的人,只需将其添加到[alias]部分下的〜/ .gitconfig文件中即可。
加里·哈兰

1
用bash复制/粘贴不起作用,但是该脚本非常有用并且可以理解
告一段落

正如@GaryHaran所指出的,这不是bash别名。还有一个用于添加别名的git命令:git alias <alias-name> <command>在这种情况下,该命令应用单引号引起来,以从shell中转义特殊字符。
DagHøidahl'16

4
那将是:git config --global alias.unpushed '!GIT_CURRENT_BRANCH=$(git name-rev --name-only HEAD) && git log origin/$GIT_CURRENT_BRANCH..$GIT_CURRENT_BRANCH --oneline'
Ricky Levi

不过,这似乎与git log @ {u} ..基本相同-请参见另一个答案
汉斯·彼得·斯特尔

35

您可以尝试...

gitk

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

(我真的很惊讶,到目前为止,没有人提到它。)


3
gitk --all查看所有分支。

3
tig是ncurses的替代方案。

@ justin-ohms gitk太棒了!从来不知道这存在!方便浏览漂亮的UI中的更改。
拉菲·阿尔罕默德

@ray tig在“仅终端”情况下最有用-在这种情况下,您无法访问桌面GUI。第一次学习!有趣:tig是反向git
拉菲阿尔罕姆德

30

git branch -v 将为每个本地分支显示是否“提前”。


2
是的,如果在branch上有未推送的提交devel,则对应的行将是* devel 8a12fc0 [ahead 1] commit msg*仅在与检出的分支对应的行上)。ahead 1表示“先提交”,即有一个未推动的提交。
Aurelien

2
是不是git branch -vv?cf. docs:“如果给出两次,也要打印上游分支的名称(另请参见git remote show <remote>)。”
肮脏的亨利

这与打印上游分支的名称无关,而仅与打印behind和/或ahead对于每个本地分支有关,这足以解决OP的问题(检测未推送的提交)。git branch -v足够了,只需再次使用Git 2.16.2进行测试即可:)
Aurelien

-vv之所以有用,是因为它显示了与远程服务器最新的分支和根本没有推送的分支之间的差异。(只有一个-v,它们在显示中会完全相同。)
RM

30

我之前完成过一次提交,没有推送到任何分支,也没有远程或本地。只是提交。其他答案对我没有任何帮助,但适用于:

git reflog

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


如此链接git-scm.com/docs/git-reflog所述,参考日志或“ reflogs”记录本地存储库中分支提示和其他参考的更新时间。就我而言,我克隆了一个存储库,创建了一个新分支,删除了该分支,创建了一个新分支,创建了提交并更改了提交。所有这些步骤均以HEAD @ {0}表示:提交(修改):.. HEAD @ {1}:提交:... HEAD @ {2}:检出:从...移至... HEAD @ { 3}:签出:从...移到... HEAD @ {4}:克隆:从#对不起,格式SO显然不允许注释中包含多行
速度

这包括原始提交,最好的解决方案是使用@PlagueHammer(stackoverflow.com/a/2016954/624048
林肯

20

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

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

然后做:

git unpushed

看起来很有趣,但在我的情况下$(git name-rev --name-only HEAD)是“未定义的”
vak

13

我相信执行此操作的最典型方法是执行以下操作:

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}^..'

11

我建议您去看一下脚本https://github.com/badele/gitcheck,我已经对该脚本进行了编码,以便在所有git存储库中一遍检查,并显示谁尚未提交,谁尚未推送/拉出。

这是一个样本结果 在此处输入图片说明


1
您能否解释一下如何使该插件在Windows计算机上运行?我正在尝试运行pip,但是命令行中缺少该命令。我安装了Python,但不确定是否足够。
KonradSzałwiński2014年

@KonradSzałwiński我没有Windows机器,但是在这个主题(stackoverflow.com/questions/4750806/…)中,用户似乎回答了您的问题:)。但是我还没有在Windows中进行测试,我不确定它是否可以正常工作。
BrunoAdelé2014年

ChristianTremblay github贡献者的@KonradSzałwiński添加了Windows支持。现在,gitcheck在Windows上可以工作了。您可以下载它github.com/badele/gitcheck
布鲁诺阿黛尔

现在,您还可以直接从Docker容器中使用gitcheck(文件位于主机中)。有关更多信息,请参见gitcheck github项目
BrunoAdelé15年

感谢您发布此信息,它似乎真的很有用。我尝试安装,但是安装后找不到运行脚本的位置。$ pip install git + git://github.com/badele/gitcheck.git收集git + git://github.com/badele/gitcheck.git将git://github.com/badele/gitcheck.git克隆到c :\ users \ u6041501 \ appdata \ local \ temp \ pip-bxt472z_-build安装收集的软件包:gitcheck运行gitcheck的setup.py安装:已启动gitcheck的运行setup.py安装:状态为'done'已成功安装gitcheck-0.3 .22
劳伦·菲奇


9

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

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

git fetch

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

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

git log HEAD..origin

8

这对我来说更好:

git log --oneline @{upstream}..

要么:

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

2
对于任何其他想知道的人,@{upstream}字面量(upstream是一个神奇的词),而remotebranch仅仅是分支的名称。
史蒂夫·本内特

7

有一个名为unpushed的工具可以扫描指定工作目录中的所有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官方说明。它还具有cronjob脚本,unpushed-notify用于在屏幕上通知未提交和未按下的更改。


5

要轻松列出所有分支中所有未推送的提交可以使用以下命令:

 git log --branches  @{u}..


3

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

$ git checkout

git通过告诉您相对于您的来源“提前N次提交”做出响应。因此,现在在查看日志时只需记住该数字。如果您“提前3次提交”,则历史记录中前3次提交仍是私有的。



1

如上所述:

git diff来源/主..HEAD

但是,如果您使用的是 git gui

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

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


git gui中的visualize选项就是其中之一。
Rajesh Kolhapure

-2

这是我的便携式解决方案(无需额外安装即可在Windows上运行的shell脚本),它显示了所有分支的来源差异:git-fetch-log

输出示例:

==== 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 0fccef3
  Author: BimbaLaszlo <bimbalaszlo@gmail.com>
  Date:   2015-09-03 10:33:39 +0200

      Last common commit

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


-3
git show

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

git show --name-only

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


3
git show仅显示最近的提交,无论是否已将其推送到远程,都不会显示所有未按下的提交。

-6
git diff origin

假设您的分支机构设置为跟踪原点,则应该向您显示差异。

git log origin

将为您提供提交的摘要。


3
git log origin将显示您已被推送的提交,但不会显示尚未被推送的提交,这更符合原始海报的要求。
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.