Git stash から単一のファイル (またはファイルへの変更) を抽出するにはどうすればよいでしょうか? 質問する

Git stash から単一のファイル (またはファイルへの変更) を抽出するにはどうすればよいでしょうか? 質問する

stash の変更セットを削除せずに、git stash から単一のファイルまたはファイルの diff を抽出することは可能ですか?

ベストアンサー1

上のgit スタッシュman ページでは (「オプション」の説明の直後の「ディスカッション」セクションに) 次のことが書かれています:

スタッシュは、作業ディレクトリの状態を記録するツリーを持つコミットとして表され、その最初の親はスタッシュが作成された時点の HEAD のコミットです。

したがって、スタッシュ (たとえば、stash@{0}最初/最上位のスタッシュ) をマージ コミットとして扱い、次のように使用できます。

$ git diff stash@{0}^1 stash@{0} -- <filename>

説明:stash@{0}^1指定されたスタッシュの最初の親を意味します。これは、上記の説明で述べたように、変更がスタッシュされたコミットです。/ はstash@{0}マージrefs/stashコミットであり、どの親と diff するかを git に伝える必要があるため、この形式の「git diff」(2 つのコミットを使用) を使用します。さらに分かりやすく言うと、

$ git diff stash@{0}^! -- <filename>

も動作するはずです(git rev-parse構文の説明についてはrev^!、man ページの「範囲の指定」セクションを参照してください。

同様に、git チェックアウトスタッシュから 1 つのファイルをチェックアウトするには:

$ git checkout stash@{0} -- <filename>

または別のファイル名で保存するには:

$ git show stash@{0}:<full filename>  >  <newfile>

または

$ git show stash@{0}:./<relative filename> > <newfile>

(ここで、<full filename> は、プロジェクトの最上位ディレクトリを基準としたファイルのフルパス名であることに注意してくださいstash@{0}( に相対的であると考えてください))。


stash@{0}シェルの拡張から保護する必要がある場合があります。つまり、"stash@{0}"または を使用します。'stash@{0}'

おすすめ記事