如何查看我所做的任何本地提交,但尚未推送到远程存储库?偶尔git status
会打印出我的分支是 X 提交之前origin/master
,但并非总是如此。
这是我安装 Git 的错误,还是我遗漏了什么?
git log origin/master..HEAD
您还可以使用相同的语法查看差异
git diff origin/master..HEAD
如果您想查看尚未推送的所有分支上的所有提交,您可能正在寻找类似这样的内容:
git log --branches --not --remotes
如果您只想查看每个分支上的最新提交以及分支名称,则:
git log --branches --not --remotes --simplify-by-decoration --decorate --oneline
您可以显示您在本地但不是上游的所有提交
git log @{u}..
@{u}
or@{upstream}
表示当前分支的上游分支(详见git rev-parse --help
或git help revisions
)。
你可以这样做git log
:
git log origin/master..
这假定这origin
是您的上游远程master
的名称,并且是您的上游分支的名称。..
在隐含之后省略任何修订名称HEAD
,它列出了尚未推送的新提交。
所有其他答案都谈论“上游”(您从中提取的分支)。
但是本地分支可以推送到与其拉出的分支不同的分支。
Amaster
可能不会推送到远程跟踪分支“ 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}
请参阅提交39BC885,提交ADFE5D0,Commit 48C5847,提交A1AD0EB,Commit E291C75,提交979CB24,提交1CA41A1 ,提交3A429D0,提交A9F9F8C,提交8770E6F,Commit DA66B27,提交F052154,提交9E3751D,提交EE2499F [5月21日2015],并由Jeff King ( )提交 e41bf35 [2015 年 5 月 1 日] 。(由Junio C Hamano合并--peff
gitster
在提交 c4a8354中,2015 年 6 月 5 日)
Commit adfe5d0 解释:
sha1_name
: 实现@{push}
速记
在三角工作流中,每个分支可能有两个不同的兴趣点:
@{upstream}
您通常从中拉取的地方,以及您通常推送到的目的地。后者没有简写,但它很有用。
例如,您可能想知道您尚未推送哪些提交:
git log @{push}..
或者作为一个更复杂的例子,假设您通常从中提取更改
origin/master
(您将其设置为 your@{upstream}
),并将更改推送到您的 fork(例如, asmyfork/topic
)。
您可能会从多台机器推送到您的 fork,这需要您从推送目的地而不是 upstream 集成更改。
有了这个补丁,你可以这样做:
git rebase @{push}
而不是输入全名。
提交 29bc885添加:
for-each-ref
: 接受 "%(push)
" 格式
就像我们用“
%(upstream)
”来报告@{upstream}
每个 ref 的“”一样,这个补丁添加了“%(push)
”来匹配“@{push}
”。
它支持与上游相同的跟踪格式修饰符(因为您可能想知道,例如,哪些分支有提交推送)。
如果您想查看与您要推送到的分支相比,您的本地分支领先/落后有多少提交:
git for-each-ref --format="%(refname:short) %(push:track)" refs/heads
我之前有一个提交,没有推送到任何分支,也没有远程或本地。只是提交。其他答案中没有任何东西对我有用,但是:
git reflog
在那里我找到了我的承诺。
方便的 git 别名,用于在当前分支中查找未推送的提交:
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 系统上,这是一个很好的方式来准确地看到你在寻找什么以及更多。
(实际上我有点惊讶到目前为止没有人提到它。)
git branch -v
将为每个本地分支显示它是否“领先”。
我使用以下别名仅获取已提交但尚未推送的文件列表(和状态)(对于当前分支)
git config --global alias.unpushed \
"diff origin/$(git name-rev --name-only HEAD)..HEAD --name-status"
然后做:
git unpushed
我相信最典型的方法是运行类似的东西:
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 cherry -v
这将列出您的本地评论历史记录(尚未推送)以及相应的消息
我建议你去看看脚本https://github.com/badele/gitcheck,我已经编写了这个脚本来检查你所有的 git 存储库,它会显示谁没有提交和谁没有推/拉。
这是一个示例结果
这不是一个错误。您可能看到的是自动合并失败后的 git 状态,其中从远程获取更改但尚未合并。
要查看本地 repo 和远程之间的提交,请执行以下操作:
git fetch
这是 100% 安全的,不会模拟您的工作副本。如果有变化会git status
显示X commits ahead of origin/master
。
您现在可以显示远程但不在本地的提交日志:
git log HEAD..origin
这对我来说效果更好:
git log --oneline @{upstream}..
或者:
git log --oneline origin/(remotebranch)..
有一个名为unpushed的工具,它扫描指定工作目录中的所有 Git、Mercurial 和 Subversion 存储库,并显示未提交文件和未推送提交的列表。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 log --branches @{u}..
我真的迟到了,我不确定它何时实施,但要看看 agit push
会做什么,只需使用--dry-run option
:
$ git push --dry-run
To ssh://bitbucket.local.lan:7999/qarepo/controller.git
540152d1..21bd921c imaging -> imaging
如果尚未推出的提交数是个位数,通常是这样,最简单的方法是:
$ git checkout
git 通过告诉您相对于您的来源您“提前 N 次提交”来响应。所以现在在查看日志时记住这个数字。如果您“领先 3 次提交”,则历史上的前 3 次提交仍然是私有的。
类似:查看未合并的分支:
git branch --all --no-merged
那些可能是可疑的,但我推荐 cxreg 的答案
一种处理方式是列出在一个分支上可用但在另一个分支上不可用的提交。
git log ^origin/master master
如上所述:
git diff origin/master..HEAD
但是如果你使用 git gui
打开gui界面后,选择“Repository”->“ Visualize History ”下
注意:有些人喜欢使用 CMD Prompt/Terminal 而有些人喜欢使用 Git GUI(为简单起见)
无论您是否这样做git cherry -v
,git logs @{u}.. -p
都不要忘记通过包含您的子
模块git submodule foreach --recursive 'git logs @{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
这是我的便携式解决方案(无需额外安装也可以在 Windows 上运行的 shell 脚本),它显示了所有分支与原点的差异: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
将为您提供提交的摘要。