Mercurial - eski sürüme dön ve oradan devam et


249

Mercurial'ı yerel olarak bir proje için kullanıyorum (başka herhangi bir yere itme / çekme tek repo).

Bugüne kadar doğrusal bir tarihi var. Ancak, üzerinde çalıştığım şu an fark ettiğim şey korkunç bir yaklaşım ve başlamadan önce sürüme geri dönmek ve farklı bir şekilde uygulamak istiyorum.

Mercurial'daki branch/ revert/ update -Ckomutları ile biraz kafam karıştı . Temel olarak 38 sürümüne (şu anda 45'te) geri dönmek ve bir sonraki taahhütlerimin ebeveyn olarak 38 olması ve oradan devam etmesini istiyorum. 39-45 revizyonlarının sonsuza kadar kaybedilip kaybedilmeyeceği veya kendilerine ait bir çıkmaz dal ile sonuçlanacağı umurumda değil.

Hangi komut / komut kümesine ihtiyacım var?


6
İlgilenen herkes için bu, ilgili dönüş çubuğuna geri döndü, bu da geri dönüşün güncellenmesine karşı büyük bir açıklama: stackoverflow.com/questions/2506803/…
Paolo

Yanıtlar:


150
hg update [-r REV]

Daha sonra taahhüt ederseniz, etkili bir şekilde yeni bir şube oluşturacaksınız. Daha sonra yalnızca bu dalda çalışmaya devam edebilir veya sonunda mevcut şubeyi birleştirebilirsiniz.


6
bir sonraki taahhüt yeni bir şube oluşturacak. Emin değilseniz, sadece deponuzu yedekleyin (çalışma kopyasıyla), deneyin - sonucu beğenmeyin -> ücretsiz olarak sıfırdan başlayın
van

Bu, şu anki değişikliklerinizi muhtemelen yapmak istemediğiniz eski revizyonla birleştirdiği için şüpheli bir cevaptır. Doğru cevap hg geri dönmelidir.
Trevor de Koekkoek

Birleştirme hakkındaki bit dışında cevap gayet iyi (soru soran kişinin birleşmek istemeyeceğini düşünüyorum).
ctrl-alt-delor

3
@NeonWarge REV, revizyon için sadece bir yer tutucudur. Onun numarası, hash, bir yer imi ve benzeri olabilir. Trevor: Bu şüpheli değil çünkü hiçbir şeyi birleştirmiyor. Gerek yok.
DanMan

401

İşte komutlardaki hile sayfası:

  • hg updateçalışma kopyası üst revizyonunuzu ve dosya içeriğini bu yeni üst revizyonla eşleşecek şekilde değiştirir. Bu, güncelleme yaptığınız revizyondan yeni taahhütlerin devam edeceği anlamına gelir.

  • hg revertyalnızca dosya içeriğini değiştirir ve çalışan kopya üst sürümünü tek başına bırakır. Genellikle hg revert, bir dosyada yaptığınız taahhüt edilmemiş değişiklikleri çalışma kopyanızda tutmak istemediğinize karar verirseniz kullanırsınız .

  • hg branchadlı yeni bir şube başlatır. Adlandırılmış bir dalı, değişiklik kümelerine atadığınız bir etiket olarak düşünün. Bu durumda hg branch red, aşağıdaki değişiklik kümeleri "kırmızı" şubeye ait olarak işaretlenir. Bu, özellikle farklı insanlar farklı dallarda çalıştığında ve daha sonra bir değişiklik kümesinin nereden geldiğini görmek istediğinizde, değişiklik kümelerini düzenlemenin güzel bir yolu olabilir. Ama bunu kendi durumunuzda kullanmak istemezsiniz.

Eğer kullanırsanız hg update --rev 38bir sarkan kafasını bizim dediğimiz gibi - daha sonra 39-45 çıkmaza olarak kalacak changesets. İttiğiniz depoda "birden fazla kafa" oluşturacağınız için, ittiğinizde bir uyarı alırsınız. Uyarı, birisinin birleşme yapması gerektiğini öne sürdükleri için bu tür kafaları bırakmak biraz kaba olduğu için orada. Ama sizin durumunuzda sadece devam edebilirsiniz ve hg push --forcegerçekten asılı bırakmak istediğiniz için.

Henüz 39-45 revizyonunu başka bir yere itmediyseniz, bunları gizli tutabilirsiniz. Çok basit: hg clone --rev 38 foo foo-38sizinle yalnızca revizyon 38'e kadar yeni bir yerel klon alacaksınız. Çalışmaya devam edebilir foo-38ve oluşturduğunuz yeni (iyi) değişiklik kümelerini itebilirsiniz. Klonunuzda hala eski (kötü) revizyonlar olacak foo. (Klonları istediğiniz gibi yeniden adlandırabilirsiniz, örn foo. foo-badVe foo-38kime foo.)

Son olarak da kullanabilir hg revert --all --rev 38ve sonra taahhütte bulunabilirsiniz. Bu, revizyon 38 ile aynı görünen bir revizyon 46 yaratacaktır. Daha sonra revizyon 46'dan çalışmaya devam edeceksiniz. Bu, tarihte olduğu gibi aynı çatalla bir çatal oluşturmayacak hg update, ancak diğer taraftan çoklu kafalar. hg revert45 numaralı revizyona dayanarak zaten kendi çalışmalarını yapmış olanlarla işbirliği yapsaydım kullanırdım hg update. Aksi takdirde daha açıktır.


2
MUHTEŞEM cevap. Hg revert --all --rev ## kullandım ve kıçımı kurtardı: D
Van Thoai Nguyen 29:12

1
Sarkan başın kolunu da kapatmak daha iyi olmaz mıydı ? Bu, depo hakkında gelecekteki uyarıları engelleyecektir. Bkz. Stackoverflow.com/a/3688320/900130
Zoltán

not: hg revert --all --rev xxx, yerel deponuzda bulunduğunuz yerden geri dönmek için gereken yerel dosyaları değiştirir. Bu nedenle, geri dönmek istediğiniz yere daha önce güncelleme yapmanız gerekir.
Vincent

Önceki bir sürümü dallamak için önce bir geri, ardından bir güncelleme yapmak zorunda kaldım. Olduğu söyleniyor, çoğundan daha az opak bir açıklama.
CodeLurker

30

Sadece taahhüt ve itme yaptıktan hemen sonra, sadece bir dosyayı önceki revizyona geri döndürme ihtiyacı ile karşılaştım. Bu düzeltmeleri belirtmek için kestirme sözdizimi diğer yanıtlar tarafından kapsanmamaktadır, bu nedenle bunu yapmak için komut

hg revert path/to/file -r-2

Bu -2, son taahhütten önce sürüme geri dönecek, kullanıldığında -1mevcut taahhüt edilmemiş değişiklikler geri alınacaktır.


1
Bunu son derece yararlı buluyorum. Tabii ki -r seçeneği için sadece revizyon numarasını sağlayabilirsiniz
Alex

Belirli bir düzeltmeyi de seçebilirsiniz. ör.hg revert path/to/file -r478
Matt

7

IMHO, hg strip -r 39bu davaya daha iyi uyuyor.

Mq uzantısının etkinleştirilmesini gerektirir ve Martin Geisler tarafından önerilen "klonlama repo yöntemi" ile aynı sınırlamalara sahiptir: Değişiklik kümesi bir şekilde yayınlandıysa, (muhtemelen) bir süre sonra repoma dönecektir. yerel repo.


Bunu bilmiyordum. Repoyu silmek ve yeniden klonlamaktan daha kolay ve temiz. Teşekkürler.
Monica'yı eski durumuna getirme - notmaynard

6

Kullandıktan sonra hg update -r REVbu değişikliği nasıl uygulayacağınız cevabında net değildi, böylece itebilirsiniz.

Güncellemeden sonra taahhütte bulunmaya çalışırsanız Mercurial herhangi bir değişiklik olduğunu düşünmez.

İlk olarak herhangi bir dosyada değişiklik yapmalıydım (örneğin bir README'de), Mercurial yeni bir değişiklik yaptığımı fark etti, sonra bunu yapabilirdim.

Bu daha sonra belirtildiği gibi iki kafa yarattı.

İtmeden önce diğer kafadan kurtulmak için, bu durumu düzeltmek için No-Op Merges adımını izledim .

Sonra itebildim.


Bir yapabileceğiniz commit --close-brancheski dal üzerinde. push -fYeni kafaları da itebilirsiniz, ancak bu, mevcut olanı karıştırmasına neden olabilir.
ctrl-alt-delor

5

Yukarıdaki cevaplar çok faydalıydı ve çok şey öğrendim. Ancak, ihtiyaçlarım için kısa ve öz cevap:

hg revert --all --rev ${1}

hg commit -m "Restoring branch ${1} as default"

${1}revizyon numarası veya şubenin adı nerede . Bu iki satır aslında bir bash betiğinin bir parçasıdır, ancak manuel olarak yapmak istiyorsanız kendi başlarına iyi çalışırlar.

Bir sürüm dalına bir düzeltme eklemeniz gerekiyorsa, ancak varsayılandan derlemeniz gerekiyorsa (CI araçlarımızı doğru ve dallardan oluşturup daha sonra sürüm dallarıyla ortadan kaldırana kadar) bu yararlıdır.


1

Tortoise Hg'yi (Mercurial için ücretsiz bir GUI) kuracaktım ve kullanacağım. Daha sonra geri dönmek isteyebileceğiniz bir düzeltmeyi sağ tıklayabilirsiniz - tüm taahhüt mesajları gözünüzün önünde - ve 'Tüm dosyaları geri al'. Bir dosya setinin sürümleri arasında ileri ve geri hareket etmeyi sezgisel ve kolay hale getirir; bu, bir sorunun ilk ortaya çıktığı zamanı belirlemek istiyorsanız gerçekten yararlı olabilir.

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.