查看未经删除的Git提交

问题描述 投票:1522回答:24

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

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

git git-diff git-log
24个回答
1645
投票
git log origin/master..HEAD

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

git diff origin/master..HEAD

20
投票

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

git unpushed

然后就是:

git reflog

15
投票

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

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

我找到了我的提交。


12
投票

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

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

git fetch

9
投票

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

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

git status

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

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

https://github.com/badele/gitcheck

9
投票

我建议你去看看脚本git cherry -v ,我编写了这个脚本,一次性检查你所有的git存储库,它显示谁没有提交,谁没有推/拉。

这是一个样本结果


8
投票
unpushed

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


7
投票

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

$ 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

有关更多信息,请参阅official descriptionunpushed-notify。它还有一个cronjob脚本git log --oneline @{upstream}.. ,用于在屏幕上显示未通知和未刷新的更改。


7
投票

这对我来说效果更好:

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

要么:

git branch --all --no-merged

4
投票

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

 git log --branches  @{u}..

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


4
投票

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

$ git checkout

652
投票

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

git log --branches --not --remotes

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

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

3
投票

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

git log ^origin/master master

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


2
投票

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

git-fetch-log

0
投票

这是我的可移植解决方案(在没有额外安装的情况下也适用于Windows的shell脚本),它显示了所有分支的起源差异:==== 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

为日志传递的参数,例如可以使用--patchgit show


-3
投票
git show --name-only

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

git diff origin

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


-5
投票
git log origin

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

qazxswpoi

将为您提供提交的摘要。


295
投票

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

git log @{u}..

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


150
投票

60
投票

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

git log origin..

假设origin是你的上游的名字,在..暗示HEAD后列出任何修订名称,alias unpushed = !GIT_CURRENT_BRANCH=$(git name-rev --name-only HEAD) && git log origin/$GIT_CURRENT_BRANCH..$GIT_CURRENT_BRANCH --oneline 列出了尚未推送的新提交。


37
投票

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

git log origin/branch..branch

这基本上是做什么的:

master

但也确定当前分支名称。


36
投票

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

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甚至<branch>@{push}

Git 2.5+ (Q2 2015) introduces a new shortcut for that: commit 29bc885

commit 3dbe9dbcommit adfe5d0commit 48c5847commit a1ad0ebcommit e291c75commit 979cb24commit 1ca41a1commit 3a429d0commit a9f9f8ccommit 8770e6fcommit da66b27commit f052154commit 9e3751dcommit ee2499fcommit e41bf35 [全部来自2015年5月21日]和Jeff King (peff) [2015年5月1日]由Junio C Hamano -- gitster --。 (由commit c4a8354Commit adfe5d0合并,2015年6月5日)

sha1_name解释说:

@{push}:实施@{upstream}速记

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

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

origin/master

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

Commit 29bc885

而不是输入全名。

for-each-ref补充道:

%(push):接受“%(upstream)”格式

正如我们有“@{upstream}”报告每个参考的“%(push)”,这个补丁添加“@{push}”以匹配“git for-each-ref --format="%(refname:short) %(push:track)" refs/heads ”。 它支持与上游相同的跟踪格式修饰符(因为您可能想知道,例如,哪些分支具有要提交的提交)。

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

gitk

33
投票

你可以试试....

git branch -v

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

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


28
投票

git config --global alias.unpushed \ "diff origin/$(git name-rev --name-only HEAD)..HEAD --name-status" 将为每个当地分支机构展示它是否“领先”。

© www.soinside.com 2019 - 2024. All rights reserved.