Mercurial son taahhüdü geri alma


125

Mercurial'de yanlışlıkla yaptığım (zorlanmayan) son değişikliği nasıl geri alabilirim?

Mümkünse, TortoiseHg ile bunu yapmanın bir yolu tercih edilecektir.

Güncelleme

Somut durumumda bir değişiklik kümesi yaptım (zorlanmadı). Sonra sunucudan çektim ve güncelledim. Bu yeni güncellemelerle son taahhüdümün geçersiz olduğuna ve senkronize etmek istemediğime karar verdim. Görünüşe göre, hg rollbackaradığım tam olarak bu değil, çünkü bu benim taahhüdüm yerine çekmeyi geri alacaktır.


1
Ya iki tane yapıp hg rollbacksonra tekrar çekmeye ne dersiniz ?
VonC

1
İlk geri alma, çekmeyi geri alır, ikinci geri alma bana "geri alma bilgisi mevcut değil" diyor.
Martin Buberl

1
Ben de aynı durumla karşılaştım ve bildiğim kadarıyla başka bir işlem yaptıktan sonra geri dönemez ya da geçmişten kaldıramazsınız. Hg deposunu yeniden klonlamanız gerekir.

3
strip --keep: stackoverflow.com/questions/29413851/… , MQ qimport'un yaptığı gibi, görevi doğrudan çözer. Alternatif olarak, rebaseyerel değişikliklerin de muhafaza edilmesi ve herhangi bir çatışma olmaması senaryoda daha iyi olabilir . ( İstenilen grafiğin son hedefi olduğunda, özellikle hızlı ileri olmayan bir durumda, her iki daldan bazı birleşik değişiklikleri korumak için bir birleştirme kullanın .) Ayrıca, 'geçmişi hala koruyan' dalı kapatmak da geçerli olabilir (ancak bir birleştirmeden farklı olarak) istenen son duruma bağlı olarak.
user2864740

2
@ User2864740 söylediği gibi hg strip --keepkomut kullanımını yapmak, ancak bir revizyon, örneğin sağlamanız gerekir: hg strip --keep -r .. Bu cevap iyi açıklıyor stackoverflow.com/a/19064016/1286571
ForeverWintr

Yanıtlar:


77

Bir yol olurdu hg rollback (Hg2.7, Ağustos 2013 itibarıyla kullanımdan kaldırılmıştır)

Lütfen kullan hg commit --amendrollback son işlemedeki hataları düzeltmek yerine .

Depodaki son işlemi geri alın.

Ne zaman işlemekle veya birleştirme , Mercurial ekler değişiklik kümesi Son girişi.
Mercurial, dokunulan her dosyanın adı ve işlemden önceki uzunluğunun bir işlem günlüğünü tutar. Durdurulduğunda, her dosyayı önceki uzunluğuna göre kısaltır. Bu basitlik, revlog'ları yalnızca ek yapmanın avantajlarından biridir . İşlem günlüğü ayrıca bir geri alma işlemine izin verir.

Bkz TortoiseHg Kurtarma bölümü :

alternatif metin

Bu ileti dizisi ayrıca hg rollbackve arasındaki farkı da ayrıntılarıyla açıklıyorhg strip :
( SO'ya da katkıda bulunan Martin Geisler tarafından yazılmıştır )

  • ' hg rollback' son işlemi kaldıracaktır. İşlemler, genellikle veritabanlarında bulunan bir kavramdır. Mercurial'da commit, push, pull ... gibi belirli işlemler çalıştırıldığında bir işleme başlatırız. İşlem
    başarıyla tamamlandığında işlem tamamlandı olarak işaretlenir. Bir hata oluşursa, işlem "geri alınır" ve bilgi havuzu eskisi gibi aynı durumda bırakılır.
    Bir geri dönüşü "hg geri alma" ile manuel olarak tetikleyebilirsiniz. Bu, son işlem komutunu geri alacaktır. Bir çekme komutu arşive farklı dallarda 10 yeni değişiklik getirmişse, ' hg rollback' hepsini kaldıracaktır. Lütfen unutmayın: Bir işlemi geri aldığınızda yedekleme yoktur !

  • ' hg strip' bir değişiklik kümesini ve tüm soyundan gelenleri kaldıracaktır. Değişiklik kümeleri, tekrar ihtiyacınız olursa yeniden uygulayabileceğiniz bir paket olarak kaydedilir.

ForeverWintr yorumlarda öneriyor (2016'da, 5 yıl sonra)

Dosyaları 'un-commit' etmek için önce onları unutabilirsiniz, örneğin:, hg forget filea; hg commit --amendama bu mantıksız görünüyor.
hg strip --keepmuhtemelen modern hg için daha iyi bir çözümdür.


Düzeltmenin geri dönme işleminin son işlemi kaldıracağını anladığımda. Benim durumumda bir taahhütte bulundum, sonra sunucudan çıkardım. Öyleyse, bu commit yerine çekmeyi geri alacağım anlamına mı geliyor?
Martin Buberl

1
@Martin Buberl: göre selenic.com/mercurial/hg.1.html#rollback , çekme bir işlem olarak kabul edilir. Bu nedenle, çektiğiniz takdirde, yürütme hg rollbackişlemi kesinleştirme yerine çekme işlemini geri alır.
Tim Henigan

2
Nasıl hg commit --amendçalışacağımı bilmiyorum ama benim için commit mesajını değiştirmem için bir editör verdi ve hangi dosyaların dahil edildiğini değiştirecek bir yöntem yoktu. Düzenleyiciden kaydetmeden çıktım ve hatalı işlememin TÜM değişen dosyaları içerecek şekilde değiştirildiğini gördüm !
Tim Tisdall

2
Kullanarak soruya nasıl cevap vereceğim bana açık değil hg commit --amend. Dosyaları ilk önce hg forgetonları 'işleme tabi tutmayı' kaldırabilirsiniz , örneğin:, hg forget filea; hg commit --amendancak bu mantıksız görünüyor. hg strip --keep muhtemelen modern hg için daha iyi bir çözümdür.
ForeverWintr

1
@JasonS book.mercurial-scm.org/read/… iyi bir okuma olsa da, sizin durumunuzda hg sıfırlamayı da düşünebilirsiniz: stackoverflow.com/a/31302998/6309
VonC

46

hg strip depodan bir revizyonu (ve soyundan gelenleri) tamamen kaldıracaktır.

Strip kullanmak için .hgrc (veya mercurial.ini) dosyanıza aşağıdaki satırları ekleyerek MqExtension yüklemeniz gerekir :

[extensions]
mq =

TortoiseHg'de strip komutu çalışma tezgahında mevcuttur. Bir revizyonu sağ tıklayın ve 'Geçmişi değiştir' -> 'Ayır'ı seçin.

Yana stripdeğişikliklere deponun geçmişi sadece Henüz kimseyle paylaşılmıyor revizyonlar üzerinde kullanmalıdır. Mercurial 2.1+ kullanıyorsanız , bu bilgileri takip etmek için aşamaları kullanabilirsiniz. Bir kaydetme hala taslak aşamasındaysa, diğer depolarla paylaşılmamıştır, böylece güvenle kaldırabilirsiniz. (Bunu işaret ettiği için Zasurus'a teşekkürler).


2
Söz konusu revizyon hala taslak cümlenin içindeyse (veya itildiği / çekildiği repoların TÜMÜNE erişiminiz varsa ve şeridi hepsine uyguluyorsanız) (bu açıklamadaki durum budur), o zaman bu sooo en iyi ve en temiz seçenek.
GazB

4
TortoiseHg yüklüyse, mq'yi global olarak etkinleştirmek için bir grafik arabirim vardır. Mevcut sürümde: "dosya-> ayarlar-> genel ayarlar sekmesi-> uzantılar-> mq" seçeneğini etkinleştirin veya "Dosyayı düzenle" düğmesiyle ayarlar dosyasına erişin.
David

19

Geri alamayacağınız için, bu taahhüdü çektiğinizde aldığınız yeni kafa ile birleştirmelisiniz. İçinde yaptığınız işlerin hiçbirini istemiyorsanız, bu ipucunu kullanarak bunu kolayca yapabilirsiniz. .

Yani , onların kafasını çektiyseniz ve güncellediyseniz, bunu yapabilirsiniz:

hg --config ui.merge=internal:local merge

o anda teslim alınmış revizyondaki tüm değişiklikleri ve teslim alınmamış revizyondaki (artık istemediğinizi yazdığınız revizyondaki) hiçbir değişikliği saklar.

Bu, bunu yapmanın harika bir yoludur çünkü geçmişinizi doğru ve eksiksiz tutar. Bundan 2 yıl sonra birisi aşağı çektiğinizde bir hata bulursa, aynı şeyin (kullanılmamış ama kaydedilmiş) uygulamanıza bakabilir ve "oh, doğru yaptım" diyebilirsiniz. :)


5

hg rollback istediğin şey.

TortoiseHg'de, hg rollbackcommit iletişim kutusunda gerçekleştirilir. Kaydetme iletişim kutusunu açın ve "Geri Al" ı seçin.

alternatif metin


1
Bir commit yaptım, ardından bir çekme ve güncelleme / senkronizasyon yaptım. Bu yeni değişikliklerle, son taahhüdümün geçersiz olduğuna karar verdim ve onu geri almak istiyorum. TortoiseHg'deki Geri Al düğmesi benim durumumda devre dışı bırakıldı.
Martin Buberl

Geri alma artık kullanımdan kaldırılmıştır.
UpTheCreek

Tortoise HG'nin mevcut sürümünde, Depo menü öğesinden Geri Al / Geri Al seçeneğine ulaşabilirsiniz.
daveywc

@UpTheCreek alıntı gerekli.
DanMan

@DanMan - sağladığı bağlantıyı kontrol edin.
UpTheCreek

3

TortoiseHg Workbench 4.4.1'in (07.2018) güncel sürümünde şunları kullanabilirsiniz Repository- Rollback/undo...:
görüntü açıklamasını buraya girin


1

Geçici çözüm.

Sunucuya göndermezseniz, depo klasörünüzden yeni klasöre klonlayacak (tüm dosyaları sileceksiniz) ve yenisini klonlayacaksınız.


0

Çalışma alanınızı çekip güncelledikten sonra, kurtulmak istediğiniz değişiklik setine bir thg ve sağ tıklayın ve ardından geçmişi değiştir -> şerit'e tıklayın, bu değişiklik setini kaldıracak ve varsayılan ipucunu göstereceksiniz.

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.