回答:
上のgitのstash manページあなたが(ちょうど「オプション」の説明の後、「ディスカッション」セクションで)読むことができます:
stashは、ツリーが作業ディレクトリの状態を記録するコミットとして表され、その最初の親は、stashが作成されたときのHEADでのコミットです。
したがって、スタッシュ(たとえばstash@{0}
、最初/一番上のスタッシュ)をマージコミットとして扱い、次のように使用できます。
$ git diff stash@{0}^1 stash@{0} -- <filename>
説明:stash@{0}^1
所定のスタッシュの最初の親を意味します。これは、上記の説明で述べたように、変更が隠されたコミットです。stash@{0}
/ refs/stash
はマージコミットなので、この形式の「git diff」(2つのコミット)を使用します。比較する親をgitに指示する必要があります。より不可解な:
$ git diff stash@{0}^! -- <filename>
動作するはずです(構文の説明については、「範囲の指定」セクションのgit rev-parseマンページを参照してくださいrev^!
)。
同様に、git checkoutを使用して、スタッシュから単一のファイルをチェックアウトできます。
$ git checkout stash@{0} -- <filename>
または別のファイル名で保存するには:
$ git show stash@{0}:<full filename> > <newfile>
または
$ git show stash@{0}:./<relative filename> > <newfile>
(ここで、<完全なファイル名>は、プロジェクトのトップディレクトリに対するファイルの完全なパス名であることに注意してください(:からの相対と考えてくださいstash@{0}
))。
stash@{0}
シェル拡張から保護する必要がある場合があります。つまり、"stash@{0}"
またはを使用します'stash@{0}'
。
git checkout
のmanページを再確認しました。ファイルを別の場所にドロップすることはできません。このへの参照があります:stackoverflow.com/questions/888414/...は
git checkout
方法では、スタッシュから正確なファイルがコピーされることに注意してください。この方法では、作業ディレクトリにあるファイルとはマージされませんgit stash apply
。(つまり、スタッシュが作成されたベースから変更がある場合、それらは失われます)。
git stash apply
ファイルが作業ツリー内のファイルが上演されなければならないことを、隠したので、作業ツリーに変更されたファイルに変更をマージします。自動マージが機能するためには、作業コピーとマージされて隠されたコピーの両方で同じファイルを変更することはできません。最後に、stash applyは、アイテムをstashから削除しませんgit stash pop
。
git stash apply
ではなくを使用するgit stash pop
と、作業ツリーにスタッシュが適用されますが、スタッシュは保持されます。
これが完了したら、必要なファイルをadd
/しcommit
て、残りの変更をリセットできます。
git stash pop stash@{0}
git stash list
stashを含め、任意のブランチから変更を取得する簡単な方法があります。
$ git checkout --patch stash@{0} path/to/file
多くの部分にパッチを適用する場合は、ファイル仕様を省略できます。または、パッチ(パスではなく)を省略して、単一のファイルに対するすべての変更を取得します。複数ある場合0
は、のスタッシュ番号に置き換えgit stash list
ます。これはのようなものdiff
であり、ブランチ間のすべての違いを適用することを提案していることに注意してください。単一のコミット/スタッシュのみから変更を取得するには、をご覧くださいgit cherry-pick --no-commit
。
git help checkout
。--patch
インタラクティブなマージを行い、シェルで承認したすべてのハンク(またはe
パッチを適用することを選択した場合は保存したもの)を適用します。私が書いたように、「すべての変更」というように、パスだけでファイルが上書きされます。
git config --global alias.applydiffat '!git checkout --patch "$1" -- $(git diff --name-only "$1"^ "$1")'
-実行git applydiffat stash@{4}
すると、スタッシュとその親の間で変更されたファイルのみが使用されます。
ファイル全体を表示するには: git show stash@{0}:<filename>
差分を確認するには: git diff stash@{0}^1 stash@{0} -- <filename>
diff
てdifftool
、お気に入りの外部差分を使用できます。
$ git checkout stash@{0} -- <filename>
ノート:
「-」とファイル名パラメーターの後にスペースを入れてください。
zero(0)を特定のスタッシュ番号に置き換えます。stashリストを取得するには、以下を使用します。
git stash list
JakubNarębskiの回答に基づく-短いバージョン
「git show stash@{0}
」(またはスタッシュの番号が何であれ、「git stash list」を参照)でスタッシュの差分を取得できます。1つのファイルのdiffのセクションを抽出するのは簡単です。
git show stash
最上位の隠し場所(通常は唯一の隠し場所)を表示するために使用します。同様に、現在のブランチとスタッシュの差分をで表示できますgit diff head stash
。
隠しておいたファイルを現在のバージョンとマージする必要がある場合は、diffを使用して以前の方法を使用します。それ以外の場合はgit pop
、それらをアンスタッシュするgit add fileWantToKeep
ため、ファイルをステージングするために使用し、git stash save --keep-index
ステージ上にあるもの以外のすべてをスタッシュするためにを実行する場合があります。この方法と以前のものとの違いは、ファイルをstashから「ポップ」することです。以前の答えはそれを維持するgit checkout stash@{0} -- <filename>
ので、それはあなたのニーズに応じて行きます。
Visual Studio CodeでGit Stash拡張機能を使用する