查看未压入的Git提交

我怎样才能查看我所做的任何本地提交,还没有推送到远程存储库? 有时候, git status会打印出来,我的分支是X在origin/master之前提交,但并不总是如此。

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

 git log origin/master..HEAD 

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

 git diff origin/master..HEAD 

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

 git log --branches --not --remotes 

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

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

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

 git log @{u}.. 

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

这对我工作:

 git cherry -v 

如Git所示:查看所有不在其他分支中的未提交的提交或提交 。

你可以用git log来做到这一点:

 git log origin.. 

假设origin是你上游的名字,在..之后留下任何修订名称,意味着HEAD ,其中列出了未被推送的新提交。

方便的git别名寻找当前分支unpushed提交:

 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 

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

你可以试试….

 gitk 

我知道这不是一个纯粹的命令行选项,但如果你已经安装了它,并在GUI系统上,这是一个很好的方式,看看你正在寻找什么,再加上更多。

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

所有其他的答案都谈到“上游”(你从中拉出的分支)。
但是一个本地分支可以到一个不同的分支,而不是它所从的那个分支。

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

这是远程追踪分支,当要求unpushed提交时进行计数:追踪本地分支将被推送到branch at the remote 分支的分支
branch at the remotebranch at the remote可以,再次, origin/xxx甚至anotherUpstreamRepo/yyy

Git 2.5+(Q2 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 from 21 May 2015],并由Jeff King( peff ) 提交e41bf35 [2015年5月1日]。
(由Junio C gitster合并- gitster – in commit 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 config --global alias.unpushed \ "diff origin/$(git name-rev --name-only HEAD)..HEAD --name-status" 

那么就做:

 git unpushed 

git branch -v会显示每个本地分支是否“前进”。

我相信这样做的最典型的方式是运行类似于:

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

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

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

其中显示了所有未合并到上游的分支的提交, 以及上游的最后一个提交 (显示为所有其他提交的根节点)。 我经常使用它,所以我为它创建了别名。

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

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

这里是一个示例结果 在这里输入图像描述

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

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

 git fetch 

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

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

 git log HEAD..origin 

有一个名为unpushed的工具可以扫描指定工作目录中的所有Git,Mercurial和Subversion repos,并显示提交的文件列表和unpushed提交。 在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屏幕上的未定和未修改的通知。

 git cherry -v 

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

这对我更好:

 git log --oneline @{upstream}.. 

要么:

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

如果没有被推出的提交次数是一个单位数字,通常是最简单的方法是:

 $ git checkout 

git通过告诉你相对你的来源“提前N次提交”作出回应。 所以现在只要在查看日志的时候记住这个数字。 如果你“提前3次提交”,历史上前3名提交者仍然是私有的。

类似:查看未分支分支:

 git branch --all --no-merged 

这些可以怀疑,但我建议cxreg的答案

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

  git log --branches @{u}.. 

做事情的一种方式是列出在一个分支上可用但不是另一个分支上的提交。

 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 show 

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

 git show --name-only 

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

 git diff origin 

假设你的分支被设置为追踪原点,那么这应该显示你的差异。

 git log origin 

会给你一个提交的摘要。