127

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

4

7 に答える 7

159

追跡されていないファイルは、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 commit自体のツリーオブジェクト(と呼ばれる)にstash@{0}:、3番目の「ステージングされていない」親からの変更が含まれていないためです。

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

于 2012-10-01T22:12:33.847 に答える
27

次のコマンドを使用して、すべてのstashコミットを一覧表示できます。

git rev-list -g 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
于 2014-05-17T13:55:04.320 に答える
15

スタッシュ内の追跡されていないファイルを一覧表示するには:

git ls-tree -r stash@{0}^3 --name-only

追跡されていないすべてのファイル(コンテンツを含む)の完全な差分を表示するには:

git show stash@{0}^3

これらのコマンドは、最後の(最新の)隠し場所を読み取ります。以前のスタッシュの場合、たとえば最後のスタッシュstash@{2}から2番目のように、「stash@」の後ろの番号を増やします。

これが機能する理由は、などgit stashとして参照できる各スタッシュのマージコミットを作成するためです。このコミットの最初の親はスタッシュ時のHEADであり、2番目の親には追跡されたファイルへの変更が含まれます。 3番目(存在しない可能性があります)は、追跡されていないファイルへの変更です。stash@{0}stash@{1}

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

于 2015-08-04T01:04:33.493 に答える
8

ただし、追跡されていないファイルは。でまったく表示されませんgit stash show stash@{0}

注:Git 2.11(2016年第4四半期、theis OPから4年後)以降、stashはそのインデックスでのみ参照できます

git stash show 0

git stashCで書き直されたため、Git 2.22で修正された最近のバグがありました(2019年第2四半期)

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

なぜそうです、Git 2.32(OPから9年後の2021年第2四半期)があります。

" git stash show" は、オプションで隠し場所の追跡されていない部分を表示することを学びました。

Denton Liu()によるcommit 0af760ecommit d3c7bf7(2021年3月3日)を参照してください。( Junio C Hamanoによってマージされました---コミットf5c73f6、2021年3月22日Denton-L
gitster

stash show:教え--include-untracked--only-untracked

サインオフ:Denton Liu

スタッシュエントリは、manを介して追跡されていないファイルで作成できます。git stash push --include-untracked

ただし、追跡されていないファイルはstashエントリ自体ではなくstashエントリの3番目の親に格納されるため、running manには追跡されていないファイルがdiffの一部として含まれません。git stash show

を使用--include-untrackedすると、スタッシュベースとスタッシュ内の作業ツリーの間で変更が加えられたパスに加えて、サードペアレントに記録されている追跡されていないパスが表示されます。

stashエントリ内の重複する追跡されていないファイルが追跡されたファイルをマスクする不正な形式のstashエントリを手動で作成することが可能です。
その場合、カスタムunpack_trees()コールバックを介して検出してエラーアウトしますstash_worktree_untracked_merge()

--only-untrackedまた、 stashエントリの追跡されていないファイルのみを表示するオプションをstashに教えます。これは(man
に似ていますが、ユーザーが基礎となる実装について考える必要がないように、便利な抽象化を提供するのは良いことです。git show stash^3

git stash現在、そのマニュアルページに含まれています:

'git stash' show [-u|--include-untracked|--only-untracked] [<diff-options>] [<stash>]

git stash現在、そのマニュアルページに含まれています:

--no-include-untracked

pushおよびコマンドとともに使用すると、save追跡されていないすべてのファイルも隠されてから、でクリーンアップされ git cleanます。

コマンドとともに使用する場合show、diffの一部としてstashエントリの追跡されていないファイルを表示します。

--only-untracked

showこのオプションは、コマンドに対してのみ有効です。
差分の一部として、stashエントリ内の追跡されていないファイルのみを表示します。


そして、これらの新しいオプションに対応する構成があります。

stash show: 学びstash.showIncludeUntracked

サインオフ:Denton Liu

前のコミットは(を教えています。 ユーザーが常に動作を有効にできることが望ましい場合があります。ユーザーがと同様の方法でこれを実行できるようにする構成オプションを 教えます。git stash show --include-untracked
--include-untracked
stash.showIncludeUntrackedstash.showPatch

git config現在、そのマニュアルページに含まれています:

stash.showIncludeUntracked

これがtrueに設定されている場合git stash show、オプションを指定しないコマンドは、スタッシュエントリの追跡されていないファイルを表示します。

デフォルトはfalseです。

git stash現在、そのマニュアルページに含まれています:

stash.showIncludeUntracked、、stash.showStatおよび stash.showPatchconfig変数を使用して、デフォルトの動作を変更できます。


Git 2.32(Q2 2021)では、追跡されていない部分を記録しないstashエントリでこれらのオプションが使用されたときに、 segfaultedされたstashの追跡されていない部分の周りの" git stash show" man)に最近追加されたオプションを処理するコード。

Denton Liu()によるcommit 1ff595dcommit aa2b05d(2021年5月12日)を参照してください。( Junio C Hamanoによってマージされました---コミットa8a2491 、20215月16日)Denton-L
gitster

stash show:セグメンテーション違反を修正--{include,only}-untracked

サインオフ:Denton Liu

manまたはmanが追跡されていないエントリを含まない隠し場所で実行されると、セグメンテーション違反が発生します。git stash show --include-untrackedgit stash show --only-untracked

これは、追跡されていないエントリが実際に存在するかどうかをチェックせず、盲目的に逆参照しようとするために発生します。

実際に間接参照を試みる前に、追跡されていないエントリが存在することを確認してください。

と:

Denton Liu()によるcommit af5cd44(2021年5月21日)を参照してください。( Junio C Hamanoによってマージされました---コミット378c7c6、2021年5月22日Denton-L
gitster

stash show:オプションが指定されているstash.showIncludeUntracked場合でも使用diff

サインオフ:Denton Liu

差分の表示方法に関するオプションがmanに提供されている場合、コマンドは構成変数を無視し、デフォルトで追跡されていないファイルを表示しません。 これは、diff出力の形式と、追跡されていないファイルを表示するかどうかが直交しているため、直感的ではありません。git stash showstash.showIncludeUntracked

stash.showIncludeUntracked差分オプションが指定されている場合でも使用します。
もちろん、これはコマンドラインオプションを介してオーバーライドできます。

ドキュメントを更新して、diffオプションが指定されたときにどの構成変数がオーバーライドされるかを明示的に示します。

git config現在、そのマニュアルページに含まれています:

これがに設定されている場合truegit stash showコマンドはstashエントリの追跡されていないファイルを表示します。

デフォルトはfalse

git stash現在、そのマニュアルページに含まれています:

noが指定されていない場合、デフォルトの動作は、およびconfig変数<diff-option>によって与えられます。stash.showStatstash.showPatch

デフォルトで有効にするstash.showIncludeUntrackedかどうかを設定する ために使用することもできます。--include-untracked

于 2021-03-27T12:37:53.640 に答える
6

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

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に変更します。

于 2016-06-08T22:50:52.480 に答える
6

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

git add .
git stash save

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

于 2016-10-07T10:11:51.480 に答える
0

2.32未満のgitを使用して、追跡されていないファイルで正しいスタッシュを見つけて適用するのに問題がありました。

追跡されていないファイルと日付を含む隠し場所を見つけるために、このコマンドを使用しました。

git rev-list -g stash | git rev-list --stdin --max-parents=0 | xargs git show --stat

別のコマンドを使用して、特定の日付の正しいスタッシュ位置を見つけるために、日付のあるスタッシュのリストを表示した後:

git stash list --date=local

git stash listその後、隠し場所の名前を見つけてそれを適用するために、もう一度使用しますgit stash apply

それは私のために働いた。これが他の誰かのために働くことを願っています!

于 2021-07-07T13:24:47.300 に答える