2016-09-08 8 views
0

を退治した後にコミット私はGitリポジトリにコミットの束を押しつぶした後、私はまだ、個々のコミットを見ることができるだということに気づきました。すべての他のもので潰れてしまったコミットの1つは、それが復帰したコミットのハッシュを参照するコミットメッセージを持つ復帰でした。このハッシュでgit showを実行すると、このコミットの正確な内容がわかります。このコミットは、1つのコミットに押しつぶされて以来、私の歴史のどこにもありません。表示個人が

これはどのように可能ですか?これはまだDAGのどこかにありますか? git gcのようなものが実行されると、最終的にGitによってガベージコレクトされますか?

+1

基本的に、はい。 :-) – melpomene

答えて

2

はい:あなたがGitの中でほとんど何もを行うたび、あなたは本当に、リポジトリへの新しいオブジェクト(コミットやファイルなど)を追加する場所で、既存のオブジェクトを残しています。主な例外はgit gcですが、有効期限が切れるまで既存のオブジェクトだけを残します。

正確な有効期限は少し複雑です。すべてのオブジェクトは、通常、彼らは(つまり、オブジェクトがどこにも記録されていない時にも、数秒から数分を、かかる場合があります)遅い操作中に削除されないだけように、少なくとも2週間のために生きます。参照-な枝にコミット、または-normallyもあたり、ブランチREFLOGHEADための個別のログがあります)に書き込まれますHEADに記録されているように書き込ま

その向こう

、オブジェクトID(主にIDをコミット)。これらは書かれた時点でタイムスタンプが付けられており、このようなエントリはデフォルトでは30日間または90日間存続します。長く生きるものは、参照の先端から到達なものである:つまり、HEADため、HEADの歴史に残っていることコミットし、枝のために、枝の上に残っていることにコミットします。寿命が短く、有効期限が30日であるコミットは、ブランチ上になくなった(リベースされた、および/または押し潰された)コミットです。

これらのreflogエントリは、Grim Reaperコレクタからオブジェクトを保護します。つまり、これは、古いコミットが、すべてが取得する14日間だけでなく、30日間にわたって行われることを意味します。参照を削除

は、例えば、git branch -D branchは、そのREFLOGが同様に除去されるようにします。したがって、reflogエントリが削除されたブランチにのみ存在する場合、猶予期間はオブジェクトの作成から14日間に縮小される可能性があります。

リベースされたコミットは、何か(通常は別のリベース)がORIG_HEADを上書きするまで、特殊名ORIG_HEADによっても参照されます。これは、30日のデフォルトを過ぎてもコミットを保護することができます。

実際にはgit gcまでは、オブジェクトを実行して削除しますが、それは固執します。一般的にクローンにコピーされることはありませんが、git gcを実行する必要がなければ、何年も前からリポジトリにアクセスしてアクセス可能です。

+0

これは非常に徹底的な答えであり、多くのことを説明してくれてありがとう! – Aaron

関連する問題