Git:ぶら下がっているコミット/ブロブとは何ですか?


148

ダングリングコミットとブロブに関する基本情報を探しています。

私のリポジトリは元気そうです。しかし、私はgit fsckそれが何をしているかを確認するために初めて走りました、そして、「ぶら下がっているブロブ」と単一の「ぶら下がりコミット」の長いリストがあります。

これは何だ?彼らはどこから来ましたか?彼らは私のレポの状態について何か異常なこと(良いか悪いか)を示していますか?

回答:


95

gitリポジトリでの作業中に、最終的に操作を取り消したり、中間のブロブを引き起こしたり、情報の損失を回避するためにgitが実行するいくつかのことを行ったりすることがあります。

最終的には(条件付きでgit gcのmanページによると)、ガベージコレクションを実行し、これらをクリーンアップします。ガベージコレクションプロセスを呼び出すことによって、強制することもできgit gcます。

この詳細については、git-scmサイトのメンテナンスとデータ復旧を参照してください。

GCの手動実行は、デフォルトで、セーフティネットのこのコマンドの実行の2週間前に残されます。実際、GCを時々実行して、gitリポジトリを確実に使用できるようにすることをお勧めします。しかし、何でもそうですが、自分にとって重要である可能性のあるものを破壊する前に、それが何をしているかを理解する必要があります。


10
したがって、1)私のリポジトリに何か問題があると思わない限りgit gc、でこれらを削除しても安全です。2)これらのぶら下がりビットは正常であり、すでにgitであるため、これを心配する必要はありません。それらを処理しますか?
doub1ejack 2013

7
それは公正な評価でしょう。
vgoff 2013

9
また、ファイルを「git add」するが、そのファイルの正確なバージョンをコミットしない場合は常に、ぶら下がっているblobになります。何も心配する必要はありません。
canton7 2013

7
doub1ejack-一般的に言えば、ガベージコレクションを手動で実行するべきではありません。中に入るのは悪い習慣であり、gitはとにかく必要なときにガベージコレクションを実行します。手動で実行することの欠点は、現在必要ではないかもしれないが、将来必要になる可能性がある未解決のBLOBとコミットを回復する機能が失われることです。ガベージコレクションを実行すると、gitからかなり強力な復帰機能が削除されます。規則ではなく、注意して例外として使用してください。--- gitに任せてください。
Elijah Lynn

95

Dangling blob =ステージング領域/インデックスに到達したがコミットされなかった変更。gitのすばらしい点の1つは、ステージング領域に追加されると、ハッシュを持っているという点でこれらのblobがコミットのように動作するため、いつでも元に戻すことができるということです。

Dangling commit =子のコミット、ブランチ、タグ、またはその他の参照によって直接リンクされていないコミット。あなたもこれらを取り戻すことができます!


5
「祖先」は「子孫」を読むべきですか?一般に、祖先を介してgit commitに到達することはできません。
Phil Miller、

@Novelocrat私は同じ考えを持っていました、私はそれがおそらく子孫を読むべきであることに同意します。
stkent 2015

1
私はまだあなたの答えで「アセンダント」を読みました。7月2日のエディションではタイプミスが修正されなかったようです。
iclman、2015年

ぶら下がっているブロブをどのようにして戻すのですか?
HelloGoodbye 2016年

1
@ElijahLynnその通りです。ディスカッションを少し早く読んだと思います。ぶら下がりコミットには子孫/子がなく、タグまたはブランチによって参照されません。
iclman

44

HOWTO http://www.tekkie.ro/news/howto-remove-all-dangling-commits-from-your-git-repository/からgitリポジトリからすべてのぶら下がりコミットを削除し ます

git reflog expire --expire=now --all
git gc --prune=now

結局のところ、必要な場合があるので、本当に削除したいか確認してください。


5
実際には、ほとんどのユーザーはこれを絶対に必要としないはずであり、必要な場合はおそらくプログラムによる使用例です。ぶら下がっているコミットを削除することで節約されたディスク領域や速度の向上は、私の考えでは努力する価値はありません。
Elijah Lynn

1
これは別の質問に答えます。
Elijah Lynn

5

ぶら下がりコミットとは、参照に関連付けられていないコミットです。つまり、参照に到達する方法がありません。

たとえば、次の図を検討してください。変更をマージせずにブランチfeatureXを削除するとします。関連付けられている参照がないため、コミットDはぶら下がりコミットになります。マスターにマージされていた場合、HEADとマスターの参照はDをコミットするように指示し、featureXを削除したとしても、ぶら下がることはありません。これについては、図の後にある注意事項をよく読んで理解してください。

Gitは、ぶら下がりコミットを自動的にガベージコレクション(つまり、破棄)します。を使用して、git reflogマージされずに削除された(ダングリングコミットの)ブランチを回復できます。削除されたコミットは、ローカルオブジェクトストアに存在する場合にのみ復元できます。ガベージコレクションされた場合、それを回復することはできません。

ここに画像の説明を入力してください

ブランチ名、つまりブランチラベルは、実際にはブランチの最新のコミット、つまりブランチの先端への参照であることに注意してください。上の図では、featureX、master、およびHEADは特定のコミットへの参照にすぎません。featureXとマスターラベルは、それぞれのブランチの最新のコミットを参照します。HEADは通常、現在チェックアウトされているブランチ(この場合はマスター)の先端を指します。現在のブランチで古いコミットをチェックアウトすると、HEADは切り離された状態になります。つまり、最新のコミットではなく古いコミットを指します。また、HEADは実際には現在のブランチラベルを指し、ブランチラベルは常にブランチの先端を指すので、HEADはシンボリックリファレンスと呼ばれることにも注意してください。したがって、通常の状況では、HEADは間接的に最新のコミットを指します。

余談ですが、Gitはコミットグラフ/履歴を有向非循環グラフとして表すことに注意してください。各コミットには、その親への参照があります。したがって、コミット図の矢印は、子コミットから親コミットを指しています。ブランチで古いコミットに到達するには、最新の子コミットへの参照が必要です。

PS-上の図と理解は、この無料コースから得られました。コースはかなり古いですが、知識はまだ関連しています。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.