回答:
追跡されていないファイルは、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コミット自体のツリーオブジェクトにstash@{0}:
、3番目の「ステージングされていない」親からの変更が含まれていないためです。
これは、スタッシュが再適用される方法が原因です。追跡されたファイルはパッチとして簡単に適用できますが、追跡されていないファイルは理論的には「ファイル全体」としてのみ適用できます。
git log --graph --topo-order -m -u
。matthewlmcclure.com/s/2014/01/10/…–
fatal: ambiguous argument 'stash@{0}^3': unknown revision or path not in the working tree.
あなたがいる場合)はありません実際にそのスタッシュに人跡未踏のファイルを持っている(しかし、あなたがやったと思いました)。
git stash show
ません(少なくともgit 2.7.4ではtrue):
git stash pop
最初に追跡されていないファイルの復元を試み、次に追跡されたファイルの復元を試みます。後者の操作が失敗した場合(競合など)、最初の操作はロールバックされないため(untracked-file-stashはそのまま残りますが、ファイルはディスクから削除されません)、競合を修正しても次のポップは失敗しますとにかく。
次のコマンドを使用して、すべての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 @」の後ろの数字を増やしますstash@{2}
。たとえば、最後のスタッシュから2番目のスタッシュです。
理由この作品はつまりgit stash
、マージのように参照することができ、各スタッシュ、のためにコミット作成しstash@{0}
、stash@{1}
この最初の親がスタッシュの時のヘッドでコミットなど、第二の親は、追跡ファイルへの変更が含まれており、 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の引数に変更し、何も渡されなかった場合は0に$ 1。
git stash show
作業コピーと#1の差分を表示しているように見えます(git-stash.sh:からの関連コード、git diff ${FLAGS:---stat} $b_commit $w_commit
$ b_commitが#1、$ w_commitがstashコミットです)。git stash show
#3を含めるための組み込みの方法はありますか?