Git: apa itu komit / gumpalan menjuntai dan dari mana mereka berasal?

148

Saya mencari info dasar tentang menggantung komit & gumpalan.

Repo saya sepertinya baik-baik saja. Tetapi saya berlari git fsckuntuk pertama kalinya untuk melihat apa yang dilakukannya dan saya memiliki daftar panjang 'gumpalan menggantung' dan satu 'komit menggantung'.

Benda apa ini? Dari mana mereka berasal? Apakah mereka menunjukkan sesuatu yang tidak biasa (baik atau buruk) tentang keadaan repo saya?

ragu1jack
sumber

Jawaban:

95

Selama bekerja dengan repositori git Anda, Anda mungkin akan mundur dari operasi, dan membuat gerakan lain yang menyebabkan gumpalan perantara, dan bahkan beberapa hal yang git lakukan untuk Anda untuk membantu menghindari hilangnya informasi.

Akhirnya (secara kondisional, menurut halaman manual git gc ) ia akan melakukan pengumpulan sampah dan membersihkan semuanya. Anda juga dapat memaksanya dengan menjalankan proses pengumpulan sampah git gc,.

Untuk informasi lebih lanjut tentang ini, lihat Pemeliharaan dan Pemulihan Data di situs git-scm.

Jalankan GC secara manual akan secara default meninggalkan 2 minggu sebelum runtime dari perintah jaring pengaman ini. Sebenarnya dianjurkan untuk menjalankan GC sesekali untuk membantu memastikan kinerja pemain atas repositori git Anda. Namun, seperti halnya apa pun, Anda harus memahami apa yang dilakukannya sebelum menghancurkan hal-hal yang mungkin penting bagi Anda.

vgoff
sumber
10
Jadi wajar untuk mengatakan bahwa 1) kecuali saya pikir ada sesuatu yang salah dengan repo saya aman untuk menghapus ini dengan git gc, dan 2) saya tidak perlu khawatir tentang ini sama sekali karena bit menggantung ini normal dan git sudah tangani mereka?
doub1ejack
7
Itu akan menjadi penilaian yang adil.
vgoff
9
Juga, setiap kali Anda git menambahkan 'file, tetapi jangan komit versi file yang tepat, Anda berakhir dengan gumpalan menggantung. Tidak ada yang perlu dikhawatirkan.
canton7
7
doub1ejack - Secara umum Anda tidak harus menjalankan pengumpulan sampah secara manual. Merupakan kebiasaan buruk untuk masuk dan git melakukan pengumpulan sampah saat dibutuhkan. Kerugian untuk menjalankannya secara manual adalah Anda kehilangan kemampuan untuk memulihkan gumpalan yang menggantung dan melakukan yang mungkin tidak Anda inginkan sekarang tetapi mungkin Anda inginkan di masa depan. Setelah Anda menjalankan pengumpulan sampah, Anda menghilangkan beberapa fungsi pengembalian yang cukup kuat dari git. Gunakan dengan hati-hati dan sebagai pengecualian, bukan aturannya. --- Biarkan saja git melakukan hal itu.
Elijah Lynn
95

Menggantung gumpalan = Perubahan yang membuatnya ke area pementasan / indeks tetapi tidak pernah mendapat komitmen. Satu hal yang luar biasa dengan git adalah bahwa setelah ditambahkan ke area pementasan, Anda selalu dapat mendapatkannya kembali karena gumpalan ini berperilaku seperti komit karena mereka juga memiliki hash !!

Komitmen menggantung = Komit yang tidak langsung ditautkan oleh komit anak, cabang, tag atau referensi lainnya. Anda bisa mendapatkan ini juga!

Elijah Lynn
sumber
5
Haruskah 'leluhur' membaca 'keturunan'? Secara umum, Anda tidak dapat mencapai git commit melalui leluhurnya.
Phil Miller
@Novelocrat Saya punya pemikiran yang sama, saya setuju mungkin harus membaca keturunan.
stkent
1
Saya masih membaca "ascendant" dalam jawaban Anda. Tampaknya edisi Anda mulai 2 Juli tidak memperbaiki kesalahan ketik.
iclman
Bagaimana Anda mendapatkan kembali gumpalan yang menggantung?
HelloGoodbye
1
@ElijahLynn Anda benar. Saya pikir saya membaca diskusi terlalu cepat. Komit menggantung tidak memiliki keturunan / anak dan tidak direferensikan oleh tag atau cabang.
iclman
44

HOWTO menghapus semua komit menggantung dari repositori git Anda dari http://www.tekkie.ro/news/howto-remove-all-dangling-commits-from-your-git-repository/

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

Pastikan Anda benar-benar ingin menghapusnya, karena Anda mungkin memutuskan bahwa Anda memang membutuhkannya.

qxo
sumber
5
Pada kenyataannya, sebagian besar pengguna seharusnya tidak memerlukan ini dan jika mereka melakukannya mungkin untuk penggunaan kasus terprogram. Ruang disk yang dihemat atau kecepatan meningkat dengan menghapus komit menggantung tidak sepadan dengan usaha menurut saya.
Elijah Lynn
1
Ini menjawab pertanyaan yang berbeda.
Elijah Lynn
5

Komit menggantung adalah komit yang tidak terkait dengan referensi, yaitu tidak ada cara untuk mencapainya.

Sebagai contoh, perhatikan diagram di bawah ini. Misalkan kita menghapus branch featureX tanpa menggabungkan perubahannya, maka komit D akan menjadi komit menggantung karena tidak ada referensi yang terkait dengannya. Seandainya itu digabung menjadi master, maka HEAD dan referensi master akan menunjuk ke komit D dan itu tidak akan menggantung lagi, bahkan jika kita menghapus featureX. Baca catatan setelah diagram untuk memahami ini dengan lebih baik.

Git secara otomatis mengumpulkan sampah (yaitu membuang) menggantung komit. Kita dapat menggunakan git refloguntuk memulihkan cabang (dari komit menggantung) yang telah dihapus tanpa menggabungkannya. Kami dapat memulihkan komit yang dihapus hanya jika ada di toko objek lokal. Jika itu sampah yang dikumpulkan, maka kita tidak bisa memulihkannya.

masukkan deskripsi gambar di sini

CATATAN bahwa nama cabang yaitu label cabang sebenarnya adalah referensi ke komit terbaru pada cabang yaitu ujung cabang. Dalam diagram di atas, featureX, master dan HEAD hanyalah referensi untuk commit tertentu. label featureX dan master merujuk pada komit terbaru di cabang masing-masing. KEPALA umumnya mengacu pada ujung cabang yang sedang diperiksa (master dalam hal ini). Jika Anda checkout komit yang lebih lama pada cabang Anda saat ini, maka HEAD akan berada dalam keadaan terpisah, yaitu akan menunjuk ke komit yang lebih lama daripada yang terbaru. Juga perhatikan bahwa KEPALA disebut referensi simbolis karena sebenarnya menunjuk ke label cabang saat ini dan label cabang apa pun selalu menunjuk ke ujung cabang. Jadi, dalam keadaan normal, HEAD secara tidak langsung menunjuk ke komit terbaru.

Sebagai tambahan, catat bahwa Git merepresentasikan graph / histori komit sebagai grafik asiklik terarah . Setiap komit memiliki referensi ke induknya. Oleh karena itu, panah dalam diagram komit menunjukkan dari komit anak ke komit orang tua. Kami membutuhkan referensi ke anak komit terbaru untuk mencapai komit yang lebih tua di cabang.

PS - Diagram dan pengertian di atas diperoleh dari kursus gratis ini . Meskipun jalannya sudah cukup tua, pengetahuannya masih relevan.

MasterJoe2
sumber