web-dev-qa-db-ja.com

gitでブランチを削除すると、履歴から削除されますか?

Svnから来て、gitに慣れ始めたばかりです。

ブランチをGitで削除すると、履歴から削除されますか?

Svnでは、削除操作を元に戻すことでブランチを簡単に回復できます(逆マージ)。 svnでのすべての削除と同様に、ブランチは実際には削除されず、現在のツリーから削除されます。

ブランチがgitの履歴から実際に削除された場合、そのブランチからマージされた変更はどうなりますか?それらは保持されますか?

177
Ken Liu

ブランチは、gitのコミットへの単なるポインタです。 gitでは、各コミットには完全なソースツリーがあり、すべてのブランチとタグ(慣例により)は、特別な「トランク」と一緒にリポジトリの個別の「フォルダー」に存在するsvnとは非常に異なる構造です。

ブランチが削除される前に別のブランチにマージされた場合、最初のブランチが削除されたときに他のブランチからすべてのコミットに到達できます。それらは元のままです。

ブランチが別のブランチにマージされずに削除された場合、そのブランチのコミット(まだ到達可能なコミットからフォークされた時点まで)は表示されなくなります。

コミットは引き続きリポジトリに保持され、削除後すぐにリカバリすることは可能ですが、最終的にはガベージコレクションされます。

231
CB Bailey

Gitでは、ブランチは、コミットの有向非循環グラフ(DAG)でのコミットへの単なるポインター(参照)です。つまり、ブランチを削除すると、コミットへの参照のみが削除され、DAGの一部のコミットが到達不能になり、見えなくなる可能性があります。ただし、少なくとも到達不能なコミットがプルーニングされるまで(たとえば、git gcを使用して)、削除されたブランチ上のコミットはすべてリポジトリに残ります。

git branch -dは、ブランチを削除しても到達できないコミットが残らないことが確実でない場合、ブランチの削除を拒否することに注意してください。強力なgit branch -Dを使用して、到達できないコミットが残る可能性がある場合、ブランチを強制的に削除する必要があります。

また、到達できないコミットは、存在する場合、削除されたブランチの最後のチップと、別の既存のブランチ、タグ付きコミット、または分岐点にマージされたコミットの間のコミットのみであることに注意してください。どちらか遅い方。たとえば、次の状況では:

 ---- O ---- * ---- * ----/M ---- * <-master <-HEAD 
\/
\--.----.-- /-x --- y <-削除されたブランチ

ブランチを削除すると、コミット「x」と「y」のみが到達不能になります。

gc.reflogExpire期間(デフォルトは90日)以内に削除されたブランチを操作した場合、HEAD reflogに削除されたブランチの最後のヒントが記録されます(git reflog show HEADまたはgit log --oneline --walk-reflogs HEADを参照)。 HEAD reflogを使用して、削除されたポインターを回復できるはずです。また、この場合、削除されたブランチでの到達不能なコミットは、デフォルトで30日であるgc.reflogExpireUnreachable期間内のプルーニング(削除)から保護されることに注意してください。

HEADのreflogで削除されたばかりのブランチのヒントが見つからない場合は、git fsckを使用して "unreachable commit <sha1>"を見つけ、それらを調べて(git show <sha1>またはgit log <sha1>を介して)削除のヒントを見つけることができますブランチ。

削除されたブランチのヒントを見つける方法に関係なく、削除を取り消すか、代わりに削除したばかりのブランチを再作成できます

git branch <deleted-branch> <found-sha1-id>

ただし、ブランチのreflogは失われることに注意してください。


また、contrib/には git-resurrect.sh スクリプトがあり、指定された名前のブランチチップのトレースを見つけて、それを復活(削除の取り消し)するのに役立ちます。

80
Jakub Narębski

誤って削除されたブランチが心配で、リポジトリのローカルコピーがもうない場合は、GerritなどのエンタープライズGitサーバーに拡張機能があり、履歴の書き換えとブランチの削除を検出し、特別なrefでバックアップして、必要に応じて復元でき、ガベージコレクションによってプルーニングされません。 Gerrit管理者は、法的な理由で必要に応じて、選択したコミットを削除できます。

2