Bir git yeniden sürümünün nasıl kolayca geri alınacağını bilen var mı?
Aklıma gelen tek yol manuel olarak devam etmek:
Şu anki durumumda bu işe yarayacak çünkü her iki daldaki taahhütleri kolayca tespit edebiliyorum (biri benim işim, diğeri iş arkadaşımın işi).
Ancak benim yaklaşımım bana yetersiz ve hataya açık gibi geliyor (diyelim ki kendi dallarımdan 2 tanesiyle yeniden başlattım).
Bir fikrin var mı?
Açıklama: Bir grup işlemin yeniden oynatıldığı bir yeniden düzenlemeden bahsediyorum. Sadece bir tane değil.
En kolay yol, reflog'de yeniden düzenleme başlamadan hemen önce olduğu gibi dalın baş commit'ini bulmak olacaktır...
git reflog
ve mevcut dalı ona sıfırlamak için (--hard
seçeneği ile sıfırlamadan önce kesinlikle emin olma konusundaki olağan uyarılarla birlikte).
Eski işlemin ref günlüğünde HEAD@{5}
olduğunu varsayalım:
git reset --hard HEAD@{5}
Windows'ta referansı alıntılamanız gerekebilir:
git reset --hard "HEAD@{5}"
Eski head adayının geçmişini sadece bir git log HEAD@{5}
(Windows: git log "HEAD@{5}"
) yaparak kontrol edebilirsiniz.
Şube başına reflogları devre dışı bırakmadıysanız, bir rebase son başlığa yeniden eklemeden önce şube başlığını ayırdığı için basitçe git reflog branchname@{1}
yapabilmeniz gerekir. Son zamanlarda bunu doğrulamadığım için bunu iki kez kontrol etmeliyim.
Varsayılan olarak, tüm refloglar çıplak olmayan depolar için etkinleştirilir:
[core]
logAllRefUpdates = true
Dalı eski ucunun sarkan commit nesnesine sıfırlamak elbette en iyi çözümdür, çünkü herhangi bir çaba harcamadan önceki durumu geri yükler. Ancak bu commitleri kaybettiyseniz (örneğin, bu arada deponuzu çöp olarak topladığınız için veya bu yeni bir klon olduğu için), dalı her zaman yeniden tabanlandırabilirsiniz. Bunun anahtarı --onto
anahtarıdır.
Diyelim ki hayali olarak topic
adında bir konu dalınız vardı ve master
ın ucu 0deadbeef
commit'i olduğunda master
dan dallandınız. Bir noktada topic
dalı üzerindeyken git rebase master
yaptınız. Şimdi bunu geri almak istiyorsunuz. İşte nasıl yapılacağı:
git rebase --onto 0deadbeef master topic
Bu, master
üzerinde olmayan topic
üzerindeki tüm commitleri alacak ve bunları 0deadbeef
üzerinde yeniden oynatacaktır.
onto` ile geçmişinizi hemen hemen herhangi bir şekilde yeniden düzenleyebilirsiniz.
İyi eğlenceler. :-)
Birden fazla taahhüt için, herhangi bir taahhüdün o taahhüde kadar olan tüm geçmişe referans verdiğini unutmayın. Bu nedenle Charles'ın cevabında "eski commit" ifadesini "eski commitlerin en yenisi" olarak okuyun. Eğer o commit'e sıfırlarsanız, o commit'e kadar olan tüm geçmiş yeniden ortaya çıkacaktır. Bu istediğiniz şeyi yapacaktır.