回答:
ブランチはgitのコミットへのポインタにすぎません。gitでは、各コミットに完全なソースツリーがあります。これはsvnとは非常に異なる構造であり、すべてのブランチとタグ(慣例により)は、特別な「トランク」とともにリポジトリの個別の「フォルダー」にあります。
ブランチが削除される前に別のブランチにマージされた場合、最初のブランチが削除されても、他のブランチからすべてのコミットに到達できます。彼らはそのままでした。
ブランチが別のブランチにマージされずに削除された場合、そのブランチのコミット(まだ到達可能なコミットから分岐されたポイントまで)は表示されなくなります。
コミットは引き続きリポジトリに保持され、削除後すぐに回復することができますが、最終的にはガベージコレクションされます。
Gitでは、ブランチはコミットの有向非循環グラフ(DAG)でのコミットへの単なるポインター(参照)です。つまり、ブランチを削除すると、コミットへの参照のみが削除され、DAG内の一部のコミットが到達不能になり、見えなくなる可能性があります。ただし、削除されたブランチにあったすべてのコミットは、少なくとも到達不能なコミットがプルーニングされる(たとえばを使用するgit gc
)まで、リポジトリに残ります。
git branch -d
削除しても到達できないコミットが残されないことが確実でない場合は、ブランチの削除を拒否することに注意してください。git branch -D
到達不能なコミットを残す可能性がある場合は、強力なブランチを使用してブランチを強制的に削除する必要があります。
また、到達不能なコミットが存在する場合、それは削除されたブランチの最後のヒントと、別の既存のブランチにマージされたコミット、タグ付きコミット、またはブランチポイントの間のコミットのみであることにも注意してください。どちらか遅い方です。たとえば、次の状況で:
---- O ---- * ---- * ---- / M ---- * <-マスター<-ヘッド \ / \ --.----.-- /-x --- y <-削除されたブランチ
ブランチを削除すると、「x」と「y」だけが到達不能になります。
gc.reflogExpire
デフォルトの90日の期間内に削除されたブランチを操作した場合、削除されたブランチの最後のヒントがHEAD reflogに記録されます(git reflog show HEAD
またはを参照git log --oneline --walk-reflogs HEAD
)。HEAD reflogを使用して、削除されたポインターを回復できるはずです。また、この場合、削除されたブランチのみの到達不能なコミットは、gc.reflogExpireUnreachable
期間(デフォルトでは30日)内のプルーニング(削除)から保護されることにも注意してください。
HEADのreflogで削除したばかりのブランチの先端が見つからない場合は、を使用git fsck
して「到達不能コミット<sha1>」を見つけ、それらを調べて(git show <sha1>
またはを介してgit log <sha1>
)削除したブランチの先端を見つけます。
削除したブランチの先端を見つける方法に依存せず、削除を取り消すか、削除したブランチを次のように再作成できます。
git branch <deleted-branch> <found-sha1-id>
ただし、ブランチのreflogは失われることに注意してください。
git-resurrect.shスクリプトもありcontrib/
、指定された名前のブランチチップのトレースを検索して、復活(削除解除)するのに役立ちます。
git reflog show HEAD
コミットをリストし、あなたが言ったように新しいブランチを作成しました。