(1) いいえ。によって保存された変更git stashは、コミットのペア (または場合によってはトリオ) として保存されます。これらのコミットは名前で参照されますstash。ブランチ名とタグをコミットのラベルと考える場合 (これがそのようなものです)、次のように絵を描くことができます。
O1 - O2 <-- other_branch
/
M1 - M2 - M3 - M4 <-- master
\
B1 - B2 - B3 <-- branch
.
.......................<-- tag
(タグの色を変えることができれば、これはうまくいくかもしれません。ドットを使用して、タグが「ブランチ上」であるtagcommit を指していることを示しました)。B1branch
ブランチbranchにいて、保存されていない変更があり、 run を実行するとgit stash、次のようになります。
/
M1 - M2 - M3 - M4 <-- master
\
B1 - B2 - B3 <-- HEAD=branch
| \
i - w ........<-- stash
(私はダイアグラムを離れother_branchてtag外に出ましたが、それらもまだそこにあります。それが を指していて、コミットを指しているHEAD=branchことを暗示するために書きました。)HEADbranchbranchB3
ここiとは、あなたが編集wした「インデックス」と「ワークツリー」の状態です。stash名前は commitをstash直接指し、最初の親と 2 番目の親として2 つの親 (実際にはまったくマージではありませんが、「マージ コミット」です) を持ちます。wwB3i
を実行するgit branch -Dと、ラベルを消去するだけです。それでは、あなたgit checkout other_branchと言って、ラベルを消去してみましょうbranch。今、あなたはこれを持っています:
O1 - O2 <-- HEAD=other_branch
/
M1 - M2 - M3 - M4 <-- master
\
B1 - B2 - B3
| \
i - w ........<-- stash
直接ラベルはありませんB3が、stash は を指しw、 をw指していB3ます。したがって、すべてはまだそこにあり、stash (または reflog、またはその両方)B3が git の内部レーダーを監視している限り、そこに残ります。
(2) いいえ: ご覧のとおり、stash にはまだブランチへの参照があります。ただし、その stash をドロップすると (つまり、stashラベルを消去すると) git stash drop、たとえば次のようになります。
O1 - O2 <-- HEAD=other_branch
/
M1 - M2 - M3 - M4 <-- master
\
B1 - B2 - B3
| \
i - w
すべての変更をgit add-ed およびed した場合、(単一のマージではない) コミットが得られ、これをongit commitと呼ぶことができます。ブランチ ラベルは を指すように移動されており、ラベルをチェックアウトして削除すると、次のようになります。B4branchB4other_branch
O1 - O2 <-- HEAD=other_branch
/
M1 - M2 - M3 - M4 <-- master
\
B1 - B2 - B3 - B4
これはほぼ (完全ではありませんが) 同じです。
(タグtagがまだ を指している場合、タグも消去されるまでコミットは残ります。 、または を介したコミットB1は、そこにとどまっている限りのみ残りますが、reflog には表示されません。30 日後 (またはその他) reflog の有効期限を設定した場合)、reflog エントリは期限切れになり、それらのコミットはガベージ コレクションの対象になります。)B1B2B4B2w