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