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


100

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

回答:


121

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

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


したがって、stashコミットの親は(1.コミットstashは2.に対して行われます。インデックス3.追跡されていない作業コピー)、そしてstashコミット自体に追跡された作業コピーが含まれますか? 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を含めるための組み込みの方法はありますか?
Max Nanasy、2012年

あなたが言うように、スタッシュの単一の概要ビューを取得する方法は見つかりませんでしたが、次のコマンドを使用すると、1つのコマンドでその完全な情報を確認できますgit log --graph --topo-order -m -umatthewlmcclure.com/s/2014/01/10/…–
Matt McClure

4
あなたは(醜いエラーを取得することに注意してくださいfatal: ambiguous argument 'stash@{0}^3': unknown revision or path not in the working tree.あなたがいる場合)はありません実際にそのスタッシュに人跡未踏のファイルを持っている(しかし、あなたがやったと思いました)。
Randall

2
@antak:いいえ、追跡されていないファイル表示されgit stash showませ(少なくともgit 2.7.4ではtrue):
NorbertBérci2017年

1
注(2.13.2-linux):git stash pop最初に追跡されていないファイルの復元を試み、次に追跡されたファイルの復元を試みます。後者の操作が失敗した場合(競合など)、最初の操作はロールバックされないため(untracked-file-stashはそのまま残りますが、ファイルはディスクから削除されません)、競合を修正しても次のポップは失敗しますとにかく。
マリノス

22

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

10

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

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


5

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

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。


5

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

git add .
git stash save

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.