211

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

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

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

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

4

3 に答える 3

285

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

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

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

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

于 2010-04-10T15:57:03.043 に答える
98

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

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

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

----O----*----*----/M----* <-- マスター <-- HEAD
     \ /
      \--.----.--/--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/、指定された名前のブランチ ヒントの痕跡を見つけて復活 (削除を取り消す) するのに役立ちます。

于 2010-04-11T13:35:16.667 に答える
2

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

于 2013-01-07T17:14:08.803 に答える