Git: Sarkan bir taahhüt / damla nedir ve nereden geliyorlar?


149

Sarkan komisyonlar ve lekeler hakkında temel bilgi arıyorum.

Benim repo iyi görünüyor. Ama git fsckilk kez ne yaptığını görmek için koştum ve uzun bir 'sarkan lekeler' listesi ve tek bir 'sarkan taahhüt' var.

Bunlar ne? Nereden geldiler? Repo durumum hakkında olağandışı (iyi veya kötü) bir şey gösteriyorlar mı?

Yanıtlar:


96

Git deponuzla çalışma sırasında, işlemlerin yedeğini alabilir ve ara lekelere neden olan diğer hareketleri ve hatta git'in bilgi kaybını önlemeye yardımcı olması için yaptığı bazı işlemleri yapabilirsiniz.

Sonunda (şartlı olarak, git gc man sayfasına göre ) çöp toplama işlemini gerçekleştirir ve bunları temizler. Çöp toplama işlemini çağırarak da zorlayabilirsiniz git gc.

Bununla ilgili daha fazla bilgi için git-scm sitesinde Bakım ve Veri Kurtarma bölümüne bakın .

Manuel bir GC çalışması varsayılan olarak bu güvenlik ağı komutunun çalışma zamanından 2 hafta önce ayrılacaktır. Aslında git deponuzu en iyi şekilde kullanmanıza yardımcı olmak için GC'yi zaman zaman çalıştırmanız önerilir. Yine de her şey gibi sizin için önemli olabilecek şeyleri yok etmeden önce ne yaptığını anlamalısınız.


10
Bu yüzden söylemek gerekir ki 1) repo ile ilgili yanlış bir şey olduğunu düşünmedikçe bunları kaldırmak güvenli git gcve 2) bu konuda endişelenmem gerekmiyor çünkü bu sarkan bitler normal ve zaten git onlar mı?
doub1ejack

7
Bu adil bir değerlendirme olurdu.
vgoff

9
Ayrıca, herhangi bir dosya 'git' istediğinizde, ancak dosyanın tam sürümünü taahhüt etmediğinizde, sarkan bir damla ile sonuçlanırsınız. Endişelenecek bir şey yok.
canton7

7
doub1ejack - Genel olarak, çöp toplama işlemini elle çalıştırmamalısınız. İçeri girmek kötü bir alışkanlıktır ve git yine de gerektiğinde çöp toplama yapar. Elle çalıştırmanın dezavantajı, şimdi istemeyebileceğiniz ancak gelecekte isteyebileceğiniz sarkan lekeleri ve taahhütleri kurtarma yeteneğini kaybetmiş olmanızdır. Çöp toplama çalıştırdıktan sonra git gelen bazı oldukça güçlü geri alma işlevselliği almak. Kural olarak değil, dikkatli ve istisna olarak kullanın. --- Bırak git işini yapsın.
Elijah Lynn

97

Sarkan damla = alanına / dizinine ulaşan, ancak hiçbir zaman taahhüt edilmeyen bir değişiklik. Git ile inanılmaz bir şey, bir kez evreleme alanına eklenir, her zaman geri alabilirsiniz çünkü bu damlalar onlar da bir karma var taahhütleri gibi davranıyor!

Sarkan taahhüt = Herhangi bir çocuk taahhüdü, şube, etiket veya başka bir referansla doğrudan bağlantılı olmayan bir taahhüt. Bunları da geri alabilirsiniz!


5
'Atalar' 'torunları' okumalı mı? Genel olarak, ataları aracılığıyla hiçbir git işlemine ulaşamazsınız.
Phil Miller

@Novelocrat Aynı düşünceye sahiptim, muhtemelen torunları okuması gerektiğine katılıyorum.
stkent

1
Hala cevabınızda "yükselenler" i okuyorum. Görünüşe göre 2 Temmuz'daki baskınız yazım hatasını düzeltmedi.
iclman

Sarkan bir lekeyi nasıl geri alırsın?
HelloGoodbye

1
@ElijahLynn Haklısın. Tartışmaları biraz hızlı okuduğumu düşünüyorum. Sarkan bir taahhüdün hiçbir alt öğesi / alt öğesi yoktur ve bir etiket veya dal tarafından referans alınmaz.
iclman

44

Git deponuzdaki tüm sarkan taahhütleri http://www.tekkie.ro/news/howto-remove-all-dangling-commits-from-your-git-repository/

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

Sonuçta onlara ihtiyacınız olduğuna karar verebileceğinizden, bunları gerçekten kaldırmak istediğinizden emin olun.


6
Gerçekte, çoğu kullanıcı buna asla ihtiyaç duymamalıdır ve eğer yaparlarsa muhtemelen programlı bir kullanım durumu içindir. Düşen disk alanı kaldırılarak kaydedilen disk alanı veya hızın artması bence zahmete değmez.
Elijah Lynn

1
Bu farklı bir soruyu cevaplıyor.
Elijah Lynn

6

Sarkan bir taahhüt, referansla ilişkili olmayan bir taahhüttür, yani ona ulaşmanın bir yolu yoktur.

Örneğin, aşağıdaki diyagramı düşünün. Diyelim ki şube özelliğiX'i değişikliklerini birleştirmeden siliyoruz, sonra D komutu sarkan bir taahhüt haline gelecektir, çünkü onunla ilişkili bir referans yoktur. Master ile birleşmiş olsaydı, HEAD ve master referansları D'yi taahhüt ederdi ve featureX'i silmiş olsak bile artık sarkmazdı. Bunu daha iyi anlamak için diyagramdan sonra notu okuyun.

Git otomatik olarak çöp sarkanları toplar (yani atar). git reflogBirleştirmeden silinen bir dalı (sarkan taahhütlerin) kurtarmak için kullanabiliriz . Silinen taahhütleri ancak yerel nesne deposunda varsa kurtarabiliriz. Çöp toplanmışsa, geri kazanamayız.

resim açıklamasını buraya girin

NOT şube adı yani şube etiket aslında son bir referans olduğunu dalın ucunda yani şube üzerinde. Yukarıdaki şemada, featureX, master ve HEAD sadece belirli taahhütlere referanslardır. featureX ve master etiketler ilgili şubelerindeki en son taahhütleri ifade eder. HEAD genellikle şu anda teslim alınmış dalın ucunu ifade eder (bu durumda master). Mevcut şubenizde daha eski bir taahhüdü kontrol ederseniz, HEAD bağımsız bir durumda olacaktır, yani en son yerine eski taahhüdü gösterecektir. Ayrıca HEAD'in sembolik bir referans olarak adlandırıldığından, gerçekte geçerli dal etiketine ve herhangi bir dal etiketinin her zaman dalın ucuna işaret ettiğine dikkat edin. Dolayısıyla, normal şartlar altında HEAD dolaylı olarak en son taahhüdü işaret eder.

Bir yana, Git'in kesin grafiğini / geçmişini yönlendirilmiş bir döngüsel grafik olarak temsil ettiğini unutmayın . Her bir taahhüdün ana öğeye bir referansı vardır. Bu nedenle, bir taahhüt diyagramındaki oklar çocuk taahhüdünden ebeveyn taahhüdüne işaret eder. Bir daldaki daha eski taahhütlere ulaşmak için en son çocuk taahhüdüne referans vermemiz gerekir.

PS - Yukarıdaki diyagram ve anlayış bu ücretsiz dersten elde edilmiştir . Kurs oldukça eski olmasına rağmen, bilgi hala konuyla ilgilidir.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.