git stash -u
を実行すると、追跡されていないファイルを隠しておくことができます。ただし、追跡されていないファイルはgit stash show stash@{0}
でまったく表示されません。 stashを適用せずに追跡されていないstashされたファイルを表示する方法はありますか?
追跡されていないファイルは、stashコミットの3番目の親に格納されます。 (これは実際には文書化されていませんが、 -u機能を導入したコミット、787513 ... と _git-stash
フレーズで...またはgit log --graph stash@{0}
)を実行するだけで
次の方法で、スタッシュの「追跡されていない」部分だけを表示できます。
git show stash@{0}^3
または、単に「追跡されていない」ツリー自体、
git show stash@{0}^3:
または、ツリー内の特定の「追跡されていない」ファイル:
git show stash@{0}^3:<path/to/file>
残念ながら、すべてのステージング済み+アンステージング済み+トラッキングされていない状態と「現在の」状態の違いを要約する良い方法はありません。つまり、git show stash@{0}
に追跡されていないファイルを含めることはできません。これは、stash@{0}:
と呼ばれるstashコミット自体のツリーオブジェクトには、3番目の「ステージングされていない」親からの変更が含まれていないためです。
これは、スタッシュが再適用される方法が原因です。追跡されたファイルはパッチとして簡単に適用できますが、追跡されていないファイルは理論的には「ファイル全体」としてのみ適用できます。
以下のコマンドを使用して、すべてのstashコミットをリストできます。
git rev-list -g stash
Stashは、HEADの3方向マージコミット、インデックス、および追跡されていないファイルの親なしの「ルート」コミットとして表されるため、追跡されていないファイルスタッシュは、上記の出力を次のようにパイプすることでリストできます。
git rev-list -g stash | git rev-list --stdin --max-parents=0
上記の有用なアプリケーション:
git rev-list -g stash | git rev-list --stdin --max-parents=0 | xargs git show --stat
もちろん、--stat
ファイルの内容を表示します。
git rev-list -g stash | xargs -n1 git ls-tree -r | sort -u | grep <pattern>
git rev-list -g stash | git rev-list --stdin --max-parents=0 | xargs git grep <pattern>
git rev-list -g stash | git rev-list --stdin | xargs git show --stat
Stashで追跡されていないファイルを一覧表示するには:
git ls-tree -r stash@{0}^3 --name-only
すべての追跡されていないファイル(コンテンツを含む)の完全な差分を表示するには:
git show stash@{0}^3
これらのコマンドは、最後(最新)のスタッシュを読み取ります。以前のスタッシュの場合、「stash @」の後ろの数値を増やします。たとえば、最後のスタッシュから2番目の場合はstash@{2}
です。
これが機能する理由は、git stash
が各スタッシュのマージコミットを作成するためです。これはstash@{0}
、stash@{1}
などとして参照できます。このコミットの最初の親はHEAD stashの時点で、2番目の親には追跡されたファイルへの変更が含まれ、3番目の親には追跡されていないファイルへの変更(存在しない可能性があります)が含まれます。
これは 「ディスカッション」のマンページ で部分的に説明されています。
スタッシュ内のすべてのファイル(追跡されているものと追跡されていないものの両方)を表示するために、このエイリアスを構成に追加しました。
showstash = "!if test -z $1; then set -- 0; fi; git show --stat stash@{$1} && git show --stat stash@{$1}^3 2>/dev/null || echo No untracked files -"
表示したいスタッシュの 引数 が1つ必要です。 2つの連続したリストに表示されることに注意してください。
if...fi
セクション bash引数を変更 $ 1が渡されなかった場合は0に。
回避策:ファイルをstashする前にステージングすると、git stash show -p
期待どおりに動作します。
git add .
git stash save
注:この方法により、インタラクティブな部分を追加する力も得られます ここに方法 。
注意:以前にステージングされた作業がないこと、またはそれを区別できないことを確認してください。
これは役に立つかもしれません。