web-dev-qa-db-ja.com

gitで、スタッシュを適用せずに追跡されていないスタッシュされたファイルを表示する方法はありますか?

git stash -uを実行すると、追跡されていないファイルを隠しておくことができます。ただし、追跡されていないファイルはgit stash show stash@{0}でまったく表示されません。 stashを適用せずに追跡されていないstashされたファイルを表示する方法はありますか?

96
Max Nanasy

追跡されていないファイルは、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番目の「ステージングされていない」親からの変更が含まれていないためです。

これは、スタッシュが再適用される方法が原因です。追跡されたファイルはパッチとして簡単に適用できますが、追跡されていないファイルは理論的には「ファイル全体」としてのみ適用できます。

115
Will Palmer

以下のコマンドを使用して、すべての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>

追跡されていないファイルのGrep

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
21
Steve

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番目の親には追跡されていないファイルへの変更(存在しない可能性があります)が含まれます。

これは 「ディスカッション」のマンページ で部分的に説明されています。

10
wisbucky

スタッシュ内のすべてのファイル(追跡されているものと追跡されていないものの両方)を表示するために、このエイリアスを構成に追加しました。

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に。

5
Randall

回避策:ファイルをstashする前にステージングすると、git stash show -p期待どおりに動作します。

git add .
git stash save

注:この方法により、インタラクティブな部分を追加する力も得られます ここに方法
注意:以前にステージングされた作業がないこと、またはそれを区別できないことを確認してください。
これは役に立つかもしれません。

3
weshouman