关于Git Diff:查看未取消的Git提交

Viewing Unpushed Git Commits

如何查看尚未推送到远程存储库的任何本地提交?有时,git status会打印出我的分支机构是x,在origin/master之前提交,但并不总是这样。

这是我安装Git时的错误,还是我丢失了什么?


1
git log origin/master..HEAD

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

1
git diff origin/master..HEAD


如果您希望看到所有尚未推送的分支上的所有提交,那么您可能正在寻找类似这样的内容:

1
git log --branches --not --remotes

如果您只想查看每个分支上最近的提交以及分支名称,那么:

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


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

1
git log @{u}..

@{u}@{upstream}是指当前分行的上游分行(详见git rev-parse --helpgit help revisions)。


这对我很有用:

1
git cherry -v

正如在git中所指出的:查看不在另一个分支中的所有未执行的提交或提交。


您可以使用git log来完成此操作:

1
git log origin..

假设origin是您上游的名称,在..后面去掉任何修订名称,表示HEAD,其中列出了尚未推出的新承诺。


在当前分支中查找未完成提交的Handy Git别名:

1
alias unpushed = !GIT_CURRENT_BRANCH=$(git name-rev --name-only HEAD) && git log origin/$GIT_CURRENT_BRANCH..$GIT_CURRENT_BRANCH --oneline

它的基本功能是:

1
git log origin/branch..branch

但也决定了当前的分支名称。


所有其他答案都是关于"上游"(你拉的分支)的。但是,一个本地分支可以推到一个不同于它拉过来的分支。

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年第二季度)为其引入了新的捷径:@{push}

请参见Jeff King的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[从2015年5月21日起]、Commit E41bf35[2015年5月1日](peff)。(由Junio C Hamano——EDOCX1【14】——于2015年6月5日提交c48354)

提交adfe5d0解释:

sha1_name: implement @{push} shorthand

In a triangular workflow, each branch may have two distinct points of interest: the @{upstream} that you normally pull from, and the destination that you normally push to. There isn't a shorthand for the latter, but it's useful to have.

For instance, you may want to know which commits you haven't
pushed yet:

1
git log @{push}..

Or as a more complicated example, imagine that you normally pull changes from origin/master (which you set as your @{upstream}), and push changes to your own personal fork (e.g., as myfork/topic).
You may push to your fork from multiple machines, requiring you to integrate the changes from the push destination, rather than upstream.
With this patch, you can just do:

1
git rebase @{push}

rather than typing out the full name.

提交29BC885,添加:

for-each-ref: accept"%(push)" format

Just as we have"%(upstream)" to report the"@{upstream}" for each ref, this patch adds"%(push)" to match"@{push}".
It supports the same tracking format modifiers as upstream (because you may want to know, for example, which branches have commits to push).

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

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

你可以试试……

1
gitk

我知道这不是一个纯粹的命令行选项,但是如果你已经安装了它,并且在一个图形用户界面系统上,这是一个很好的方法,可以确切地看到你在寻找什么以及更多。

(实际上,到目前为止还没人提到这件事,我有点惊讶。)


git branch -v将显示每个本地分支机构的"超前"与否。


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

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

那么就这样做:

1
git unpushed


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

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

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

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

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

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

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

1
git reflog

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


我建议你去看看脚本https://github.com/badele/git check,我已经为这个脚本编码了一次签入所有的git存储库,它显示了谁没有提交,谁没有推/拉。

这里是一个示例结果enter image description here


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

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

1
git fetch

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

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

1
git log HEAD..origin


1
git cherry -v

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


这对我更有效:

1
git log --oneline @{upstream}..

或:

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


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

1
$ easy_install --user unpushed

1
$ sudo easy_install unpushed

安装全系统。

使用也很简单:

1
2
3
4
$ 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,用于在屏幕上通知未限制和未取消的更改。


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

1
 git log --branches  @{u}..

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

1
git branch --all --no-merged

这些可能是可疑的,但我建议CxReg给出答案。


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

1
$ git checkout

Git的回应是告诉你,相对于你的来源,你处于"领先N提交"状态。所以现在在查看日志时要记住这个数字。如果你是"领先3个承诺",那么历史上排名前3的承诺仍然是私有的。


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

1
git log ^origin/master master


这是我的可移植解决方案(shell脚本也可以在Windows上运行,不需要额外安装),它显示了所有分支与源站的区别:git fetch log

示例输出:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
==== branch [behind 1]

> commit 652b883 (origin/branch)
| Author: BimbaLaszlo <[email protected]>
| Date:   2016-03-10 09:11:11 +0100
|
|     Commit on remote
|
o commit 2304667 (branch)
  Author: BimbaLaszlo <[email protected]>
  Date:   2015-08-28 13:21:13 +0200

      Commit on local

==== master [ahead 1]

< commit 280ccf8 (master)
| Author: BimbaLaszlo <[email protected]>
| Date:   2016-03-25 21:42:55 +0100
|
|     Commit on local
|
o commit 2369465 (origin/master, origin/HEAD)
  Author: BimbaLaszlo <[email protected]>
  Date:   2016-03-10 09:02:52 +0100

      Commit on remote

==== test [ahead 1, behind 1]

< commit 83a3161 (test)
| Author: BimbaLaszlo <[email protected]>
| Date:   2016-03-25 22:50:00 +0100
|
|     Diverged from remote
|
| > commit 4aafec7 (origin/test)
|/  Author: BimbaLaszlo <[email protected]>
|   Date:   2016-03-14 10:34:28 +0100
|
|       Pushed remote
|
o commit 0fccef3
  Author: BimbaLaszlo <[email protected]>
  Date:   2015-09-03 10:33:39 +0200

      Last common commit

可使用为日志传递的参数,如--oneline--patch


1
git show

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

1
git show --name-only

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


1
git diff origin

假设您的分支被设置为跟踪原点,那么这将显示出差异。

1
git log origin

将为您提供提交的摘要。