查看未发布的Git提交

Jos*_*ler 1649 git git-diff git-log

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

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

Pet*_*r B 1707

git log origin/master..HEAD
Run Code Online (Sandbox Code Playgroud)

您还可以使用相同的语法查看diff

git diff origin/master..HEAD
Run Code Online (Sandbox Code Playgroud)

  • 这不是最好的解决方案.Origin/master可能并不总是上游分支.更好的解决方案是使用@ {u}而不是"origin/master"来指示上游分支.由于默认情况下隐含了HEAD,因此也可以将其保留.见@Ben Ling的回答.传出更改:git log @ {u} ..传入更改:git log .. @ {u} (132认同)
  • `git log --stat origin/master..HEAD`有点额外的精彩 (13认同)
  • @Nocturne我只想指出,当这个答案发布时,`@ {u}`语法还没有,它只能在[2010年2月12日]上发布(https://github.com/git /git/blob/v1.7.0/Documentation/RelNotes-1.7.0.txt#L104-L107).此外,如果本地分支未配置上游,则`@ {u}`将不起作用.最后,`@ {u}`目前没有选项卡完成支持,`<remote>/<branch>`选项卡完成仍然是获取此信息的最快方法之一,无论上游是配置还是配置,它都将起作用不. (10认同)
  • 非常宝贵:所以我做了`git config --global alias.ahead"log origin/master..HEAD --oneline"`这样我就可以快速找到我的位置.更多糖果:`for in in*; 回声$ i && git ahead 2>/dev/null; done` (6认同)
  • 这样做对我来说 - 由于某种原因git log origin ..本身就是抛出一个错误.看起来我的本地分支配置方式也有问题 - 一旦我做了我在这里找到的更改:https://wincent.com/blog/your-branch-is-ahead-of-origin-master-by -1-commit ...问题解决了,我可以再次使用git status来查看我想要的内容. (3认同)
  • 这是我见过的最奇怪的语法。 (2认同)

cxr*_*reg 666

如果你想看到所有未推送的分支上的所有提交,你可能会寻找这样的东西:

git log --branches --not --remotes
Run Code Online (Sandbox Code Playgroud)

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

git log --branches --not --remotes --simplify-by-decoration --decorate --oneline
Run Code Online (Sandbox Code Playgroud)

  • 这太棒了.在相关场景中,我有两个本地分支,两个上游分支,一个本地手合并到另一个.我想知道哪些提交对rebase是安全的,但正常的`git log master..HEAD`不会有效,因为有多个上游.这篇文章让我看到了`git log MyBranch --not --remotes`来显示所有未被推送到单个分支中任何上游的提交. (5认同)
  • 这是实际的解决方案。唯一一种通常无需指定分支或无需定义上游即可工作的方法。 (2认同)

Ben*_*ngs 305

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

git log @{u}..
Run Code Online (Sandbox Code Playgroud)

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

  • 在Windows上,我需要将最后一个参数括在引号中,例如:git log"@ {u} .." (12认同)
  • `git log @{u}.. -p` 最有用的选项之一是**-p**,它显示了每次确认中引入的差异。 (2认同)
  • 可能更好 git log @{push}.. ,请参阅[另一个答案](/sf/answers/2150421171/)。 (2认同)
  • 我发现这是最好的答案。我还发现,如果没有备忘单,我根本不可能记住它。为什么 git 开发人员不选择一些明显的、与 git status 一致的东西,因为我们想知道情况的*状态*。`git status -v` 会更有意义。 (2认同)

Chr*_*lma 164

这对我有用:

git cherry -v 
Run Code Online (Sandbox Code Playgroud)

Git所示:查看不在另一个分支中的所有未提交的提交或提交.

  • 我认为这应该是主要的答案,因为这个提供了更简洁的提交列表,而不是,难以阅读,所有文件中的冗长差异! (18认同)
  • [git-cherry](https://git-scm.com/docs/git-cherry) - “查找尚未应用于上游的提交”,似乎提供了OP所要求的内容,但只有提交主题比整个提交消息。 (2认同)
  • 值得注意的是,这只会告诉您当前已签出的分支上是否有未推送的提交。它不会告诉您是否具有未推送提交的本地分支(当前未检出)。 (2认同)

Gre*_*ill 63

你可以这样做git log:

git log origin..
Run Code Online (Sandbox Code Playgroud)

假设这origin是您的上游的名称,在..implies 之后HEAD省略任何修订名称,其中列出了尚未推送的新提交.

  • 我也是巧合! (2认同)

tak*_*hin 40

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

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

这基本上是做什么的:

git log origin/branch..branch
Run Code Online (Sandbox Code Playgroud)

但也确定当前分支名称.

  • 这太棒了!对于那些不熟悉别名的人,只需将它们添加到[alias]部分下的〜/ .gitconfig文件中即可. (6认同)
  • 那将是:`git config --global alias.unpushed'!GIT_CURRENT_BRANCH = $(git name-rev --name-only HEAD)&& git log origin/$ GIT_CURRENT_BRANCH .. $ GIT_CURRENT_BRANCH --oneline'` (3认同)

Von*_*onC 38

所有其他答案都谈到"上游"(你从中拉出的分支).
但是本地分支可以送到不同于它所从的分支.

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}

请参阅commit 29bc885,commit 3dbe9db,commit adfe5d0,commit 48c5847,commit a1ad0eb,commit e291c75,commit 979cb24,commit 1ca41a1,commit 3a429d0,commit a9f9f8c,commit 8770e6f,commit da66b27,commit f052154,commit 9e3751d,commit ee2499f [all all 5月21日2015],并由Jeff King()提交e41bf35 [2015年5月1日] .(由Junio C Hamano合并- -提交c4a8354,2015年6月5日)peff
gitster

提交adfe5d0 解释:

sha1_name:实现@{push}速记

在三角形工作流程中,每个分支可能有两个不同的兴趣点:@{upstream}您通常从中拉出的点,以及您通常推送到的目的地.后者没有简写,但它有用.

例如,您可能想知道尚未推送的提交:

git log @{push}..
Run Code Online (Sandbox Code Playgroud)

或者作为一个更复杂的示例,假设您通常从origin/master(您设置为您的@{upstream})中更改,并将更改推送到您自己的个人分支(例如,as myfork/topic).
您可以从多台计算机推送到您的分支,要求您集成来自推送目标的更改,而不是上游.
有了这个补丁,你可以这样做:

git rebase @{push}
Run Code Online (Sandbox Code Playgroud)

而不是输入全名.

提交29bc885增加:

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

正如我们%(upstream)" @{upstream}"为每个参考报告" ",这个补丁添加" %(push)"以匹配" @{push}".
它支持与上游相同的跟踪格式修饰符(因为您可能想知道,例如,哪些分支具有要提交的提交).

如果您想查看与您要推送的分支相比,您的本地分支提前/退出的提交数量:

git for-each-ref --format="%(refname:short) %(push:track)" refs/heads
Run Code Online (Sandbox Code Playgroud)


Jus*_*hms 34

你可以试试....

gitk
Run Code Online (Sandbox Code Playgroud)

我知道它不是一个纯粹的命令行选项,但如果你安装它并且在GUI系统上,它是一个很好的方式来查看你正在寻找什么以及更多.

(到目前为止,我真的没有人提到它.)

  • `gitk --all`查看所有分支. (2认同)
  • tig是ncurses的替代方案。 (2认同)

Aur*_*ien 28

git branch -v 将为每个本地分支显示它是否"未来".

  • 是的,如果在分支`devel`上有未按下的提交,相应的行将是`*devel 8a12fc0 [ahead 1] commit msg`(`*`将仅在与已检出的分支对应的行上).`before 1`表示"提前一次提交",即有一个未提交的提交. (2认同)
  • 不是`git branch -vv`吗?参见 文档:“如果给出两次,也打印上游分支的名称(另请参见 git remote show &lt;remote&gt;)。” (2认同)

Ola*_*aia 23

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

git reflog
Run Code Online (Sandbox Code Playgroud)

我找到了我的提交.


CCC*_*CCC 20

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

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

然后就是:

git unpushed
Run Code Online (Sandbox Code Playgroud)


Gio*_*fas 12

我相信最常见的做法是运行如下:

git cherry --abbrev=7 -v @{upstream}
Run Code Online (Sandbox Code Playgroud)

但是,我个人更喜欢跑步:

git log --graph --decorate --pretty=oneline --abbrev-commit --all @{upstream}^..
Run Code Online (Sandbox Code Playgroud)

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

git config --global alias.noup \
'log --graph --decorate --pretty=oneline --abbrev-commit --all @{upstream}^..'
Run Code Online (Sandbox Code Playgroud)


Igo*_*aka 9

这不是一个bug.您可能看到的是自动合并失败后的git状态,其中提取了远程更改但尚未合并.

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

git fetch
Run Code Online (Sandbox Code Playgroud)

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

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

git log HEAD..origin
Run Code Online (Sandbox Code Playgroud)


Bru*_*elé 9

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

这是一个样本结果 在此输入图像描述


ads*_*ork 9

git cherry -v
Run Code Online (Sandbox Code Playgroud)

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

  • [在同一问题上重复回答.](http://stackoverflow.com/a/20624168/2908724) (2认同)

nai*_*gun 7

有一个名为unpushed的工具可以扫描指定工作目录中的所有Git,Mercurial和Subversion存储库,并显示ucommited文件列表和未提交的提交.在Linux下安装很简单:

$ easy_install --user unpushed
Run Code Online (Sandbox Code Playgroud)

要么

$ sudo easy_install unpushed
Run Code Online (Sandbox Code Playgroud)

安装系统范围.

用法也很简单:

$ unpushed ~/workspace
* /home/nailgun/workspace/unpushed uncommitted (Git)
* /home/nailgun/workspace/unpushed:master unpushed (Git)
* /home/nailgun/workspace/python:new-syntax unpushed (Git)
Run Code Online (Sandbox Code Playgroud)

有关更多信息,请参阅unpushed --help官方说明.它还有一个cronjob脚本,unpushed-notify用于屏幕上通知未通知和未刷新的更改.


Moh*_*shi 7

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

 git log --branches  @{u}..
Run Code Online (Sandbox Code Playgroud)


VaT*_*aTo 7

这对我来说效果更好:

git log --oneline @{upstream}..
Run Code Online (Sandbox Code Playgroud)

要么:

git log --oneline origin/(remotebranch)..
Run Code Online (Sandbox Code Playgroud)

  • 对于其他任何想知道的人来说,`@ {upstream}`是文字的(`upstream`是一个神奇的词),而`remotebranch`只是你的分支的名字. (2认同)