我如何查看我所做的任何尚未推送到远程存储库的本地提交?有时,git状态会显示我的分支是在origin/master之前提交的X,但并不总是这样。

这是我安装Git的bug,还是我遗漏了什么?


git diff origin

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

git log origin

将向您提供提交的摘要。


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

git log origin/master..

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


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

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

git fetch

这是100%安全的,不会模拟您的工作副本。如果有更改,git状态将显示X在原始/主之前提交。

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

git log HEAD..origin

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

git log origin/master..HEAD

当HEAD位于主分支上时,这将提供未推送提交的日志。


同样,要查看差异:

git diff origin/master..HEAD

要查看尚未推送的所有分支上的所有提交,请执行以下操作:

git log --branches --not --remotes

要查看每个分支的最新提交以及分支名称,请执行以下操作:

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

在当前分支中查找未推送提交的便捷数字别名:

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}表示当前分支的上游分支(有关详细信息,请参阅git-rev-parse-help或git-help修订版)。


我认为最典型的方法是运行以下内容:

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

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

$ easy_install --user unpushed

or

$ 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)

有关详细信息,请参阅未推送的帮助或官方说明。它还有一个cronjob脚本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存储库,它显示了谁没有提交,谁没有推送/拉取。

这里是一个示例结果


git cherry -v 

摘自: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}..

所有其他答案都是关于“上游”(你从中选择的分支)。但是一个本地分支可以推到一个不同于它所从的分支。

主机可能不会推送到远程跟踪分支“origin/master”。master的上游分支可能是origin/master,但它可以推送到远程跟踪分支origin/xxx或甚至另一个UpstreamRepo/yyy。这些值由当前分支的branch.*.pushremote以及全局remote.pushDefault值设置。

在查找未推送的提交时,重要的是远程跟踪分支:在本地分支将被推送到的远程跟踪分支。远程的分支也可以是origin/xxx,甚至是另一个UpstreamRepo/yyy。

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

请参见Jeff King(peff)提交的提交29bc885、提交3dbe9db、提交adfe5d0、提交48c5847、提交a1ad0eb、提交e291c75、提交979cb24、提交1ca41a1、提交3a429d0、提供a9f9f8c、提交8770e6f、提交da66b27、提交f052154、提交9e3751d、提交ee2499f[均自2015年5月21日起]和提交e41bf35[2015月1日]。(2015年6月5日,Junio C Hamano--gitster在提交c4a8354中合并)

提交adfe5d0解释:

sha1_name:实现@{push}速记

在三角工作流中,每个分支可能有两个不同的兴趣点:通常从中提取的@{upstream}和通常推送到的目的地。后者没有简写,但有它很有用。例如,您可能想知道哪些提交没有已推送:git-log@{push}。。或者作为一个更复杂的示例,假设您通常从origin/master(您将其设置为@{upstream})拉取更改,并将更改推送到fork(例如,myfork/topic)。您可能会从多台机器推送到分叉,要求您从推送目的地(而不是上游)集成更改。使用此修补程序,您只需执行以下操作:gitrebase@{push}而不是键入全名。

提交29bc885增加了:

对于每个引用:接受“%(push)”格式

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

如果您想查看与您要推送的分支相比,您的本地分支领先/落后的提交数量:

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

这对我来说效果更好:

git log --oneline @{upstream}..

or:

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

gitbranch-v将显示每个本地分支是否“超前”。


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

git log ^origin/master master

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

git reflog

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


这是我的可移植解决方案(shell脚本也适用于Windows,无需额外安装),它显示了所有分支与原始分支的区别: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。


如上所述:

git diff origin/master。。头部

但如果您使用的是gitgui

打开gui界面后,选择“Repository”->在“Visualize History”下

注意:有些人喜欢使用CMDPrompt/Terminal,而有些人则喜欢使用GitGUI(为了简单起见)


如果你有git子模块。。。

无论您是使用gitcherry-v还是gitlogs@{u}-p、 不要忘记通过git子模块foreach--递归“gitlogs@{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

我真的迟到了,我不知道它是什么时候实现的,但要了解git push会做什么,只需使用--dry-run选项:

$ git push --dry-run
To ssh://bitbucket.local.lan:7999/qarepo/controller.git
   540152d1..21bd921c  imaging -> imaging