Mercurial'taki yerel taahhütleri silmenin bir yolu var mı?


209

Mercurial'ta aptalca bir hata yapmaya devam ediyorum. Çoğu zaman, bir "hg pull" ve "hg update" yapmadan çalışmaya başlayacağım. Değişikliklerimi zorlamaya çalıştığımda bir hata alıyorum.

Birden fazla kafa, şube vb. Oluşturmaktan kaçınabilmek için yerel taahhütlerimi silmemin bir yolu var mı ? Sadece yerel taahhütlerimi silmek, değişiklikleri ipucu ile birleştirmek ve daha sonra yeniden işlemek istiyorum. Kulağa basit geliyor, değil mi? Ben kolayca ucu ile birleştirmek böylece kolayca yerel taahhütleri silmek için herhangi bir yol bulamıyorum .

Yine, sadece "hg ci" ile yapılan yerel taahhütleri silmeye çalışıyorum. Dosyaları değiştirmek, geri almak vb. İstemiyorum.



12
Aptalca bir hata değil, birkaç kişi aynı havuzla aynı anda çalışırken normal iş akışı.
Juozas Kontvainis

Yanıtlar:


247

" Strip " uzantısını etkinleştirin ve aşağıdakileri yazın:

hg strip #changeset# --keep

#changeset#Kaldırmak istediğiniz değişiklik kümesinin karması nerede . Bu, söz konusu değişiklik kümesini , ondan azalan değişiklik kümeleri de dahil olmak üzere kaldıracak ve çalışma dizininize dokunmadan bırakacaktır . Taahhüt edilen kod değişikliklerinizi de geri almak isterseniz, --keepseçeneği kaldırın .

Daha fazla bilgi için Şerit Uzantısını kontrol edin .

"Bilinmeyen komut 'strip'" alırsanız, etkinleştirmeniz gerekebilir. Bunu yapmak için .hgrcveya Mercurial.inidosyasını bulun ve aşağıdakine ekleyin:

[extensions]
strip =

(Juozas'ın yorumunda belirtildiği gibi) birden fazla kafaya sahip olmanın Mercurial'ta normal iş akışı olduğunu unutmayın. Bununla savaşmak için strip komutunu kullanmamalısınız. Bunun yerine, başınızı gelen kafa ile birleştirmeli, çatışmaları çözmeli, test etmeli ve sonra itmelisiniz.

stripEğer gerçekten dalı kirleten changesets kurtulmak istediğinizde komut yararlıdır. Aslında, bu sorunun durumundaysanız ve tüm "taslak" değişiklik kümelerini kalıcı olarak tamamen kaldırmak istiyorsanız , temel olarak aşağıdakileri öneren üst cevaba göz atın:

hg strip 'roots(outgoing())'

8
@Bharath: Uzantıyı etkinleştirmeniz gerekiyor
Samaursa

1
Mercurial 2.8 olduğundan, şerit bağımsız bir uzantıdır, bu yüzden strip = iyidir. Mercurial 2.8 için WhatsNew
Chih-Hsuan Yen

104

Hg Tortoise kullanıyorsanız, aşağıdaki " strip " uzantısını etkinleştirin :

  1. Dosya / Ayarlar / Uzantıları /
  2. Şerit seçin

Ardından, şeritlemeyi başlatmak istediğiniz yerden alt düzeltmeyi, right clicküzerinde yaparak ve aşağıdakileri seçerek seçin:

  1. Geçmişi değiştir
  2. şerit

Aynen böyle:

resim açıklamasını buraya girin

Bu örnekte 19. revizyondan taahhüt edilen son revizyona kadar silinecektir (22).


2
File/Settings/Extensions/Keşke daha fazla oy ekleyebilseydim. Çok teşekkür ederim!
dyatchenko

Ahh! Bunu denedim ama "hiçbir yedek" veya "yerel değişiklikleri atmak" kontrol olmamasına rağmen tüm değişiklikleri dökümü gibiydi. Bu değişiklikleri korumak istedim, sadece taahhüt etmeyin! Şimdi onları kurtarmak için herhangi bir yolu var mı?
Tim Tisdall

2
Düzgün yapmanın bir yolunu bulamıyorum, ancak geçmeniz gereken içeriği korumak gibi görünüyor --keepve TortoiseHg bu seçeneği vermiyor. Yani ... bunu komut satırında yapmanız gerekiyor hg strip -r . --keep.
Tim Tisdall

3
strip help'den: 'Sökülen değişiklik kümeleri ".hg / strip-backup" içinde bir paket olarak saklanır (bkz. "hg yardım paketi" ve "hg yardım ayrıştırması"). "Hg unbundle .hg / strip-backup / BUNDLE" çalıştırılarak geri yüklenebilir; burada BUNDLE şerit tarafından oluşturulan paket dosyasıdır. '
Tim Tisdall

SourceTree'de de faydalı oldu. Teşekkürler!
Ponomarenko Oleh

22

Modern cevap (sadece Mercurial 2.1'den sonra geçerlidir):

Aşamaları kullanın ve paylaşmak istemediğiniz düzeltmeleri gizli (özel) olarak işaretleyin. Bu şekilde ittiğinizde gönderilmezler.

TortoiseHG'de aşamasını değiştirmek için bir taahhüde sağ tıklayabilirsiniz.

Ayrıca: Çektikten sonra yerel taahhütlerinizi paylaşılan deponun başına taşımak için "rebase" uzantısını da kullanabilirsiniz.


Özel == şimdi gizli
Dmitry Osinovskiy

15

Herkesin işaret ettiği gibi, muhtemelen sadece kafaları çekip birleştirmelisiniz, ancak EditingHistory araçlarından herhangi biri olmadan taahhütlerinizden gerçekten kurtulmak istiyorsanız, o zaman hg clone -rbu değişiklikleri hariç tüm repo'nuzu alabilirsiniz.

Bu, onları orijinal depodan silmez, ancak sahip olmayan yeni bir klon oluşturur. Ardından, değiştirdiğiniz repoyu (isterseniz) silebilirsiniz.


"Hg clone -r" yerel değişiklikleri siliyor mu? Sadece işleri basit tutmak için yerel taahhütleri silmek istiyorum.
user191535

4
Onları klonlanmış depodan silmez, ancak sahip olmayan yeni bir klon oluşturur. Ardından, isterseniz değiştirdiğiniz repoyu silebilirsiniz.
Ry4an Brase

9

Ben de bu problemle karşılaştım. 2 yaptım commitve her iki taahhüdü geri almak ve silmek istedim.

$ hg rollback

Ama hg rollbacksadece son taahhüdüne geri dönüyor, 2 taahhüt değil. O zaman bunu fark etmedim ve kodu değiştirdim.

Bulduğumda hg rollbacksadece bir taahhüt geri aldım, kullanabileceğimi buldum hg strip #changeset#. Yani, hg log -l 10en son 10 taahhüdü bulurdum ve istediğim doğru değişiklik setini alırdım strip.

$ hg log -l 10
changeset:   2499:81a7a8f7a5cd
branch:      component_engine
tag:         tip
user:        myname<myname@email.com>
date:        Fri Aug 14 12:22:02 2015 +0800
summary:     get runs from sandbox

changeset:   2498:9e3e1de76127
branch:      component_engine
user:        other_user_name<name@email.com>
date:        Mon Aug 03 09:50:18 2015 +0800
summary:     Set current destination to a copy incoming exchange

......

$ hg strip 2499
abort: local changes found

Ne anlama abort: local changes foundgeliyor? Bu hg, henüz işlenmemiş kodda değişiklikler bulunduğu anlamına gelir . Bu nedenle, bunu çözmek hg diffiçin değiştirdiğiniz kodu kaydetmeniz ve hg revertve hg strip #changeset#. Aynen böyle:

$ hg diff > /PATH/TO/SAVE/YOUR/DIFF/FILE/my.diff
$ hg revert file_you_have_changed
$ hg strip #changeset#

Yukarıdakileri yaptıktan sonra patchdiff dosyasını yazabilirsiniz ve kodunuz projenize geri eklenebilir.

$ patch -p1 < /PATH/TO/SAVE/YOUR/DIFF/FILE/my.diff

9

Rebase uzantısı ile bunu daha da kolaylaştırabilirsiniz , sadece kullanın hg pull --rebaseve taahhütleriniz dallanan sorunu önleyerek otomatik olarak çekili revizyona geri gönderilir.


1
Yanlış bir şey yaparsanız yanlış bir tarih ve olası yolsuzluk pahasına.
Ry4an Brase

5

Eğer git ile aşina değilseniz kullanmak mutluluk duyarız histedit gibi bu işleri git rebase -i.


4

hg striparadığınız şey bu. git resetGit'e aşina olup olmadığınıza benzer .

Konsolu kullan:

  1. Düzeltme numarasını bilmeniz gerekir. hg log -l 10. Bu komut son 10 işlemi gösterir. Aradığınız taahhüdü bulun. Değişiklik kümesi satırından 4 basamaklı bir sayıya ihtiyacınız varchangeset: 5888:ba6205914681

  2. Sonra hg strip -r 5888 --keep. Bu, kesinliğin kaydını kaldırır, ancak tüm dosyaları değiştirmeye devam eder ve ardından bunları önerebilirsiniz. (sadece silmek için dosyaları silmek istiyorsanız --keephg strip -r 5888


1

[Hg Tortoise 4.6.1] Son yapılan bir işlemse, "Geri Al / Geri Al" işlemini (Ctrl + U) kullanabilirsiniz.

HG Tortoise Görüntüsü


Görüntünün eklenmesini iki kez kontrol edin.
Bill Keller

0

Samaursa'nın mükemmel cevabına ek olarak, evolveuzantının prunegüvenli ve kurtarılabilir bir sürümü olarak kullanabilirsiniz, stripbunun yanlış bir şey yapmanız durumunda geri dönmenizi sağlar.

Şu takma adımda var .hgrc:

 # Prunes all draft changesets on the current repository
 reset-tree = prune -r "outgoing() and not obsolete()"
 # *STRIPS* all draft changesets on current repository. This deletes history.
 force-reset-tree = strip 'roots(outgoing())'

Not pruneayrıca vardır --keeptıpkı strip, dosyaları tekrar yatırmak için izin sağlam çalışma dizinini tutmak için.

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.