を実行するgit stash -u
と、追跡されていないファイルを隠しておくことができます。ただし、追跡されていないファイルは。でまったく表示されませんgit stash show stash@{0}
。スタッシュを適用せずに、追跡されていないスタッシュファイルを表示する方法はありますか?
7 に答える
追跡されていないファイルは、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番目の「ステージングされていない」親からの変更が含まれていないためです。
これは、スタッシュが再適用される方法によるものです。追跡されたファイルはパッチとして簡単に適用できますが、追跡されていないファイルは、理論的には「ファイル全体」としてのみ適用できます。
次のコマンドを使用して、すべての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
スタッシュ内の追跡されていないファイルを一覧表示するには:
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}
これは、「ディスカッション」のマンページで部分的に説明されています。
ただし、追跡されていないファイルは。でまったく表示されません
git stash show stash@{0}
。
注:Git 2.11(2016年第4四半期、theis OPから4年後)以降、stashはそのインデックスでのみ参照できます
git stash show 0
git stash
Cで書き直されたため、Git 2.22で修正された最近のバグがありました(2019年第2四半期)
スタッシュを適用せずに、追跡されていないスタッシュファイルを表示する方法はありますか?
なぜそうです、Git 2.32(OPから9年後の2021年第2四半期)があります。
" git stash show
" (男)は、オプションで隠し場所の追跡されていない部分を表示することを学びました。
Denton Liu()によるcommit 0af760e、commit 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.showIncludeUntracked
stash.showPatch
git config
現在、そのマニュアルページに含まれています:
stash.showIncludeUntracked
これがtrueに設定されている場合
git stash show
、オプションを指定しないコマンドは、スタッシュエントリの追跡されていないファイルを表示します。デフォルトはfalseです。
git stash
現在、そのマニュアルページに含まれています:
stash.showIncludeUntracked
、、stash.showStat
およびstash.showPatch
config変数を使用して、デフォルトの動作を変更できます。
Git 2.32(Q2 2021)では、追跡されていない部分を記録しないstashエントリでこれらのオプションが使用されたときに、 segfaultedされたstashの追跡されていない部分の周りの" git stash show
" (man)に最近追加されたオプションを処理するコード。
Denton Liu()によるcommit 1ff595d、commit aa2b05d(2021年5月12日)を参照してください。( Junio C Hamanoによってマージされました---コミットa8a2491 、2021年5月16日)Denton-L
gitster
stash show
:セグメンテーション違反を修正--{include,only}-untracked
サインオフ:Denton Liu
(man)または(man)が追跡されていないエントリを含まない隠し場所で実行されると、セグメンテーション違反が発生します。
git stash show --include-untracked
git 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 show
stash.showIncludeUntracked
stash.showIncludeUntracked
差分オプションが指定されている場合でも使用します。
もちろん、これはコマンドラインオプションを介してオーバーライドできます。ドキュメントを更新して、diffオプションが指定されたときにどの構成変数がオーバーライドされるかを明示的に示します。
git config
現在、そのマニュアルページに含まれています:
これがに設定されている場合
true
、git stash show
コマンドはstashエントリの追跡されていないファイルを表示します。デフォルトは
false
。
git stash
現在、そのマニュアルページに含まれています:
noが指定されていない場合、デフォルトの動作は、およびconfig変数
<diff-option>
によって与えられます。stash.showStat
stash.showPatch
デフォルトで有効にする
stash.showIncludeUntracked
かどうかを設定する ために使用することもできます。--include-untracked
スタッシュ内のすべてのファイル(追跡されているものと追跡されていないものの両方)を表示するために、次のエイリアスを構成に追加しました。
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に変更します。
回避策:ファイルをスタッシュする前にステージングするとgit stash show -p
、期待どおりに機能します。
git add .
git stash save
注:この方法では、インタラクティブな部分を追加することもできます。方法は次のとおりです。
注意:以前にステージングされた作業がないことを確認してください。そうしないと、作業を区別できなくなります。
これは役に立つかもしれません。
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
。
それは私のために働いた。これが他の誰かのために働くことを願っています!