隠し場所に対するGit diff


1359

スタッシュ解除によって現在の作業ツリーに加えられる変更を確認するにはどうすればよいですか?適用する前に、どのような変更が加えられるのか知りたいです。



1
関連記事はこちら
2017

回答:


1872

最新の隠し場所を見る:

git stash show -p

任意の隠し場所を参照してください。

git stash show -p stash@{1}

git stashマンページから:

デフォルトでは、コマンドはdiffstatを表示しますが、git diffで認識されている任意の形式を受け入れます(たとえば、2番目に新しいstashをパッチ形式で表示するには、git stash show -p stash @ {1})。


72
stash@{0}デフォルトです。以前の隠し場所を確認する場合にのみ、引数が必要です。
Cascabel、2011年

52
正しい。私はそれを供給しただけで、他の隠し場所の見方がはっきりしました{0}
アンバー

74
これは、スタッシュと現在の作業ディレクトリ間の差分を表示しませんが、スタッシュと元の親の間の差分を表示します。正しい?マンページから:「スタッシュに記録された変更を、スタッシュされた状態とその元の親との差分として表示します。」
Magne

14
@アンバー-真、ただし、現在の作業ツリーがダーティである場合、それが重要であり、少し複雑になります。私はその角度からそれに取り組み、以下の私の答えに私が共有した手順を見つけました。
マグネ2013年

6
何の-p略ですか?
ジェラルド

308

最新の隠し場所を表示するには:

git stash show -p

任意の隠し場所を表示するには:

git stash show -p stash@{1}

また、私はgit diffを使用して、スタッシュを任意のブランチと比較します。

以下を使用できます。

git diff stash@{0} master

ブランチマスターと比較したすべての変更を確認します。


またはあなたが使うことができます:

git diff --name-only stash@{0} master

変更されたファイル名のみを簡単に見つけるため。


10
これは特定の質問には答えません。マスターからスタッシュを作成した場合(後で作業を保存するため)、マスターで他の作業にいくつかのコミットをgit diff stash@{0} master行ってから、現在のマスター(スタッシュ後にマスターで行われた作業を含む)に対するスタッシュの差分を取得します作成されました)、スタッシュが変更するファイル/行ではなく、それが問題です。
トム・デ・レイ

52
正確な質問に対する回答ではなかったとしても、質問に回答してくれてうれしいです。それはより多くの情報を与えました、そして私はブランチとそれを比較したい他のブランチとの間の差分を取得する方法を知るのは素晴らしいことだと思います。--name-onlyフラグを学習することも好きでした:)
Rebekah Waterbury

6
これにより、カスタムdiffビューアを使用して違いを確認することもできます。例git difftool --tool=... stash@{0} HEAD
Andre Holzner '19

9
@TomDeLeu良い観察と重要なポイント。stashアイテムをその親と比較すると、これはgit diff stash@{0}^ stash@{0}
うまくいく

1
また、ファイル名git diff stash@{0} master -- filenameを追加して、特定のファイルへの変更を取得できます。
David

104

隠された変更のベースとなっているブランチがその間に変更された場合、このコマンドが役立つことがあります。

git diff stash@{0}^!

これにより、スタッシュとそれに基づくコミットが比較されます。


次のエイリアスを追加しました~/.gitconfiglaststash = diff stash@{0}^!
sbeam 2014年

5
完璧なペア:git difftool stash^!コミットに対する最後の隠し場所のgit difftool stash HEAD差分、現在のコミットに対する最後の隠し場所の差分(以前の隠し場所はstash @ {n})
ChrisV


「git diff stash @ {0} ^!」「git diff stash @ {0} ^ stash @ {0}〜1 ^ stash @ {0}〜2 .......」に要約されますが、git diffは2回のコミットしかとらないため、stash間の差分が表示されます@ {0}と^ stash @ {0}〜1を使用し、2番目のコミットの開始時に^を確認しても違いはなく、gitはそれを無視します。
ナガキラン

私はこのバージョンが私の好みのdiffツールを使用できることを好みます(もちろん、Beyond Compare!)。これは、上記のコメント「git diff stash @ {X} ^ stash @ {X}」で言及されている、隠されたdiffだけではないものとは対照的に、私が元の質問であると考えるこのstashの変更も示しています。
user107172 2017

44

作業ツリーがダーティである場合は、まずダーティ作業ツリーをコミットしてから、スタッシュと比較することで、スタッシュと比較できます。その後、ダーティな作業ツリーでコミットを取り消すことができます(コミットログにダーティコミットを入れたくない場合があるため)。

次の方法を使用して、2つのスタッシュを互いに比較することもできます(この場合、最初にスタッシュの1つをポップするだけです)。

  • 汚い作業ツリーをコミットします。

    git add .
    git commit -m "Dirty commit"
    
  • そのコミットで隠し場所を比較します。

    git diff HEAD stash@{0}
    
  • その後、コミットを元に戻して、作業ディレクトリに戻すことができます。

    git reset --soft HEAD~1
    git reset .
    

これで、汚れた作業ツリーをスタッシュで比較し、最初の状態に戻りました。


これを行う方法はありますが、隠し場所にあるものによって変更されるファイルの差分のみを確認する方法はありますか?
lagweezle

2020、これははるかに簡単です。私の最新の答えをチェックしてください。
デビッドデプロスト

興味深いことに、私は知りませんでしたgit stash show -l 。最新の隠し場所を作業用(ダーティー)コピーと比較しますか?取得せずにどのように使用しますerror: switch l requires a valueか?
マグネ

はい、確かに、(おそらくダーティ)作業コピーとは異なります。と入力するだけで使用できますgit stash show -l。それがあなたにとってうまくいかない理由について、私はあなたが古いバージョンのgitを使用している可能性があると推測できますか?私はgit v2.20.1を使用しており、エラーなしで問題なく動作します。
デビッドデプロスト

25

@Magneの回答は、質問の最も柔軟で有用な解釈に答える唯一の(非常に遅い)日付ですが、必要以上にかなり複雑です。コミットしてリセットするのではなく、作業コピーを隠し、比較して、元に戻すだけです。

git stash save "temp"
git diff stash@{0} stash@{1}
git stash pop

これは、作業フォルダーの変更を一時的にstashスタックの最上部(stash @ {0})にして、元の上部を1つ下(stash @ {1})に移動することにより、stashスタックの最上部と作業フォルダーの違いを示しています。 )次に、「新しいセット」の位置で元のトップを使用して比較し、現在の作業の上にそれを適用した結果生じる変更を確認します。

「でも、現在仕事がない場合はどうなりますか?」 その後、通常の退屈なケースになります。@Amberの回答を使用してください

git stash show

または@czeraszの答え

git diff stash@{0}

または、スタッシュとスタッシュ解除が高速で簡単であることを認め、変更をスタッシュ解除して検査します。現時点で必要ない場合は、それらを破棄します(現在のインデックス/作業フォルダーの変更)。完全に

git stash apply
git diff
git reset
git checkout

3
この単純なアプローチ(スタッシュしてから別のスタッシュと比較する)は安全で理解しやすいものです。一部の使用例では、追跡されていないファイルをgit stash save -u
次の場所に隠しておく

19

これは私のためにgitバージョン1.8.5.2で動作します:

git diff stash HEAD

2
誤解を招く!問題は、アンスタッシングによって現在の作業ツリーに加えられる変更をどのように確認できるでしょうか。これは、スタッシュとヘッドの違いを示しています。これは、で適用されるものとはかなり異なる場合がありますgit stash apply
MikeJansen 2016

詳細については、「適用する前にどのような変更が加えられるのか知りたい!」をお読みください。私はこれに対する素早い答えを提供しています。
yerlilbilgin 2016

また、他のすべての回答は、なんとかして現在のヘッド(またはワーキングセット)をスタッシュと比較することに関するものであることがわかります。なぜ私の答えだけが誤解を招くのですか?それはフェアじゃない。
yerlilbilgin 2016

@yerlilbilgin以下の回答に対する私の回答を参照してください。
MikeJansen

HEADは省略できます。デフォルトですよね。
Al.G.

10

念のため、作業ツリーとスタッシュのファイルを比較するには、以下のコマンドを使用します

git diff stash@{0} -- fileName (with path)

9

比較のためのツールなど、diffのツールがある場合

git difftool stash HEAD

1
誤解を招く!問題は、アンスタッシングによって現在の作業ツリーに加えられる変更をどのように確認できるでしょうか。これは、スタッシュとヘッドの違いを示しています。これは、で適用されるものとはかなり異なる場合がありますgit stash apply
MikeJansen 2016

1
これが誤解を招くと思われる場合は、他のすべての回答を確認してください。それはフェアじゃない!
yerlilbilgin 2016

1
同じコメントを他の回答にもコピーしたので、誤解を招く可能性があります(ほぼ同じ回答です)。すでに同様のコメントがあった他の回答については、私が一人にした。git stashがどのように機能するかを理解していれば、HEADに対するstashの比較が適用されるものではないことに気付くでしょう(これはOPが要求するものです)。実際の「stash」は、stashコミットとその前のコミットとの差分です。次に、このパッチをHEADに適用します。したがって、OPが何を要求したかを知りたい場合は、その前にスタッシュとコミットの差分を表示する必要があります。これは正しい答えです。
MikeJansen 2016

1
これは、他の(不必要に)長い回答よりも直接質問に答え、OPが要求したことを正確に実行しHEADます。@yerlilbilginの回答を変更してHEADを削除することもできますが、gitを使用する人ならだれでもその部分を理解できるため、回答を長くすると読みにくくなります。@yerlibilginに責任はありません。
Sridhar Sarnobat

4

何も移動せずにこれを行う1つの方法は、patchgit diff(基本的には統一されたdiff)を読み取ることができるという事実を利用することです

git stash show -p | patch -p1 --verbose --dry-run

これにより、通常パッチが何を行うかを段階的にプレビューできます。これの追加の利点は、何らかの理由でgitが変更前のコミットについてシャットダウンする必要がある場合にのみ、パッチがワーキングツリーにパッチを書き込むことを妨げないことです。先に進んで--dry-を削除してください。実行して、詳細な指示に従います。


2

私はこのスレッドでとで学んだことを組み合わせると、この1私は「スタッシュの内側にあるもの」を見たいとき、私が最初に実行します。

git stash show stash@{0}

変更されたファイルが表示されます。次に、difftoolで見栄えの良いdiffを取得するには、次のようにします。

git difftool --dir-diff stash@{0} stash@{0}^

これにより、指定されたスタッシュの親に対するすべての違いが一度に表示されます。

~/.gitconfigたとえばMeldを使用して、diffツールを設定できます。

...
[diff]
    tool = meld

1

FWIW これは、他のすべての回答に対して少し冗長である可能性があり、スポットされている受け入れられた回答に非常に似ています。多分それは誰かを助けるでしょう。

git stash show --helpあなたが必要とするすべてをあなたに与えます; stashショー情報を含みます。

ショー[<stash>]

stashに記録された変更を、stashされた状態とその元の親との差分として表示します。指定がない場合は最新のものを表示します。デフォルトでは、コマンドはdiffstatを表示しますが、git diffで認識されている任意の形式を受け入れます(たとえば、2番目に新しいstashをパッチ形式で表示するには、git stash show -p stash @ {1})。stash.showStatおよび/またはstash.showPatch構成変数を使用して、デフォルトの動作を変更できます。


1

彼女は隠し場所のリスト

git stash list 
stash@{0}: WIP on feature/blabla: 830335224fa Name Commit
stash@{1}: WIP on feature/blabla2: 830335224fa Name Commit 2

スタッシュ番号を取得して実行します。

できるよ:

 git stash show -p stash@{1}

ただし、差分が必要な場合(これは隠し場所を示すのとは異なります。それが、私がこの回答を書く理由です。Diffブランチの現在のコードを検討し、show何を適用するかを示すだけです。

以下を使用できます。

git diff stash@{0}

または

git diff stash@{0} <branch name>

もう1つの興味深いことは、次のとおりです。

git stash apply
git stash apply stash@{10}

これはリストから削除せずにスタッシュを適用します。git checkout .それらの変更を削除したり、満足している場合はgit stash drop stash@{10}

ここから私が使用することをお勧めしませんgit stash popとの組み合わせを使用git stash applyしてgit stash drop、あなたが間違ったブランチにスタッシュを適用した場合...よく、時にはあなたのコードを回復することは困難です。


1

スタッシュと比較したいもの(ローカル作業ツリー/親コミット/ヘッドコミット)に応じて、実際にはいくつかのコマンドが利用可能で、その中に古き良きものgit diff、より具体的なものがありgit stash showます。

╔══════════════════════╦═══════════════════════════════╦═══════════════════╗
║ Compare stash with ↓ ║ git diff                      ║ git stash show    ║
╠══════════════════════╬═══════════════════════════════╬═══════════════════╣
║ Local working tree   ║ git diff stash@{0}            ║ git stash show -l ║
║----------------------║-------------------------------║-------------------║
║ Parent commit        ║ git diff stash@{0}^ stash@{0} ║ git stash show -p ║
║----------------------║-------------------------------║-------------------║
║ HEAD commit          ║ git diff stash@{0} HEAD       ║   /               ║
╚══════════════════════╩═══════════════════════════════╩═══════════════════╝

一方でgit stash show一目でルックスよりユーザーフレンドリー、git diff実際にはより強力な、それはより集中差分のためのファイル名を指定することができますということです。私は自分のzsh gitプラグインでこれらすべてのコマンドのエイリアスを個人的に設定しました。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.