gitのでブランチを削除すると履歴からそれを削除していますか?
-
26-09-2019 - |
質問
SVNから来て、ちょうどgitのに慣れ始めています。
ブランチはgitのに削除された場合、、それが履歴から削除されますか?
SVNでは、あなたは簡単に削除操作(逆マージを)戻すことで枝を回復することができます。分岐が実際に削除されることはありませんSVNのすべての削除と同じように、それは単に現在のツリーから削除されます。
分岐が実際にはgitで履歴から削除された場合は、、何がそのブランチからマージされた変更になりますか?彼らは保持されていますか?
解決
ブランチはgitのコミット中にだけポインタです。 gitのでは、それぞれが完全なソースツリーを持ってコミット、それは特別な「トランク」と並んで、リポジトリの別々のフォルダ "内(慣例により)すべてのブランチとタグがライブのsvnとは非常に異なった構造である。
それが、その後削除された前の分岐が別のブランチにマージされた場合は最初の分岐が削除されたときにコミットのすべてが、まだ他のブランチから到達可能になります。彼らがいたとして、彼らは正確に残っています。
ブランチがそのブランチのコミット(からフォーク時点までは、それがまだ到達可能なコミット)別のブランチにマージされずに削除された場合は、視認できなくなります。
のコミットはまだリポジトリに保持され、すぐに削除した後にそれらを回収することが可能であるが、最終的に彼らはゴミを収集されます。
他のヒント
でGitに、ブランチはコミットの非循環有向グラフ(DAG)にコミットするだけポインタ(参照)です。ブランチを削除すると、DAG内のいくつかのコミットは、到達不能ように見えなくなるかもしれないのコミットへの参照のみを削除することをこの意味。しかし、削除された枝の上にあったすべてのコミットはまだ到達できないコミットが(例えばgit gc
を使用して)剪定取得少なくともするまで、リポジトリになります。
git branch -d
はブランチを削除することを拒否することを注。あなたはそれが到達不能コミットを残す可能性がある場合は、分岐の力の削除に強いgit branch -D
を使用する必要があります。
注意も到達不能コミットは、のみ削除された枝の最後の先端との間にコミットしているGOTがどのコミットタグを付け、他の既存のブランチにマージ、または分岐点コミットのいずれかであることを。どちらかは後です。たとえば、次のような状況でます:
----O----*----*----/M----* <-- master <-- HEAD \ / \--.----.--/--x---y <-- deleted branch
のみコミットの「x」と「y」はブランチを削除した後、到達不能になってしまう。
あなたはgc.reflogExpire
期間内に削除されたブランチ上で動作している場合、デフォルトの90日には、あなたがHEADのREFLOGに記録されて削除された枝の最後の先端を持っているでしょう(git reflog show HEAD
、またはgit log --oneline --walk-reflogs HEAD
を参照してください)。あなたは、削除されたポインタを回復するためにHEADのREFLOGを使用することができるはずです。注また、この場合には、単に削除したブランチに到達できないコミットはデフォルトで30日ですgc.reflogExpireUnreachable
期間内(削除)剪定から保護されるだろう。
、あなたは見つけることgit fsck
を使用しようとすることができ、「到達不能git show <sha1>
またはgit log <sha1>
経由)これらを調べます削除された枝のます。
あなたが削除された枝の先端を見つける方法についての独立したが、あなたは削除を取り消すことができ、あるいはむしろ
を使用して、単に削除したブランチを再作成しますgit branch <deleted-branch> <found-sha1-id>
注しかしブランチのREFLOGが失われてしまうこと。
<時間>もあります git-resurrect.shする指定された名前と復活(元に戻す)こと。
との分岐先端の痕跡を見つけることができますcontrib/
でスクリプト 、そこに歴史の書き換えや枝の削除を検出しますヘリットのような企業のGitサーバへの拡張は、ある特殊なREFの下でそれらをバックアップします彼らは必要に応じて復元することができ、ガベージコレクションによって剪定されませんように。法律上の理由のために必要であれば、ゲリット・管理者が選択したままのコミットを削除することができます。