如何查看我所做的任何尚未推送到远程存储库的本地提交?偶尔,git status
会打印出我的分支是X提交在origin/master
之前,但并非总是如此。
这是我安装Git的错误,还是我错过了什么?
git log origin/master..HEAD
您还可以使用相同的语法查看diff
git diff origin/master..HEAD
我使用以下别名来获取已提交但尚未推送的文件列表(以及状态)(对于当前分支)
git unpushed
然后就是:
git reflog
我之前做过一次提交,没有被推送到任何分支,也没有被推送到远程或本地。只是提交。没有其他答案对我有用,但有:
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}^..'
。
git fetch
这不是一个bug。您可能看到的是自动合并失败后的git状态,其中提取了远程更改但尚未合并。
要查看本地repo和remote之间的提交,请执行以下操作:
git status
这是100%安全的,不会模拟您的工作副本。如果有变化X commits ahead of origin/master
将显示git log HEAD..origin
。
您现在可以显示远程但不在本地的提交日志:
https://github.com/badele/gitcheck
我建议你去看看脚本git cherry -v
,我编写了这个脚本,一次性检查你所有的git存储库,它显示谁没有提交,谁没有推/拉。
这是一个样本结果
unpushed
这将列出您的本地评论历史(尚未推送)以及相应的消息
有一个名为$ 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 description或unpushed-notify
。它还有一个cronjob脚本git log --oneline @{upstream}..
,用于在屏幕上显示未通知和未刷新的更改。
这对我来说效果更好:
git log --oneline origin/(remotebranch)..
要么:
git branch --all --no-merged
类似:查看未合并的分支:
git log --branches @{u}..
那些可能是可疑的,但我推荐cxreg的答案
要轻松列出所有分支中的所有未提交的提交,您可以使用以下命令:
$ git checkout
如果你想看到所有未推送的分支上的所有提交,你可能会寻找这样的东西:
git log --branches --not --remotes
如果您只想查看每个分支上的最新提交以及分支名称,请执行以下操作:
git log --branches --not --remotes --simplify-by-decoration --decorate --oneline
如果未推出的提交数量是一位数,这通常是最简单的方法:
git log ^origin/master master
git通过告诉你相对于你的起源“提前N提交”来回应。所以现在只需在查看日志时记住这个数字。如果你“提前3次提交”,那么历史上排名前三的提交仍然是私有的。
一种做法是列出一个分支但不是另一个分支上可用的提交。
git-fetch-log
这是我的可移植解决方案(在没有额外安装的情况下也适用于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
为日志传递的参数,例如可以使用--patch
或git show
。
git show --name-only
将显示您本地提交中的所有差异。
git diff origin
将显示本地提交ID和提交名称。
git log origin
假设您的分支设置为跟踪原点,那么应该显示差异。
qazxswpoi
将为您提供提交的摘要。
您可以显示本地但不是上游的所有提交
git log @{u}..
@{u}
或@{upstream}
指当前分支的上游分支(有关详细信息,请参阅git rev-parse --help
或git help revisions
)。
你可以用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
列出了尚未推送的新提交。
方便的git别名,用于在当前分支中查找未提交的提交:
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
甚至<branch>@{push}
。
见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,commit e41bf35 [全部来自2015年5月21日]和Jeff King (peff
) [2015年5月1日]由Junio C Hamano -- gitster
--。
(由commit c4a8354在Commit 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
你可以试试....
git branch -v
我知道它不是一个纯粹的命令行选项,但如果你安装它并且在GUI系统上,它是一个很好的方式来查看你正在寻找什么以及更多。
(到目前为止,我真的没有人提到它。)
git config --global alias.unpushed \
"diff origin/$(git name-rev --name-only HEAD)..HEAD --name-status"
将为每个当地分支机构展示它是否“领先”。