Geçmişten silmeden değişiklikleri terk etme


180

Sadece işe yaramayan bir taahhüt var, bu yüzden tarihten silmeden bırakmak istiyorum .

Daha önceki bir revizyondan güncelledim ve taahhüt ettim, böylece yeni bir kafa oluşturdum.


Şubelerim yok, şubeler istemiyorum, sadece yeni kafa ile olduğu gibi devam etmek istiyorum, fantezi bir şey yok, birleştirme yok, endişe yok, sadece bir öncekini unutmaya devam ediyorum.

Bunu nasıl yapacağımı bulamıyorum ve bunun yapılamayacağına inanmaya başlıyorum. Tek bulduğum dallarla ilgili şeyler veya birleştirme ile ilgili şeyler.


1
Reponuzda, bu yüzden tarihten silinmedi. Yeni bir kafa yarattınız, böylece hatasız revizyonlar yapmaya devam edebilirsiniz. Yeni kafaya gitmenizi engelleyen nedir?
ataylor

Şubelere olan istekleriniz neler?
Andres Jaan Tack

@Andres Şubelerden tam olarak kaçınma değil. Sadece kapatmak için aptalca bir adım atmadan çalışmak için ihtiyacım vardı.
o0 '.

Herkes okuyabilir - lütfen bu senaryoda bir şube oluşturulduğunu unutmayın; bu cevapta verilen açıklamaya dikkat edin: stackoverflow.com/a/3692607/3195477
UuDdLrLrSs

Yanıtlar:


181

Deponuzu, unutmak istediğiniz revizyonla kafaya güncelleyin, ardından hg commit --close-branchbu (anonim) dalı kapalı olarak işaretlemek için kullanın . Sonra bu dalın kafasına güncellemek do istiyorum ve çalışmaya devam edin.

-cSeçeneğini kullanıyorsanız, kapalı dalı yine de görebilirsiniz hg heads, ancak varsayılan hg mergeolarak görünmez ve kapalı kafa ile birleştirmeye çalışmadığını bilir.

hg push --forceBu kapalı kafayı başka bir depoya ilk kez bastığınızda kullanmanız gerekecektir, çünkü ittiğinizde uzak depoda ek kafalar oluşturursunuz. Mercurial'a bunun iyi olduğunu söyle --force. Kapalı kafayı çeken insanlar herhangi bir uyarıdan rahatsız olmaz.


3
@Niall C. bunu sadece adlandırılmış bir şube olarak işaretlediyse işe yaramaz mı? Varsayılan olarak yaptığını söylediklerinden varsayıyorum
msarchet

ama ... bu doğru değil, aradığımda hala her iki başı da listeliyorum hg heads... cıva 1.4.3 kullanıyorum, bu daha yeni bir özellik mi?
o0 '.

2
@msarchet: AFAIK, bugün deniyor, --close-branch anonim dallar için çalışmıyor. Olmalı, ama değil. Umarım bu, Mercurial'ın gelecekteki bazı versiyonlarında değişir. Anonim dallar çok güzeldir, ancak adlandırılmış dallar kadar birinci sınıf olmalıdır.
Krazy Glew

4
@KrazyGlew: Sorun, "anonim" bir dalın gerçekten de dayandığı dalla aynı ada sahip ikinci bir dal olmasıdır. Gerçekten (adlı) dalı kapatmaya çalışmıyorsunuz: yaptığınız değişiklikleri atmaya çalışıyorsunuz. Başka bir deyişle, hg branchesüzerinde bulunduğunuz şube adını göstermelidir. Şubeyi kapatmaya çalışmak yerine, anonim dalınızı orijinal şubeye geri birleştirerek tüm değişiklikleri atın.
StriplingWarrior

2
Benim durumumda, varsayılan (bu standart) adlı bir dalı var ve başka bir varsayılan / master (uzak depo aslında git olması nedeniyle düşünüyorum). hg güncelleme varsayılanı / master; hg taahhüt - kapat-şube; hg güncelleme varsayılan benim için çalıştı.
MattD

68

Bu aşamada şubelerle çalışmak istemediğinizi biliyorum , ama tam olarak bunu yaptınız. Önceki bir sürüme geri döndüğünüzde ve işe yarayan bir şey yaptığınızda, bir şube oluşturdunuz - adsız bir şube, ancak aynı şube.


Sadece sizin gibi devam etmek ve birden fazla kafaya sahip olmaktan endişe etmemekle ilgili bir sorun yok, ancak bir şeyleri toparlamak istiyorsanız, yanlışlıkla bir kez yanlış kafa seçmek istemiyorsanız, eski şubeyi öldürebilirsiniz.

Mercurial belgelerinde, Budama Ölü Dallarının etrafındaki çeşitli seçeneklere yönlendiren iyi bir bölüm var .

Sanırım sizin için en iyi seçenek eski şubeyi "kapalı" olarak işaretlemektir. Eski başınız revizyon "123" ise:

hg update -r 123
hg commit --close-branch -m 'Closing old branch'
hg update -C default

3
Blurgh - girdikten sonra @ Niall'ın cevabını gördüm. Niall'ları ve benimkileri sıfırlar havuzda sıfırlayabilir. :)
Nick Pierpoint

1
Cevabınızı daha iyi beğeniyorum, merucrial'in terminolojisinden daha azını gerektiriyor (ki anlayabildiğim kadarıyla git kullanıcılarının kafasını karıştırmak için seçiliyor gibi görünüyor)
tacaswell

8
lol tam tersi! mercurial'in terminolojisi svn kullanıcılarına doğal gelmek için seçildi, git'in cehennem gibi kafa karıştırıcı! neyse, son cevabı içerdiği için bu cevabı iptal ediyor -C
Tobia

2
Neden içeri ihtiyacınız -Cvar hg update? Hiçbir dosyanın değiştirilmediği anlaşılıyor, bu yüzden onsuz çalışması gerekiyor.
maksimum

1
anlayabildiğim kadarıyla hiçbir yerde -C'ye ihtiyacınız yok. ancak, güncellemeye çalıştığınızda olağanüstü değişiklikler yaparsanız bir iptal alırsınız.
Eli Albert

21

Her şeyden önce şunu yazın:

hg heads

Düşünün, listelenen üç başınız var:

changeset:   223:d1c3deae6297
user:        Your name  <your@email.com>
date:        Mon Jun 09 02:24:23 2014 +0200
summary:     commit description #3

changeset:   123:91c5402959z3
user:        Your name <your@email.com>
date:        Sat Dec 23 16:05:38 2013 +0200
summary:     commit description #2

changeset:   59:81b9804156a8
user:        Your name <your@email.com>
date:        Sat Sep 14 13:14:40 2013 +0200
summary:     commit description #1

Diyelim ki son başı aktif tutmak (223) ve gerisini kapatmak istiyorsunuz.

Daha sonra şu şekilde yapardınız:

Yakın kafa # 59

hg up -r 59
hg ci --close-branch -m "clean up heads; approach abandoned"

Yakın kafa # 123

hg up -r 123
hg ci --close-branch -m "clean up heads; approach abandoned"

Değişiklikleri yap

hg push

Sonunda sağ kafaya geçmeyi unutmayın

hg up -r 223

Ve işiniz bitti.


Bu güzel bir öğreticidir, ancak örnek taahhüt mesajları biraz metadır. Sizden öğrenenlerin daha iyi taahhüt mesajları verebilmesi için daha iyi örnekler vereceğim. Gibi bir şey --close-branch -m "Closing branch - technique #2 abandoned in favor of technique #3".
Jason

5
Ayrıca, çalışma kopyanızın hala yeni kapattığınız kafa üzerinde olması dışında, sonunda bitirmeniz gerekiyor. Kapalı kafasında başka bir değişiklik yapmak, yeniden açmak olacaktır. hg up -r 223Herhangi bir değişiklik yapmadan önce yapmak isteyeceksiniz .
Jason R. Coombs

@Jason R. Coombs: Doğru!
Artur Barseghyan

@Niall'a göre, ve şimdi kendi deneyimim hg push --force, sadece hg pushbirden fazla kafa itme uyarısını geçmek için değil , ihtiyacınız olacak .
craq

1
@ Genel olarak katılıyorum. Bu durumda, hg pushtek başına benim için işe yaramadı. Birden fazla kafa nedeniyle reddederse, harici bir repodaki değişiklikleri itmeyi nasıl önerirsiniz?
craq

12

Kullanmak istiyorsun hg backout. Bu, değişiklik kümesinin alt değişiklik kümelerinden yaptığı değişiklikleri kaldırır.

İyi bir açıklama için buna göz atın. Mercurial Backout


2
Bu tam olarak doğru cevap. Geri çekme, bir değişiklik kümesinin tersini ekler, çalışmayı geri alır ve size fikri neden beğenmediğinizi hatırlatmak için bir taahhüt mesajı verir.
Ry4an Brase

7
Aslında katılmıyorum - bir kafadaki işi terk etmek ve iyi bir başlangıç ​​noktasından başlamak, kesintileri kullanmaktan daha temiz bir çalışma modeli gibi görünüyor. Özellikle bir seferde birden fazla değişiklik setini geri çeviremediğiniz için.
Martin Geisler

1
@Martin Geisler, genel olarak buna katılıyorum, ancak OP değişiklikleri
şubesiz

2
@Martin Geisler evet Ben sadece bazen kötü bir değişiklik nuking dallanma için en iyisidir
msarchet

1
bazen yararlı olabilir, ama gerçekten istediğim bu değildi. Yine de teşekkürler :)
o0 '.

2

Hem Niall'ın hem de Nick'in cevapları doğrudur. Kendimi çok sarkan kafalar yarattığım için, kafaları daha kolay kapatmak için bir takma ad yazdım. Bunu aşağıdakilere ekleyerek .hgrc:

[alias]
behead = !REV=$($HG id -i); $HG update $@ -q && $HG ci --close-branch -m "Closing dead head" && $HG update $REV -q

(zaten bir [alias]bölümünüz varsa bunun yerine bölüme ekleyebilirsiniz)

Artık tek bir komutla (ve manuel olarak farklı bir değişiklik kümesine manuel olarak güncelleme yapmak zorunda kalmadan) bir kafayı şu şekilde kapatabilirsiniz:

$ hg behead 123

Not: takma ad, Mercurial takma adlarının kabuk komutları olabileceği gerçeğinden yararlanır . Bu, bunun yalnızca Windows'ta değil, yalnızca UNIX'te çalışacağı anlamına gelir.


2

İstenmeyen dalı kapatmaya veya sıyırmaya bir alternatif, onu etkilerini tamamen atacak, ancak tarihte bırakacak şekilde birleştirmek olacaktır . Bu yaklaşım, istenmeyen değişikliklerin bir itme sırasında yayılmasına izin verecektir - bu yüzden bunu yalnızca amaçlanan etki ise kullanın.

Diyelim ki değişiklik kümesi geçmişi şöyle görünüyor:

1-2-3-4-5-6    
       \    
        7-8-*

ve öyle 5ve 6artık hangi aranıyordu.

Bunu yapabilirsiniz:

hg up 8
hg merge -r 6 -t :local
hg commit ...

Bu da bunu yaratacak:

1-2-3-4-5-6    
       \   \
        7-8-9-*

Güncelleme 8, tarihte tutmak istediğiniz kafada çalışmanızı sağlar.

-t :localTalimatını denilen birleştirme "aracını" kullanmak hg yerel yani diğer şube, değişiklikleri, geçerli çalışma klasörünü devlet tarafından temsil edilen DEĞİL birini görmezden söyler. Daha fazla bilgi .

Böylece tarihte istenmeyen değişiklikler olur 5ve 6tarihte korunur ancak daha yeni bir şeyi etkilemez.


2

Bu Evolve uzantısı için bir kullanım durumudur . Şu anda Mercurial ile birlikte gelmediğinden, teknik olarak üçüncü taraf bir uzantıdır. Ancak Mercurial geliştiricileri de dahil olmak üzere bir grup insan tarafından oldukça yoğun bir şekilde kullanılıyor, çok aktif olarak geliştiriliyor ve hiçbir yere gitmiyor.

Evolve eklentisiyle,

hg prune -r revname

ve hayatınıza devam edin. Set hala orada olacak, ama artık kullanılmayacak. --hiddenSeçeneği Mercurial komutlarına geçirmedikçe görünmez ve varsayılan olarak uzak depolara gönderilmez. Gerçi gerçekten istiyorsan zorlayabilirsin.

Budama yaptığınız setin tutmak istediğiniz ataları varsa, bu değişiklik kümelerini yeniden oluşturmak için koşmanız gerekir hg evolve. hg evolvebunu otomatik olarak yapar. Aksi takdirde, hiçbir şey yapmanıza gerek yoktur.


1

İstenmeyen başı klonlamadan bozuk repo'nuzu yeni bir klonlayabilirsiniz. Sonra eski havuzu kaldırın, yeni oluşturulan klonu orijinal yerine taşıyın ve onunla çalışmaya devam edin. Bu biraz zaman alacak, ancak bu istenmeyen revizyonun işareti olmadan mükemmel temiz bir depo elde edeceksiniz.

hg clone --rev myGoodResition myDirtyRepo myCleanRepo

1
Sorduğum şey bu değil, üzgünüm.
o0 '.

4
@ Kristof: Bu bir şaka mı? Yazımın ilk satırını yeniden okuyun : " geçmişten silmeden
bırak

-1

Yanlışlıkla oluşturulmuş bir kafaya kafa koymak istediğimde bu sorunla birçok kez karşılaştım. Her zaman dünyanın yüzünden kaybolduğunu görmek isterim.

Yerel kopyanızda en son sürümü alın ve ardından:

  1. Şeritlemek istediğiniz kafanın başlangıcını bulun (yeni bir boynun dallanmaya başladığı yerde), revizyon numarasını alın

  2. Soyun.


Kaynak: TipsAndTricks .

Kaynak: PruningDeadBranches # Using_strip .

hg --config extensions.hgext.mq= strip -n <rev>
  1. Önemsiz bir dosya güncellemesi yapın (bir dosyaya boşluk ekleyin), kesin ve itin.

Deponuz şimdi başınızı soymuş olmalı. Son adım, sıyırma işleminin merkezi deponuza gönderebileceğiniz herhangi bir değişiklik yaratmaması nedeniyle önemlidir. Son adım olmadan sadece kafayı yerel olarak çıkardın.


1
Ancak, itmek hiçbir zaman uzak depodan hiçbir şeyi silmez. Sadece bilgi ekler . Değişiklik kümesi zaten merkezi depodaysa, evolve uzantısını kullanmanız veya bir şekilde merkezi sunucunun üzerinde şeritlemeniz gerekir. Değişiklik kümesi zaten merkezi depoda değilse, yerel olarak sıyırma işlemi herhangi bir itme gerekmeden yeterli olacaktır.
Ben
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.