2012-07-23 25 views
6

A, B, C, D, ve B, C ve D'yi tutmak ve (BCD) commit olmasını sağlamak istiyorum. Bunu yapmanın en kolay yolu nedir, aynı anda geri almak istediğim birçok taahhüt var mı? Mercurial'da birden çok işlemi nasıl geri alabilirim?

(Sonra ben A hg update ve bazı argümanlarla hg commit diyoruz önerdi bu konuda bir stackoverflow soru görülmeden hatırlamak gibi görünüyor, ama şimdi bu soruyu bulmak için görünmüyor olabilir.)

cevap

1

You' ve kendi sorunuzu cevapladıktan sonra A'ya geri dönün ve oradan devam edin. Bu noktada yeni bir kafa yapmanız gerekiyorsa, burada açıklandığı gibi bazı dosyalarda veya diğerlerinde değişiklik yapmanız gerekir: How can I force mercurial to accept an empty commit. Bu yazıya bağlı bir mail thread, BCD'yi kaldırmak için MqExtension'ı kullanmanın bir yolunu açıklar (onları itmediğiniz sürece):

+0

Bu, ancak D sadece bir HEAD ise. Hg'de çöp toplama yok, B, C ve D kaybolmayacak. D, sadece itebileceğiniz ya da kullanamayacağınız bir KAFA olacaktır. – DanMan

4

backout aradığınız gibi geliyor.

hg help backout 

Ben tek seferde birden hareketin vazgeçme sanmıyorum, bu yüzden bunları tek tek vazgeçme zorunda: Bkz Bu D üstünde üç kaydedilmesini yaratacak

hg backout D 
hg backout C 
hg backout B 

o D, ve C ve B'nin tersidir. Bu değişiklikleri tek bir değişiklik kümesinde birleştirmek isterseniz, bunları rebase --collapse veya başka bir uzantıdan (örn. histedit veya mq veya collapse uzantılar) kullanarak katlayabilirsiniz.

hg update A 
hg debugsetparents D 
hg commit -m "revert B-D" 

Bu çirkin, ama işe yarıyor:

münferit değişiklikler vazgeçme ama tek seferde hepsini yapmak istemiyorsanız

, aşağıdaki yapabilirdi. Ancak bu, yeniden adlandırılan adlar kaydetmez. Dürüst olmak gerekirse, bunu yapmamayı tavsiye etmem, eğer o kadar çok bireysel geri gönderme komutları yazmak için çok fazla sorun çıkarsa, bunu yapmak için gerçekten ne yapmak istediğinizi gerçekten merak ediyorum. vaka. Alternatif olarak, Jim ve Rafael'in önerdiği gibi yapabilir ve B, C ve D'nin bir dalda olduğuna karar verebilir ve A'ya geri dönerek oraya devam etmeye devam edebilirsiniz (bu noktada tarihin ayrılması). Bu daha uygun olabilir.

+0

Bu, istediğimi yapacak (mq'de üç işi birlikte ezersem), ancak, geri almak istediğiniz 50 taahhüt varsa, hantallaşır. http://stackoverflow.com/questions/1463340/revert-multiple-git-commits (hg için), yani hg karşılığı olan kabul edilen yanıtın ikinci bölümüne daha yakın bir şey arıyorum. reset --hard A && git reset --soft @ {1} && git commit -a ' –

+0

Cevabı Mercurial'da yapmanın bir yolu ile güncelledim. Ancak, bağlandığınız git yanıtı gibi, aslında değişiklikleri değiştirmez. Gerçekten neden bu kadar büyük bir değişim setini geri almak isteyeyim diye merak ediyor. Onları aktif olmayan bir dalda park etmek daha iyidir ve ondan önceki değişiklikten devam edin. Eğer kullanım durumunuzu sorunuzda biraz anlatıyorsanız, sorununuza daha iyi bir çözüm sunmanıza yardımcı olabilir. –

+0

Ayrıca, geri yükleme komutunun yalnızca tek düzeltmeler yerine bir düzeltme setini kabul etmesi için bir özellik isteğini Mercurial'a göndermeyi düşünebilirsiniz. –

4

kolay yolu:

Sen değişiklik kümesi D ve sen o dalda Şimdi

hg commit --close-branch -m "Branch closed" 

sonlandırmak istiyorum, sadece yeni şeyler İşleyen, A changeset ve işinize devam gidin

hg up -r A 
... change stuff ... 
hg ci -m "New stuff" 

B, C ve D'ye sahip olan şube orada olacak, ancak sonlandırılacak, hg heads'da gösterilmeyecektir. Etkin olmayan bir şube olacak.

Bunu yapmak ve ifade etmek de kolaydır. Grafiğe bakarsanız, kapanan ayrı bir şube göreceksiniz ve "resmi" şube devam edecek. Bu, şubenizde gürültü yapan ve geri döndüren değişiklikleri değiştirmekten çok daha iyi.

+1

[Başka bir soruda] açıklandığı gibi (http://stackoverflow.com/questions/3688263/mercurial-beheading- a-kafa), kapalı kafayı başka bir depoya itmeye çalıştığınızda, birden çok kafa oluşturma konusunda bir uyarı alacaksınız. Yani, ilk itişinizde 'hg push --force 'kullanın. Kapalı kafayı çeken insanlar herhangi bir uyarı almayacaklar. – mernst

İlgili konular