28

変更をブランチに隠してからそのブランチを削除するとどうなりますか?

(1) 隠した変更は失われますか?

例:

git stash
git checkout other_branch
git branch -D previous_branch

(2) また、上記の stash および delete ステップは、ブランチの変更をコミットしてからそのブランチを削除することと同等ですか (達成された最終状態に関して)? すなわち:

git commit -m "Dummy commit, I am terminating this branch"
git checkout other_branch
git branch -D previous_branch
4

2 に答える 2

20

(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_branchtag外に出ましたが、それらもまだそこにあります。それが を指していて、コミットを指している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

于 2013-09-18T08:59:37.237 に答える
7
  1. Stash は、作業ディレクトリのダーティ状態を取得し、スタックに保存します。何かを隠してから前のブランチを削除しても、隠した変更は消えません。次のコマンドを使用して、stash スタックにあるものを一覧表示できます。

git 隠しリスト

実際、スタッシュを保存し、別のブランチに切り替えて、スタッシュを再適用することができます。同じブランチに stash を適用する必要はありません。

2 番目のケースでは、stash を適用した後に git commit を実行する必要があります。

于 2013-09-18T09:00:28.677 に答える