查看未发布的Git提交

时间:2010-01-06 22:41:15

标签: git git-diff git-log

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

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

26 个答案:

答案 0 :(得分:1589)

git log origin/master..HEAD

您还可以使用相同的语法

查看差异
git diff origin/master..HEAD

答案 1 :(得分:639)

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

git log --branches --not --remotes

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

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

答案 2 :(得分:288)

您可以使用

显示您在本地但不在上游的所有提交
git log @{u}..

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

答案 3 :(得分:145)

答案 4 :(得分:60)

您可以使用git log执行此操作:

git log origin..

假设origin是您的上游名称,请在..隐含HEAD之后删除任何修订名称,其中列出了尚未推送的新提交。

答案 5 :(得分:37)

用于在当前分支中查找未提交的提交的方便的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

但也确定当前分支名称。

答案 6 :(得分:36)

所有其他答案都谈及"上游" (你拉的分支)。
但是本地分支可以推送不同的分支而不是它所从的分支。

master可能无法推送到远程跟踪分支" 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年第2季度)为此引入了一条新的快捷方式: <branch>@{push}

请参阅commit 29bc885commit 3dbe9dbcommit adfe5d0commit 48c5847commit a1ad0ebcommit e291c75commit 979cb24,{{3} },commit 1ca41a1commit 3a429d0commit a9f9f8ccommit 8770e6fcommit da66b27commit f052154commit 9e3751d [全部自2015年5月21日起] ,commit ee2499f [2015年5月1日] commit e41bf35 (由Jeff King (peff)合并于Junio C Hamano -- gitster --,2015年6月5日)

commit c4a8354解释说:

  

sha1_name:实施@{push}简写

     

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

     

例如,您可能想知道自己没有提交哪些内容   推了

git log @{push}..
  

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

myfork/topic
  

而不是输入全名。

Commit adfe5d0补充道:

  

git rebase @{push} :接受&#34; for-each-ref&#34;格式

     

就像我们有&#34; %(push)&#34;报告&#34; %(upstream)&#34;对于每个参考,此补丁添加&#34; @{upstream}&#34;匹配&#34; %(push)&#34;。
  它支持与上游相同的跟踪格式修饰符(因为您可能想知道,例如,哪些分支具有提交的提交)。

如果您想查看与您要推送的分支相比,您的本地分支机构提交了多少次提前/后退

@{push}

答案 7 :(得分:33)

你可以尝试......

gitk

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

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

答案 8 :(得分:27)

git branch -v将为每个本地分支显示它是否“未来”。

答案 9 :(得分:20)

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

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

然后就这样做:

git unpushed

答案 10 :(得分:12)

我认为最常见的做法是运行类似:

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 :(得分:9)

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

git reflog

我找到了我的提交。

答案 12 :(得分:9)

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

此处有一个示例结果enter image description here

答案 13 :(得分:8)

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

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

git fetch

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

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

git log HEAD..origin

答案 14 :(得分:8)

git cherry -v

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

答案 15 :(得分:7)

这对我来说效果更好:

git log --oneline @{upstream}..

或:

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

答案 16 :(得分:7)

有一个名为unpushed的工具可以扫描指定工作目录中的所有Git,Mercurial和Subversion存储库,并显示ucommited文件列表和未提交的提交。 在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 --helpofficial description。它还有一个cronjob脚本unpushed-notify,用于屏幕上显示未通知和未刷新的更改。

答案 17 :(得分:4)

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

git branch --all --no-merged

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

答案 18 :(得分:4)

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

 git log --branches  @{u}..

答案 19 :(得分:3)

如果未推出的提交数量是一位数,这通常是最简单的方法:

$ git checkout

git回应告诉你你是&#34;提前N提交&#34;相对你的起源。所以现在只需在查看日志时记住这个数字。如果您提前3次提交&#34;,则历史记录中的前3次提交仍然是私有的。

答案 20 :(得分:2)

一种做法是列出一个分支上可用的提交,而不是另一个分支上的提交。

git log ^origin/master master

答案 21 :(得分:1)

如上所述:

git diff origin / master..HEAD

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

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

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

答案 22 :(得分:0)

如果你有 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 changes
    if [ -n "$($getGitUnpushedCommits)" ]; then # Check Source: https://stackoverflow.com/a/12137501
        echo "You have unpushed changes.  Push them first!"
        $getGitUnpushedCommits;
        exit 2
    fi

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

答案 23 :(得分:0)

这是我的便携式解决方案(在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

答案 24 :(得分:-3)

git show

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

git show --name-only

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

答案 25 :(得分:-6)

git diff origin

假设您的分支设置为跟踪原点,那么应该显示差异。

git log origin

将为您提供提交摘要。