2088

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

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

4

27 回答 27

2113
git log origin/master..HEAD

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

git diff origin/master..HEAD
于 2010-01-06T22:50:30.377 回答
792

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

git log --branches --not --remotes

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

git log --branches --not --remotes --simplify-by-decoration --decorate --oneline
于 2010-07-26T20:36:39.503 回答
356

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

git log @{u}..

@{u}or@{upstream}表示当前分支的上游分支(详见git rev-parse --helpgit help revisions)。

于 2011-11-18T12:19:21.563 回答
226

这对我有用:

git cherry -v 

Git 所示:查看所有未推送的提交或不在另一个分支中的提交

于 2013-12-17T01:15:32.580 回答
81

你可以这样做git log

git log origin/master..

这假定这origin是您的上游远程master的名称,并且是您的上游分支的名称。..在隐含之后省略任何修订名称HEAD,它列出了尚未推送的新提交。

于 2010-01-06T22:46:35.607 回答
62

所有其他答案都谈论“上游”(您从中提取的分支)。
但是本地分支可以送到与其拉出的分支不同的分支。

Amaster可能不会推送到远程跟踪分支“ origin/master”。上游分支可能是
,但它可以推送到远程跟踪分支甚至。 这些是为当前分支与值一起设置的。masterorigin/masterorigin/xxxanotherUpstreamRepo/yyy
branch.*.pushremoteglobal remote.pushDefault

在寻找未推送的提交时,远程跟踪分支很重要:跟踪本地分支被推送到的branch at the remote位置。可以是,再次, 甚至是。
branch at the remoteorigin/xxxanotherUpstreamRepo/yyy

Git 2.5+(2015 年第二季度)为此引入了一个新的快捷方式:<branch>@{push}

请参阅提交39BC885提交ADFE5D0Commit 48C5847提交A1AD0EBCommit E291C75提交979CB24提交1CA41A1 提交3A429D0提交A9F9F8C提交8770E6FCommit 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(例如, as myfork/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
于 2015-06-08T22:43:11.483 回答
46

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

git reflog

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

于 2017-03-17T11:40:21.407 回答
43

方便的 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

但也确定当前分支名称。

于 2011-03-03T09:34:58.880 回答
38

你可以试试……

gitk

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

(实际上我有点惊讶到目前为止没有人提到它。)

于 2014-01-27T21:04:33.970 回答
32

git branch -v将为每个本地分支显示它是否“领先”。

于 2015-06-20T11:08:11.663 回答
23

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

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

然后做:

git unpushed
于 2012-07-20T19:24:54.093 回答
13

我相信最典型的方法是运行类似的东西:

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}^..'
于 2012-02-09T11:37:44.923 回答
13
git cherry -v

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

于 2015-03-11T18:48:11.143 回答
11

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

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

于 2013-04-27T12:27:41.867 回答
9

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

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

git fetch

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

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

git log HEAD..origin
于 2010-01-06T22:47:11.503 回答
8

这对我来说效果更好:

git log --oneline @{upstream}..

或者:

git log --oneline origin/(remotebranch)..
于 2015-06-17T18:20:09.627 回答
7

有一个名为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,用于在屏幕上通知未提交和未推送的更改。

于 2012-04-26T18:04:43.547 回答
7

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

 git log --branches  @{u}..
于 2015-05-20T08:59:54.927 回答
5

我真的迟到了,我不确定它何时实施,但要看看 agit push会做什么,只需使用--dry-run option

$ git push --dry-run
To ssh://bitbucket.local.lan:7999/qarepo/controller.git
   540152d1..21bd921c  imaging -> imaging
于 2021-08-26T01:42:41.573 回答
4

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

$ git checkout

git 通过告诉您相对于您的来源您“提前 N 次提交”来响应。所以现在在查看日志时记住这个数字。如果您“领先 3 次提交”,则历史上的前 3 次提交仍然是私有的。

于 2014-05-01T19:49:42.170 回答
4

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

git branch --all --no-merged

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

于 2015-03-31T14:01:28.110 回答
4

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

git log ^origin/master master
于 2015-11-04T13:18:17.703 回答
2

如上所述:

git diff origin/master..HEAD

但是如果你使用 git gui

打开gui界面后,选择“Repository”->“ Visualize History ”下

注意:有些人喜欢使用 CMD Prompt/Terminal 而有些人喜欢使用 Git GUI(为简单起见)

于 2020-03-12T14:41:03.993 回答
0

如果你有 git 子模块...

无论您是否这样做git cherry -vgit 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
于 2021-01-24T09:44:02.580 回答
-2

这是我的便携式解决方案(无需额外安装也可以在 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可以使用。

于 2017-05-25T06:45:30.880 回答
-3
git show

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

git show --name-only

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

于 2014-04-25T06:02:45.683 回答
-5
git diff origin

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

git log origin

将为您提供提交的摘要。

于 2010-01-06T22:46:17.010 回答