Git'te öksüz işlemlere göz atın


102

Git depom bir şekilde riskli gitti - bu sabah msysgit'i yükledim ve mevcut dizinden sonra gösterilen şube adı yerine "((ref: re ...))" yazıyor, 'git durumu' her şeyi bir yeni dosya, 'git log' ve 'git reflog' bana "ölümcül: hatalı varsayılan revizyon" HEAD "ve benzerlerini söyler.

'Git reflog --all' veya 'gitk --all' yapmak bana deponun geri kalanının sağlam olduğunu gösteriyor, ancak üzerinde çalıştığım dal kayboldu, bu da HEAD'in neden var olmadığını açıklıyor / herhangi bir şeye işaret et.

Git'in her türlü bilgiyi elinde tuttuğunu biliyorum ve taahhütlerimin bir şekilde öksüz kaldığını varsayıyorum, bu yüzden HEAD'i onlara sıfırlayabilmem için bana bu taahhütleri gösterecek bir komut var mı?

DÜZENLEME: Ah canım. "Git fsck" yi keşfettim ve "git fsck --full" "ölümcül: nesne 03ca4 ... bozuk" raporunu veriyor. Bu konuda ne yapabilirim?

DÜZENLEME: Oh canım, oh canım. Başka bir şubeyi kontrol ettim, ardından 'git checkout -b lostbranchname' kullanarak orijinal dalı yeniden oluşturmayı denedim ve git "hata: referans refs / head / lostbranchname çözümlenemiyor: Hata yok, önemli: Başarısız oldu güncelleme için referansı kilitlemek için: Hata yok ". "Hata yok", özellikle çirkin bir hata olmalıdır. Öyleyse hala ortalıkta dolaşıyor gibi görünüyor, ancak kullanılamıyor ve öldürülemiyor.

DÜZENLEME: Süper kandırılan oh canım. Burada önerildiği gibi birçok şeyi paketten çıkarıp yeniden paketledim ve değiştirdim: Sabit disk arızasından zarar gören Git nesneleri nasıl kurtarılır? , ama şimdi 'git durumu' kadar zararsız bir şey için bozuk olarak rapor edilen başka bir hash alıyorum. Sanırım her şey ıslandı. Git çok güzel, ama bu tür şeylerle uğraşmak zorunda kalmamalıyım.


İlgili olarak git checkout -b lostbranchname- sadece dalın adını (içeriğini değil) önemsiyorsanız, el ile silebilirsiniz (veya yeniden adlandırabilirsiniz) .git/refs/heads/lostbranchname- bu, umarız işe yarar.
Antony Hatchkins

1
Ve bu git klasörünü ittiğiniz bir yukarı akışınız yok mu?
Lakshman Prasad

1
Ne yazık ki hayır, bu aslında kalitesiz bir kaynak kontrol sistemi için bir çeşit vekil depo, sadece yerel olarak git'in tüm özelliklerini ve özelliklerini diğer sistemin zorluğu olmadan almak için kullanıyorum. Ama en azından diğer sistem kendini rastgele bozmaz. Yine de bu, diğer sisteme son giriş yaptığımdan beri kaybettiğim tek şeyin, daha önce kurtardığım değişiklikler olduğu anlamına geliyor. Yeni bir havuza başlama zamanı!
Ben Hymers

7
Git'in seni "bu tür şeylerle uğraştığını" ya da kendini bozduğunu söylemekten çekiniyorum. Yedeklemenin yanı sıra hiçbir şey veri kaybına karşı tamamen kararlı olamaz.
Cascabel

1
Gerçekten biliyorum, güzel geçmişimi kaybettiğim için (doğal olarak) biraz rahatsız oldum. Git'in hatası değil, başka herhangi bir sistem verilen dosya sistemi hataları ile aynı davranır.
Ben Hymers

Yanıtlar:


135

Bunu açık bırakmaktansa kendi soruma cevap vereceğimi düşünüyorum. Kullanmak git reflog --all, sahipsiz taahhütlere göz atmak için iyi bir yoldur - ve SHA1 karmalarını kullanarak geçmişi yeniden yapılandırabilirsiniz.

Benim durumumda, depo bozulmuştu, bu yüzden bu yardımcı olmadı; git fsckbilgi havuzundaki hataları bulmanıza ve bazen düzeltmenize yardımcı olabilir.


3
Teşekkürler. Github'da öksüz bir çekme isteği almaya çalışırken bu bilgiyi bulduğum tek yer burası. Sorunumu çözdüm.
SystemParadox

6
birileri gitk'te her şeyi isteyebilirse: [alias] orphank = !gitk --all --date-order ``git reflog | cut -c1-7``&(düzenleme: tekli olanların - burada kaçmanın işe yaramadığı o çift ters tikleri hayal edin)
mbx

1
Müthiş ipucu @mbx! Yetim kalmış taahhütler arasındaki bağlantıları grafiksel olarak görebilmek için çok kullanışlı!
Ben Hymers

@BenHymers "rebase / squash" benzeri commit ilişkileri için de noktalı çizgiler alabilirsek harika olurdu. Henüz bunu yapmanın bir yolunu bulamadım.
mbx

Yukarıdaki cevabı yazdığımda reflog hakkında bir şey bilmiyordum. Çok kullanışlı bir araç!
Jamey Hicks

17

Git 2.9.x / 2.10 (Q3 2016) ile git reflog --allartık kullanmak zorunda git reflogkalmayacaksınız, yeterli olacak.

Bkz. 71abeb7 (03 Haziran 2016), SZEDER Gábor ( szeder) .
(Tarafından Birleştirilmiş - Junio C Hamano gitster- içinde 7.949.837 taahhüt 2016, 06 Tem)

reflog: refloggeçmiş kök taahhütleri yürümeye devam et

Bir arşiv birden fazla kök kaydetme içeriyorsa, HEAD yeniden günlüğü birden çok "oluşturma olayını", yani "from" değeri boş sha1 olan girdileri içerebilir.
Reflog hala daha eski girişler içerse bile, böyle bir yeniden günlüğün listelenmesi şu anda bu tür ilk girişte zamanından önce durmaktadır.
Bu, kullanıcıları yeniden bloglarının bundan sonra kesildiğini düşünmeleri için korkutabilir ' git checkout --orphan'.

Önceki yeniden günlüğe kaydetme girişinin "yeni" değerine bağlı olarak, bu tür oluşturma olaylarını geçmişte yeniden günlüğe kaydetmeye devam edin.


4

Git'in iyi bir özelliği, yolsuzluğu algılamasıdır. Ancak, bozulmadan korunmak için hata düzeltmesi içermez.

Umarım bu deponun içeriğini başka bir makineye göndermişsinizdir veya bozuk parçaları kurtarmak için yedekleriniz vardır.

Windows'ta git ile herhangi bir deneyimim yok, ancak Linux veya OS X'te git ile bu tür davranışları hiç görmedim.


3

Genelde git reflogçıktının kafa karıştırıcı olduğunu düşünüyorum. Bir commit grafiğini anlamak benim için çok daha kolay git log --graph --reflog. Biçimi yalnızca taahhüt özetlerini gösterecek şekilde geçersiz kılmak, grafiğin takip edilmesini de kolaylaştırabilir:

$ git alias graph "log --graph --all --format='%h %s%n        (%an, %ar)%d' --abbrev-commit
$ git graph --reflog

* f06abeb Add feature
|         (Sue Dakota, 4 days ago) (HEAD -> master)
* f126291 Fix the build
|         (Oski M. Wizard, 5 days ago) (origin/master, master)
* 3c4fb9c Break the build
|         (Alyssa P. Hacker, 5 days ago)
| * e3124bf fixup! More work for feature
| |         (Sue Dakota, 4 days ago)
| | * 6a7a52e Lost commit
| |/          (Sue Dakota, 4 days ago)
| * 69d9438 More work for feature
| |         (Sue Dakota, 2 weeks ago)
| * 8f69aba Initial work for feature
|/          (Sue Dakota, 3 weeks ago)
* d824fa9 Fix warnings from the linter
|         (Theo Ristudent, 4 weeks ago)
* 9f782b8 Fix tests flakes
|         (Tess Driven, 5 weeks ago)

Bundan açıkça anlaşılıyor e3124bfve 6a7a52ereferans verilmeyen öksüzler ve atalarının taahhütlerinden bir bağlam var.


Şu anda beni saatler süren kayıp işten kurtardı! Üzerinde kaldırılmamış taahhütleri olan bir yerel şubeyi yanlışlıkla silmiş, git reflog --allgöstermiyor git log --graph --reflog, çok görünürdüler ...
Adam. 8
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.