プッシュされていないGitコミットの表示


1752

リモートリポジトリにまだプッシュされていないローカルコミットを表示するにはどうすればよいですか?たまに、git status私のブランチがXコミットであることを出力しますがorigin/master、常にではありません。

これはGitのインストールに関するバグですか、それとも何か不足していますか?


18
Git 2.5以降(2015年第2四半期)以降、実際の答えはになりますgit log @{push}..以下の私の回答@{push}
VonC

59
@Torek-Gitによってさらに困難になった別の単純なタスク。Gitの質問が数百または数千の賛成投票と数百万のビューで表示されるたびに、誰かが考える必要があります。残念ながら、Git開発者は開発ライフサイクルのフィードバックステップを省略しているため、フィードバックは組み込まれていません。代わりに、彼らは同じ間違いを何度も繰り返し続けます。この質問についてgit status --allは、2010年に表示されているはずです。またはgit status -v、追加情報を含む詳細な出力を実際に提供する必要があります。
jww

4
「git status -v」は、チェックアウトされたブランチのみに関連する作業ツリーに関するステータスを提供することを目的としているため、この情報を提供するべきではないことに同意します。ただし、以下の「gitブランチ-v」についての回答を参照してください。これは、受け入れられる回答であるはずです
JoelFan

13
この特定のStackOverflowの質問には、すべての作業がまだ意味のない正解の数が最も多くなっています。
ピートアルビン

@ josh-buhler申し訳ありませんが、誤って「投票」しましたが、「STAR」をクリックしようとしました。再度投票してみましたが、うまくいきませんでした。
RafiAlhamd

回答:


1828
git log origin/master..HEAD

同じ構文を使用して差分を表示することもできます

git diff origin/master..HEAD

3
これは私のためにそれをしました-何らかの理由でgit log origin ..自体がエラーを投げていました。ローカルブランチの構成方法にも問題があったようです。変更を加えると 、wincent.com / blog / ……問題が解決され、git statusをもう一度使用して、必要なものを確認できます。
Josh Buhler

6
かけがえのないこと:git config --global alias.ahead "log origin/master..HEAD --oneline"自分がどこにいるかすぐに見つかるように、とても多くのことをしました。さらにキャンディ:for i in *; do echo $i && git ahead 2>/dev/null; done
ジェイミー

15
git log --stat origin/master..HEAD
コリーダニエルソン

141
これは最善の解決策ではありません。オリジン/マスターは常に上流のブランチであるとは限りません。より良い解決策は、 "origin / master"の代わりに@ {u}を使用して上流のブランチを示すことです。HEADはデフォルトで暗黙指定されているため、省略してもかまいません。@Ben Lingの回答を参照してください。発信変更:git log @ {u} ..受信変更:git log .. @ {u}
PlagueHammer

12
@Nocturneこの回答が投稿されたとき、@{u}構文はまだ利用できず、2010年2月12日にのみ利用可能になったことを指摘したいと思います。また、@{u}ローカルブランチがアップストリームで構成されていない場合は機能しません。最後に、@{u}現在、タブ補完はサポートされていません。タブ補完<remote>/<branch>は、この情報を取得する最も速い方法の1つであり、アップストリームが設定されているかどうかに関係なく機能します。

703

まだプッシュされていないすべてのブランチのすべてのコミットを確認したい場合は、次のようなものを探している可能性があります。

git log --branches --not --remotes

そして、各ブランチの最新のコミットとブランチ名だけを見たい場合は、次のようにします。

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

8
これは素晴らしいです。関連するシナリオでは、2つのローカルブランチと2つの上流ブランチがあり、一方のローカルハンドがもう一方にマージされました。どのコミットがリベースしても安全か知りたいのですが、git log master..HEADアップストリームが複数あるため、通常は機能しません。この投稿によりgit log MyBranch --not --remotes、単一のブランチのどのアップストリームにもプッシュされていないすべてのコミットが表示されました。
pavon 2014

これはとても便利だったので、zsh設定でエイリアスを付けました。ありがとう。
Scotty C.

2つ目のコマンドでも、まだプッシュされていないコミットがリストされていることを理解しています。ブランチごとに1つだけ表示されます。
ステファン

--decorate枝も示しています。--graphそれはさらに明白になります。
Ray

これらのコマンドは、どのブランチにプッシュされていないコミットのみをリストすることに注意してください。例:ブランチfeat-NewThingでブランチを開発しているとしましょう。ローカルでfeat-NewThingに変更を加えます。(ログには変更があります。)次に、feat-newThingをリモートブランチにプッシュします。(ログは空です)。ローカルfeat-newThingをマージして、ローカルで開発します。早送りを前提とすると、ログには変更がありません。
Patrick W

325

ローカルではあるが上流ではないすべてのコミットを表示できます

git log @{u}..

@{u}または@{upstream}現在のブランチ(参照の上流分岐を意味git rev-parse --helpgit help revisions詳細については)。


17
Windowsでは、最後の引数を次のように引用符で囲む必要がありました:git log "@ {u} .."
Jon Schneider

git log @{u}.. -p 最も有用なオプションの1つは-pで、各確認で導入された違いを示します。
mQuiroz 2018

おそらくより良いgit log @ {push} ..、別の回答を参照してください。
Hans-PeterStörr19年

183

これは私のために働きました:

git cherry -v 

Gitで示されているように:プッシュされていないすべてのコミットまたは別のブランチにないコミットを確認します


21
これはすべてのファイルの詳細な違いではなく、読みにくい、コミットのより簡潔なリストを提供するので、これが主な答えになるはずです!!
ViFI 2016

1
git-cherry-「まだアップストリームに適用されていないコミットを見つける」は、OPが求めていたものを提供しているようですが、コミットメッセージ全体ではなく、コミットサブジェクトのみです。
Eido95

2
これは、現在チェックアウトしているブランチにプッシュされていないコミットがある場合にのみ通知することに注意してください。プッシュされていないコミットがあるローカルブランチ(現在チェックアウトされていない)があるかどうかは通知されません。
Dave Yarwood 2017

66

あなたはこれを行うことができますgit log

git log origin..

それoriginがアップストリームの名前であると仮定し、..暗黙の後にリビジョン名を省略するとHEAD、プッシュされていない新しいコミットがリストされます。


1
git log「2-dots-not-3」の回答を見ると、常にstackoverflow.com/questions/53569/… ;)を思い出させます
VonC

1
それを答えに追加するだけです-アップストリームセットアップがない場合、このコマンドはアップストリームがセットアップされていないことを示します。git branch --set-upstream master origin/<branch>ステージングされているコミットを確認するためにこのコマンドを使用する傾向がある場合は、上流でセットアップを実行してください。
asyncwait 2013

これは、現在のリモートブランチではなく、元のデフォルトブランチと比較されます。
2014年

43

他のすべての回答は、「上流」(あなたがプルしたブランチ)について話します。
ただし、ローカルブランチは、プル元のブランチとは異なるブランチにプッシュできます。

masterリモート追跡ブランチ " origin/master"にプッシュしない可能性があります。上流のための分岐があるかもしれないが、それは、リモート追跡ブランチにプッシュすることができ、さらには。 これらは、値とともに現在のブランチに設定されます。
masterorigin/masterorigin/xxxanotherUpstreamRepo/yyy
branch.*.pushremoteglobal remote.pushDefault

プッシュされていないコミットを探すときにカウントされるのはリモートトラッキングブランチです。ローカルブランチがプッシュされるbranch at the remote場所を追跡するブランチです。再び、することができ、さらには。
branch at the remoteorigin/xxxanotherUpstreamRepo/yyy

Git 2.5+(2015年第2四半期)では、そのための新しいショートカットが導入されています。 <branch>@{push}

参照29bc885をコミットし3dbe9dbコミットadfe5d0をコミットし48c5847をコミットしa1ad0ebをコミットしe291c75をコミットし979cb24をコミットし1ca41a1をコミットし3a429d0をコミットしa9f9f8cコミット8770e6fをコミットしda66b27コミットf052154をコミットし9e3751dをコミットしee2499fコミット 5月21日から[すべてを2015]、Jeff Kingによるe41bf35 [2015年5月1日]のコミットpeff
Junio C Hamanoによって統合--gitsterコミットc4a8354、2015年6月5日)

コミットadfe5d0の 説明:

sha1_name@{push}省略表現を実装する

三角形のワークフローでは、各ブランチに2つの異なる重要なポイントがある可能性があり@{upstream}ます。通常、そこからプルするものと、通常プッシュする先です。後者の省略形はありませんが、持っていると便利です。

たとえば、まだプッシュしていないコミットを知りたい場合があります

git log @{push}..

または、より複雑な例として、通常はorigin/master(として設定した@{upstream})から変更をプルし、変更を自分の個人用フォーク(たとえば)にプッシュするとしますmyfork/topic
複数のマシンからフォークにpushする場合があり、変更を上流ではなくpush宛先から統合する必要があります。
このパッチを使用すると、次のことができます。

git rebase @{push}

完全な名前を入力するのではなく、

コミット29bc885追加:

for-each-ref:「%(push)」フォーマットを受け入れる

各参照の「%(upstream)」を報告する「@{upstream}」があるように、このパッチは「%(push)」を「」に追加します@{push}
アップストリームと同じ追跡形式修飾子をサポートしますたとえば、どのブランチにpushするコミットがあるかを知りたい場合があるため)。

あなたの地元の支店があるコミット何を見たい場合は後ろに/先読みあなたが推進している枝に比べて:

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

42

現在のブランチでプッシュされていないコミットを探すための便利な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

現在のブランチ名も決定します。


8
これはすごい!エイリアスに慣れていない場合は、〜/ .gitconfigファイルの[alias]セクションに追加してください。
Gary Haran 2013

1
bashでのコピー/貼り付けは機能しませんが、スクリプトは非常に便利で理解可能です
greuze

@GaryHaranが指摘するように、これはbashエイリアスではありません。エイリアスを追加するためのgitコマンドもありますgit alias <alias-name> <command>。この場合、コマンドを単一引用符で囲んで、シェルから特殊文字をエスケープする必要があります。
DagHøidahl、2016年

4
それは次のようになります。git config --global alias.unpushed '!GIT_CURRENT_BRANCH=$(git name-rev --name-only HEAD) && git log origin/$GIT_CURRENT_BRANCH..$GIT_CURRENT_BRANCH --oneline'
リッキー・レビ

基本的にはgit log @ {u} ..と同じようですが、別の回答を参照してください。
Hans-PeterStörr19年

35

あなたは試すことができます...

gitk

純粋なコマンドラインオプションではないことは知っていますが、インストールしてGUIシステムを使用している場合は、探しているものを正確に確認するのに最適な方法です。

(実際、これまで誰も言及していなかったので、ちょっと驚いています。)


3
gitk --allすべてのブランチを表示します。
Ray

3
tigncursesの代替です。
Ray

@ justin-ohms gitkは素晴らしいです!これが存在することを知らなかった!素敵なUIの変更を閲覧するのに便利です。
RafiAlhamd

@ray tigは「ターミナルのみ」の状況で最も役立ちます-デスクトップGUIにアクセスできない場合。初めて学ぶ!興味深い:のtig逆ですgit
RafiAlhamd

30

git branch -v ローカルブランチごとに、それが「先に」あるかどうかが表示されます。


2
はい、ブランチdevelにプッシュされていないコミットがある場合、対応する行は* devel 8a12fc0 [ahead 1] commit msg*チェックアウトされたブランチに対応する行のみになります)になります。ahead 1「1つ先のコミット」、つまり1つのプッシュされていないコミットがあることを意味します。
Aurelien

2
ですgit branch -vvよね?Cf. docs:「2回指定すると、上流のブランチの名前も出力します(git remote show <remote>も参照してください)。」
Dirty Henry

これは上流のブランチの名前を印刷することではなく、OPの問題(プッシュされていないコミットの検出)を解決するのに十分な、各ローカルブランチの印刷behindおよび/または印刷に関するaheadものです。git branch -vこれで十分です。Git2.16.2でもう一度テストしました:)
Aurelien

-vvは、リモートで最新のブランチとまったくプッシュされていないブランチの違いを示すので便利です。(-vが1つだけの場合は、同じように表示されます。)
RM

30

以前にコミットを行いましたが、どのブランチにもプッシュされておらず、リモートでもローカルでもありません。ただのコミット。他の答えからは何もうまくいきませんでしたが、

git reflog

そこで私は自分のコミットを見つけました。


このリンクで説明されているように、git-scm.com/docs/git-reflog、リファレンスログ、または「reflogs」は、ブランチのヒントやその他のリファレンスがローカルリポジトリで更新された日時を記録します。私の場合、私はレポを複製し、新しいブランチを作成し、ブランチを削除し、新しいブランチを作成し、コミットを作成し、コミットを変更しました。HEAD @ {0}として記録されたこれらすべてのステップ:commit(修正):.. HEAD @ {1}:commit:... HEAD @ {2}:チェックアウト:...から... HEAD @ {に移動3}:チェックアウト:...から... HEAD @ {4}への移動:クローン:フォーマットから#申し訳ありませんが、SOはコメントに複数行を許可していません
速度

これは元のコミットを含んでも、最善の解決策は、@PlagueHammer(が提供するコマンドを使用しますでしょうstackoverflow.com/a/2016954/624048
リンカーン

20

次のエイリアスを使用して、コミットされているが(現在のブランチに対して)プッシュされていないファイル(およびステータス)のリストのみを取得します。

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

その後、単に:

git unpushed

興味深いように見えますが、私の場合、$(git name-rev --name-only HEAD)は「未定義」です
vak

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

11

スクリプトhttps://github.com/badele/gitcheckをご覧になることをお勧めします。このスクリプトをコーディングして、すべてのgitリポジトリをワンパスでチェックし、誰がコミットしていないか、誰がプッシュ/プルしていないかを示します。

ここにサンプル結果 ここに画像の説明を入力してください


1
このプラグインをWindowsマシンで動作させる方法を説明していただけませんか?pipを実行しようとしていますが、コマンドラインにコマンドがありません。Pythonをインストールしましたが、十分かどうかはわかりません。
KonradSzałwiński14年

@KonradSzałwiński私はWindowsマシンを持っていませんが、このトピック(stackoverflow.com/questions/4750806/…)では、ユーザーはあなたの質問に答えているようです:)。しかし、私はWindowsでテストしていないので、それがうまくいくかどうかはわかりません。
BrunoAdelé2014年

@KonradSzałwińskiChristianTremblay github寄稿者がWindowsのサポートを追加しました。gitcheckがWindowsで動作するようになりました。あなたは上でそれをダウンロードすることができgithub.com/badele/gitcheck
ブルーノアデル

これで、Dockerコンテナーから直接gitcheckを使用することもできます(ホストにファイルがある場合)。詳細については、gitcheck githubプロジェクトを参照してください
BrunoAdelé15年

これを投稿してくれてありがとう、それは本当に便利なようです。インストールを試みましたが、インストール後、スクリプトを実行する場所が見つかりません。$ pip install git + git://github.com/badele/gitcheck.git git + git://github.com/badele/gitcheck.gitの収集git://github.com/badele/gitcheck.gitの複製をcに:\ users \ u6041501 \ appdata \ local \ temp \ pip-bxt472z_-build収集したパッケージのインストール:gitcheck gitcheckのsetup.py installの実行:開始gitcheckのsetup.py installの実行:ステータス「done」で終了正常にインストールされたgitcheck-0.3 .22
ローレンフィッチ


9

バグではありません。おそらく、リモートからの変更がフェッチされたがまだマージされていない、自動マージが失敗した後のgitステータスが表示されます。

ローカルリポジトリとリモート間のコミットを確認するには、次のようにします。

git fetch

これは100%安全で、作業コピーをモックアップしません。変更があった場合はgit status表示されX commits ahead of origin/masterます。

これで、リモートにはあるがローカルにはないコミットのログを表示できます。

git log HEAD..origin

8

これは私にとってよりうまくいきました:

git log --oneline @{upstream}..

または:

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

2
疑問に思っている他の人にとって@{upstream}は、はリテラル(upstream魔法の言葉)ですが、remotebranchは単にブランチの名前です。
Steve Bennett

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または公式の説明を参照してください。またunpushed-notify、コミットされていないプッシュされていない変更を画面に通知するためのcronjob スクリプトもあります。


5

すべてのブランチのすべてのプッシュされていないコミット簡単にリストするには、次のコマンドを使用できます。

 git log --branches  @{u}..

4

類似:マージされていないブランチを表示するには:

git branch --all --no-merged

それらは疑わしいかもしれませんが、私はcxregによる回答をお勧めします


3

プッシュアウトされていないコミットの数が1桁の数字である場合、これはよくあることですが、最も簡単な方法は次のとおりです。

$ git checkout

gitは、自分のオリジンに対して「Nコミット前」であることを伝えることで応答します。ログを表示するときは、その数を覚えておいてください。「3コミットまで」の場合、履歴の上位3コミットはまだ非公開です。


2

物事を行う1つの方法は、1つのブランチで利用可能で別のブランチでは利用できないコミットをリストすることです。

git log ^origin/master master

「^」文字は何をしますか?
アランMulholland

@AranMulhollandそれはここではないの略です。
アレックス

1

上記のように:

git diff origin / master..HEAD

しかし、git guiを使用している場合

GUIインタフェースを開いた後、「リポジトリ」を選択し- >その「下の視覚化の歴史

注:CMDプロンプト/ターミナルを使用したい人もいれば、Git GUIを使用したい人もいます(簡単にするため)。


git guiの視覚化オプションがその1つです。
Rajesh Kolhapure

-2

これが私のポータブルソリューションです(追加のインストールなしでWindowsでも動作するシェルスクリプト)。これはすべてのブランチのoriginとの違いを示しています: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使用できます。


-3
git show

ローカルコミットのすべての差分を表示します。

git show --name-only

ローカルコミットIDとコミット名が表示されます。


3
git showリモートにプッシュされたかどうかに関係なく、最新のコミットのみが表示されます。プッシュされていないコミットはすべて表示されません。

-6
git diff origin

ブランチが原点を追跡するように設定されているとすると、違いがわかります。

git log origin

コミットの概要が表示されます。


3
git log originすでにプッシュされているコミットを表示しますが、プッシュされないコミットは表示しません。これは、元の投稿者が求めていたものに沿っています。
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.