Ayrılmış bir HEAD durumunda oluşturulan git taahhütlerine ne olur?


137

Olan şey bu:

Bir dalım var. Dalda AI bir sürü değişiklik yaptı. Koddan memnun değildim, bu yüzden A şubesindeki önceki taahhüdü kontrol ettim ve daha sonra bir sürü daha değişiklik yaptım ve A şubesine koydum. Şimdi bu taahhüdü hiçbir yerde bulamıyorum. Bu kodu kaybettim mi?


"A dalında önceki taahhüdü kontrol ettim" derken, "A dalını önceki taahhüdüne sıfırladım" mı demek istersiniz? yani aslında git resetdeğil git checkoutmi?
CB Bailey

Hayır, ödeme yaptım. reflog çalıştı.
Mausimo

Eğer ödeme kullandıysanız o zaman müstakil HEADve şube A önceki taahhütte kalırdı. Tam olarak hangi komutları çalıştırdınız?
CB Bailey

1
OSX Lion üzerinde SourceTree GIT GUI kullanıyordum. A dalındaydım ve A dalına ilişkin önceki taahhüdün bir kontrolünü yaptım. Daha sonra bir sürü kod değişikliği yaptım ve taahhüt ettim (A Şubesi). Müstakil bir HEAD'ım olduğuna inanıyorum.
Mausimo

Tamam, sanırım A dalında bir sürü değişiklik yaptığınızı söylediğinizde kafam karıştı .
CB Bailey

Yanıtlar:


186

Eski taahhüt hala reflog halindedir.

git reflog

Bu taahhütlerin bir listesini gösterecektir ve "kayıp" taahhüt orada olmalıdır. Yeni bir dal haline getirebilirsiniz. Örneğin, SHA-1 ba5a739 ise, eski taahhütte "yeni dal" adlı yeni bir dal yapabilirsiniz:

git branch new-branch ba5a739

Veritabanı kaybedildiğinde "kayıp" işlemlerin silineceğini unutmayın.


3
Aynı şeyi yaptım ve kaybedildiğini düşünerek kalp krizi geçirdim. Bilgi için teşekkürler!
Chase

15
git cherry-pick [SHA]Ayrılmış kafa durumunda yanlışlıkla taahhütte bulunmanız durumunda taahhüdü mevcut bir şubeye taşımak için kullanın
Jan Aagaard Meier

3
Alternatif olarak mevcut bir şubeye geçebilir ve reflog'da listelenen "kayıp" taahhüdüne karşılık gelen "git merge HEAD @ {n}" n yapabilirsiniz.
eaykin

pruneSilme işleminin ayrıca, tamamlama iletilerinde başvurulan müstakil taahhütleri de yapıp yapmadığını biliyor musunuz ? Yoksa bu onlara ulaşılabilir mi?
Kamafeather

@Kamafeather: Bunun ulaşılabilir olduğunu düşünmüyorum.
Dietrich Epp

64

Daha önce de belirtildiği gibi, taahhütleriniz hala reflogda mevcut. Diğer cevaplara ek olarak, ayrı bir HEAD taahhütlerini yeni bir şube oluşturmadan ve birleştirmeden doğrudan mevcut şubenize almanın bir yolu :

  1. Müstakil HEAD durumunda yaptığınız taahhütlerin SHA-1 karmalarına bakın.

    git reflog
    
  2. Daha sonra, en eskiden en yeniye tüm sipariş karmaları ile çalıştırın:

    git cherry-pick <hash1> <hash2> <hash3> ...
    

    Örneğin, "ilk 7 karakter" kısa karma biçiminde verilen yalnızca bir tane olsaydı:

    git cherry-pick a21d053
    

Bu, mevcut dalınızda, komutta bahsettiğiniz müstakil HEAD-kesinliği karması başına bir taahhüt olacak şekilde yeni taahhütler oluşturacaktır. Ayrıca orijinal taahhüt mesajlarını da devralır.


11

Aşağıdaki komutla kayıp (sarkan) taahhütleri bulabilirsiniz:

git fsck --lost-found

Mevcut kafanız taahhütte bulunmuyorsa, kayıp olarak listelenmez.

Git-fsck (1) Kılavuz Sayfasında daha fazla bilgi bulabilirsiniz.

O zaman bu kayıp taahhüdü üzerinde şube oluşturabilirsiniz:

git branch new-branch ba5a739

Ben önce bir alt modül için "git reflog" komutunu sonra "git branch new-branch ba5a739" komutunu kullandım, çalıştı.
ondermerol

7

Çalışma dizininizin durumu için Git parlance değeri “ bağımsız bir KAFA ” dır . İşte git reflogtasarrufu sağlayan başka bir yer .

$ git reflog
0b40dd6 HEAD@{0}: commit: my commit on detached HEAD
...

Farklı bir şubeyi kontrol etmeye çalışırsam git-1.7.5.1 faydalı bir öneri sunar.

$ git ödeme yöneticisi
Uyarı: bağlı değil 1 taahhüt geride bırakıyorsunuz
şubelerinizden herhangi biri:

  0b40dd6 müstakil HEAD konusundaki taahhüdüm

Yeni bir şube oluşturarak onları korumak istiyorsanız, bu iyi bir zaman olabilir
bunu yapmak için:

 git şube new_branch_name 0b40dd65c06bb215327863c2ca10fdb4f904215b

'Master' şubesine geçildi

Bilgi ve bağlantı için teşekkürler. Bağlantı, neler olduğunu anlamama yardımcı oldu.
Mausimo

6

Kaybetmediniz, Git hala bir kopyasını tutuyor (ancak şu anda herhangi bir şube başkanı tarafından erişilemiyor). Eksik taahhüdünüzü bu git reflogkomutu kullanarak bulabilirsiniz . Reflog, bir şube kafasının tarihsel konumlarını izler ve şube kafasının daha önce işaret ettiği şeyleri bulmak için kullanabilirsiniz.


4

Ayrılmış kafanızı git repo'ya geri bağlamak için bu adımları izleyin

  1. git checkout "your branch with path but without remote name"

örneğin, uzak ad kökeni ve şube adı bugfix/somebranchkullanılıyorsagit checkout bugfix/somebranch

  1. git reflog taahhütlü SHA'ları müstakil şube taahhüt listenizden alın.

  2. git cherry-pick "commit hash1" "commit hash2" "commit hash3"

  3. git push

TÜM SET !!


2

Sourcetree'de, git reflog'un işe yaramadığını gördüm, bu yüzden GUI'yi kullanarak bunu nasıl yapacağımı anladım.

İlk olarak, Komut Geçmişinde bir mesaj arayarak "kayıp" taahhüdü bulmaya çalışın (Görünüm: Komut Çıktısını Göster). Umarım kaybettiğiniz taahhütten sonra "Şube Değiştirme" komutunda olacak ve 1234567 taahhüt kimliğine sahip taahhüt yorumunu göreceksiniz.

Bu işlem kimliğini bir sonraki adıma götürün.

Üst araç çubuğundaki "Dal" düğmesine basın ve belirli bir taahhüdü belirtebileceğiniz bir "Yeni Dal" iletişim kutusu edinmelisiniz. Bu taahhüt kimliğini oraya koyun, yeni bir şube adı belirtin, şube oluştur'a basın ve kayıp taahhüdünüzle yeni bir şube almalısınız!

Bu benim için bazı kayıp işleri geri getirdi!

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.