GIT son ayrılan HEAD'i geri yükle


87

Lütfen projemde büyük bir problemim var: senaryo bu. GIT altında bir xcode projem var. Bugün son işlemenin bazı testleri bozduğunu fark ettim, bu yüzden önceki commit'i kontrol ettim. SourceTree kullandım ve bu uyarı

Bunu yapmak, çalışma kopyanızı 'ayrı bir KAFA' haline getirecek, bu da artık bir şubede olmayacağınız anlamına gelir. Bundan sonra taahhüt etmek istiyorsanız, muhtemelen bir şubeyi tekrar ödünç almak veya yeni bir şube oluşturmak isteyeceksiniz. Bu tamam mı?

Bütün gün çalıştım ve sonunda her şeyi adadım. Bu yüzden geliştirme şubesi üzerindeki çalışmalarımı birleştirmem gerekiyordu, böylece geliştirme şubesini kontrol ettim ve ... işim anında kayboldu :(

HEAD'imi ayırmanın yanlış olduğunu biliyorum ve Sourcetree beni uyardı ... ama işimi geri getirmenin bir yolu var mı?


Aynı sorun için bir, ilgili iplik burada ve anı nasıl teknik ayrıntıların burada .
RBT

Yanıtlar:


259

Yazarsanız git reflog, size hangi revizyonların HEADişaret ettiğinin geçmişini gösterir. Ayrılmış başınız orada olmalı. Onu bulduğunuzda yapın git checkout -b my-new-branch abc123veya git branch my-new-branch abc123( abc123ayrık KAFA'nın SHA-1'i nerede ) kopuk başınıza işaret eden yeni bir dal oluşturun. Artık boş zamanlarınızda bu dalı birleştirebilirsiniz.

Genel olarak, ayrık bir kafa üzerinde çalıştıktan sonra bir şubeyi kontrol ederseniz, Git size üzerinde bulunduğunuz ayrık kafadaki yürütmeyi söylemelidir, böylece ihtiyacınız olursa onu kurtarabilirsiniz. SourceTree'yi hiç kullanmadım, bu yüzden bu mesajı iletip iletmediğini bilmiyorum. Ama mesajı, ardından kullanmak tekrar işlemek bulmak için kullanabilmek için, ve gerektiği ekranı yapsam git checkout -bveya git branchtaahhüt bundan bir dal oluşturmak için.


5
Teşekkür ederim Brian. Günümü kurtardın.
Muzammil

Brian, hayatımı kurtardın! Teşekkürler!!
cldrr

Git'te yeniyim .. alıyorum fatal: A branch named 'mybranch' already exists.Mevcut şubeye nasıl eklenir?
Ramesh Murugesan

1
Brian'a teşekkür edenler için bir PSA olarak: Kaybetmek istemediğiniz bir iş yapıyorsanız, birkaç saatte bir uzaktan kumandaya (örneğin github) itin. Bilgisayarınıza bir meteor düştüğünde, yaptığınız için mutlu olacaksınız. Henüz ortak çalışanlarla paylaşmaya hazır değilseniz, şimdilik kimsenin bilmediği bir şubeye koyun ve daha sonra onu daha sonra ustaya yeniden yayınlayın.
MatrixManAtYrService

1
Ayrıca, kaybolan tek bir kayıp işlemiyse ve orada bulmuşsanız, onu geri getirebilirsiniz git cherry-pick e5b2f7b, burada e5b2f7bcommit'in SHA-1'i nerede .
Aidin

10

Sourcetree'de bunu GUI'yi kullanarak yapabilirsiniz.

Önce Komut Geçmişinde bir mesaj arayarak "kayıp" yürütmeyi bulun (görünüm: Komut Çıktısını Göster). Kaybettiğiniz işlemden sonra muhtemelen "Şube Değiştir" komutunda olacaktır. Bu mesajda, umarım bir 1234567 commit kimliğiyle kaydetme açıklamasını görürsünüz.

Bu Commit ID'yi bir sonraki adıma alın.

Üst araç çubuğundaki "Dal" düğmesine basın ve belirli bir kesinleştirme belirtebileceğiniz "Yeni Dal" diyaloğu almalısınız. Bu Commit ID'yi oraya girin, yeni bir şube adı belirtin, Şube Oluştur'a basın ve kaybettiğiniz commit ile yeni bir şube almalısınız!

görüntü açıklamasını buraya girin


aslında çalışıyor. Kaydetme kimliğiyle doğru yorumu gördüğünüzden emin olun.
Hammad Khan

@blalond Merhaba, Cevabınızı okuduktan sonra küçük bir sorum var: SourceTree'deyken önceki bir işleme üzerine çift tıklıyorum (kontrol etmek için) bunun kopuk bir kafaya neden olacağı mesajını alıyorum, bu yüzden merak ediyorum insanlar git ile önceki revizyonlara geri dönebileceğinizi söylediğinde bu ne anlama geliyor? O halde belirli bir işleme nasıl geri dönebilirim? Teşekkürler

5

Ayrılmış HEAD'deki değişiklikleri saklamak istemiyorsanız ve en son dal işlemeye gitmek istiyorsanız, aşağıdaki komutu doğrudan kullanın.

git checkout - 

Not: Ayrılmış HEAD'deki tüm değişikliklerinizi sileceğim.


OP, çalışmalarını sürdürme talebinde bulundu. Bu, orijinal soruyu yanıtlamaz. Bunu bir dalda tutma seçeneğini eklemek bile bu yanıtı faydalı hale getirecektir.
manuelvigarcia

1

Bir meslektaşımda bu durum vardı. Onun durumunda, bağımsız başlıkta taahhütler vardı - R-Studio'da çalışıyorlar - ve araç, şubeyi bununla ve bu SHA referansı ile oluşturabilecekleri konusunda uyardı ... ancak tek seçenek "Kapat" olduğundan --duh !! o bir bilgi kutusuydu - diyaloğu kapattılar ve bilgiyi sonsuza kadar kaybettiler ...

reflogKomut sayesinde değişikliklerin kaybolmadığını görebildik. Ama bizim durumumuzda, git branchbeklendiği gibi çalışmadı ... ya da gelen bir git pullşey bir şekilde berbat etti. Reflogdan yeni oluşturulan şubeye değişiklikleri yakalamak zorunda kaldık:

 git cherry-pick 0b823d42..3cce27fc

şubeye istediğimiz tüm commit'leri yerleştirdi. O zaman şubeyi developsorunsuz bir şekilde birleştirebiliriz .

Her ihtimale karşı bu herkes için bilgilendirici, biz kaydedilmesini tespit etmedi müstakil kafa içinde reflog"kasada" ile işaretlenmiş arasında olanlar bakarak (ki dalı kayması tespit):

e09f183b HEAD@{3}: pull: Fast-forward
b5bf3e1d HEAD@{4}: checkout: moving from lost_changes to develop
b5bf3e1d HEAD@{5}: checkout: moving from 3cce27fca50177a288df0252f02edd5da5ee64fd to lost_changes
3cce27fc HEAD@{6}: commit: add statistics
417a99a4 HEAD@{7}: commit: add test
0b823d42 HEAD@{8}: commit: new utility class
d9ea8a63 HEAD@{9}: checkout: moving from develop to d9ea8a635d4c2349fcb05b3339a6d7fad5ae2a09
b5bf3e1d HEAD@{10}: pull: Fast-forward

İstediğimiz olanlar vardı HEAD@{8}için HEAD@{6}(her ikisi de dahil). Bu yüzden onları aldık:

git cherry-pick 0b823d42..3cce27fc

Sonra olağan birleştirme çözümü ve son kesinleştirme, kaybettiğimizi düşündüğümüz bağımsız kafa çalışmasına ev sahipliği yapan şube kayıp_değişiklikleri ile bizi bıraktı. Bunu geliştirmek için birleştirmek bu sefer ileri sarıldı.


0

Bu senaryoyu denedim ve şunu buldum bana son işlemin SHA-1'ini söyle

vors@localhost:~/git-test$ git checkout master 
Warning: you are leaving 1 commit behind, not connected to
any of your branches:

  ec600e6 333

If you want to keep them by creating a new branch, this may be a good time
to do so with:

 git branch new_branch_name ec600e6eb2473dd4f3732539c5c1fa5829f631b7

Switched to branch 'master'

Bu mesajı gördün mü?


Hayır. ya da belki ben dikkat etmiyorum. Zaman makinesinde bir yedek arıyorum; (
IgnazioC

1
@IgnazioC Bir yedeğe bakmanıza gerek yok. Cevabıma bir baktın mı? git reflogsana neye ihtiyacın olduğunu göstermeli.
Brian Campbell

0

Hiçbir değişiklik yapmak istediğiniz sürece müstakil kafa iyidir.

Bir taahhüdü geri almak istiyorsanız, git revert'ı belirli bir dalda kullanabilirsiniz.

Müstakil kafa üzerinde çalışmak ve taahhütler yapmak istiyorsanız; yeni bir dal oluşturun (ve daha sonra birleştirin);


Evet! kuralları biliyoruz. Ancak meslektaşlar bağımsız kafa üzerinde çalışıp daha sonra bu taahhütlerden uzaklaştıklarında, kurallar değil cevaplar istiyorlar.
manuelvigarcia

0
  1. İlk git reflogönce geçmişi görüntülemek için çalıştırın .
  2. En eski revizyon, listedeki son revizyon olacaktır.
  3. git checkout -b temp e35d2b3Burayı kullanarak istediğiniz kaydetmeye geçin e35dd23, kaydetmenizin karma değeridir.
  4. Bu kadar. Şimdi sadece git add yapın. vb....

Sorununuzu çözerse bir cevap olarak kabul edin. Aksi takdirde lütfen yorumunuzu paylaşın.

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.