Mercurial hareket yeni bir dala dönüşüyor


Yanıtlar:


153

Mark tarafından önerildiği gibi, MqExtension sizin sorununuz için bir çözümdür. IMHO daha basit bir iş akışı, rebase uzantısını kullanmaktır . Bunun gibi bir geçmişiniz olduğunu varsayalım:

@  changeset:   2:81b92083cb1d
|  tag:         tip
|  summary:     my new feature: edit file a
|
o  changeset:   1:8bdc4508ac7b
|  summary:     my new feature: add file b
|
o  changeset:   0:d554afd54164
   summary:     initial

Bu, revizyonun 0, özelliğiniz üzerinde çalışmaya başladığınız temel olduğu anlamına gelir . 1-2Diyelim ki adlandırılmış bir dalda revizyon yapmak istiyorsunuz my-feature. Revizyon için güncelleme yapın 0ve bu şubeyi oluşturun:

$ hg up 0
$ hg branch my-feature
$ hg ci -m "start new branch my-feature"

Geçmiş şimdi şöyle görünüyor:

@  changeset:   3:b5939750b911
|  branch:      my-feature
|  tag:         tip
|  parent:      0:d554afd54164
|  summary:     start new branch my-feature
|
| o  changeset:   2:81b92083cb1d
| |  summary:     my new feature: edit file a
| |
| o  changeset:   1:8bdc4508ac7b
|/   summary:     my new feature: add file b
|
o  changeset:   0:d554afd54164
   summary:     initial

rebaseRevizyonları 1-2revizyona taşımak için komutu kullanın 3:

$ hg rebase -s 1 -d 3

Bu, aşağıdaki grafikle sonuçlanır:

@  changeset:   3:88a90f9bbde7
|  branch:      my-feature
|  tag:         tip
|  summary:     my new feature: edit file a
|
o  changeset:   2:38f5adf2cf4b
|  branch:      my-feature
|  summary:     my new feature: add file b
|
o  changeset:   1:b5939750b911
|  branch:      my-feature
|  summary:     start new branch my-feature
|
o  changeset:   0:d554afd54164
   summary:     initial

İşte bu .. Mark'ın cevabına yapılan yorumlarda da belirtildiği gibi, geçmiş manipülasyonunuzu iletebildiğiniz ve uygulayabildiğiniz küçük bir ekipte çalışmadığınız sürece, zaten zorlanmış değişiklik kümelerinin etrafında dolaşmak genellikle kötü bir fikirdir.


4
IMHO bu çözümün dezavantajı, "yeni şube başlat my-feature" kukla commit (yani herhangi bir dosyayı değiştirmeyen) sunmasıdır.
sschuberth

9
@sschuberth: Bence burada açık olmak iyi bir şey. Ekstra değişiklik seti sizin için bir sorunsa, onu bir sonraki ile birleştirin (örneğin fold, şimdi yerleşik histedit uzantısının komutunu kullanarak ).
Oben Sonne

6
@AmirRachum: hg log -G( GraphlogExtension ). Bazı satırları manuel olarak çıkardım, ancak özel günlük stilleri kullanılarak tamamen otomatik olarak da oluşturulmuş olabilir .
Oben Sonne


1
@sschuberth Katılıyorum. Benim çözümüm, sahte olmayan taahhütlerinizi --keepbranches bayrağıyla kukla commit'nin ebeveynine yeniden düzenlemek ve ardından kukla commitinizi hg soymaktır. Bu, bir dalın adını değiştirmek için çok emek gerektirir, ancak bazen Mercurial bu kadar aptaldır.
weberc2

30

MqExtension'ı kullanabilirsiniz . Taşınacak değişiklik kümelerinin 1-3 revizyonları olduğunu varsayalım:

hg qimport -r 1:3    # convert revisions to patches
hg qpop -a           # remove all them from history
hg branch new        # start a new branch
hg qpush -a          # push them all back into history
hg qfin -a           # finalize the patches

63:64 ve 66:68 içe aktarmak istiyorum. Düzeltme alıyorum 65, 64'ün ebeveyni değil
Casebash

65 ile ne yapmak istiyorsun? Mq yalnızca ardışık değişiklik kümelerini bir kafadan dönüştürebilir. Normalde değişmez değişiklik kümelerini, düzenlenebilen değiştirilebilir yamalara dönüştürür. Bu, karmaları değiştirir (tüm çocukları etkiler), böylece atlayamazsınız.
Mark Tolonen

Ana şubede yaptığım ve
bastırdığım

1
Gönderilen değişiklik kümelerini düzenlemeyin. Mq, karmaları değiştirir, böylece etkili bir şekilde yeni değişiklik kümeleri olur. Yalnızca aktarılmamış geçmişi düzenleyin.
Mark Tolonen

Zaten 65'i ittiyseniz, kesinlikle 63 ve 64'ü hareket ettirmemelisiniz ve sadece 66: 68'e razı olmalısınız (yine, sadece onları itmediyseniz).
Matt

9

Mark Tolonen tarafından burada açıklanan yama çözümünü tercih ediyorum

Neyim var:

hg log -G

#default branch
@  changeset:   3:cb292fcdbde1
|
o  changeset:   2:e746dceba503
|
o  changeset:   1:2d50c7ab6b8f
|
o  changeset:   0:c22be856358b

İstediğim:

  @  changeset:   3:0e85ae268e35
  |  branch:      feature/my_feature
  |
  o  changeset:   2:1450cb9ec349
  |  branch:      feature/my_feature
  |
  o  changeset:   1:7b9836f25f28
  |  branch:      feature/my_feature
  |
 /
|
o  changeset:   0:c22be856358b

mercurials komutları:

hg export -o feature.diff 1 2 3
hg update 0
hg branch feature/my_feature
hg import feature.diff

İşte yerel depomun durumu

@  changeset:   6:0e85ae268e35
|  branch:      feature/my_feature
|
o  changeset:   5:1450cb9ec349
|  branch:      feature/my_feature
|
o  changeset:   4:7b9836f25f28
|  branch:      feature/my_feature
|
| o  changeset:   3:cb292fcdbde1
| |
| o  changeset:   2:e746dceba503
| |
| o  changeset:   1:2d50c7ab6b8f
|/
|
o  changeset:   0:c22be856358b

Şimdi varsayılan şubemden 1 2 ve 3 revizyonlarını silmem gerekiyor. Bunu mq'nin uzantısından strip komutu ile yapabilirsiniz. hg stripdeğişiklik kümesini ve tüm soyundan gelenleri depodan kaldırır.

Yapılandırma dosyanıza (.hgrc veya Mercurial.ini) aşağıdaki satırları ekleyerek uzantıyı etkinleştirin:

vim ~/.hgrc ve Ekle :

[extensions]
mq =

Ve şimdi bu depoyu revizyon 1'de çıkarın.

hg strip 1

ve işte buradayız

@  changeset:   3:0e85ae268e35
|  branch:      feature/my_feature
|
o  changeset:   2:1450cb9ec349
|  branch:      feature/my_feature
|
o  changeset:   1:7b9836f25f28
|  branch:      feature/my_feature
|
o  changeset:   0:c22be856358b

not: değişiklik grupları farklıdır ancak revizyonlar aynıdır


5

GUI kullanmaya meyilli olanlar için

  1. Tortoise Hg-> File-> Settingsseçeneğine gidin ve ardından işaretleyin rebase.

görüntü açıklamasını buraya girin

  1. Kaplumbağa kullanıcı arayüzünü yeniden başlatın

  2. Değişiklikleri taşıyacağınız yeni şube oluşturun. Mevcut şube adına tıklayın -> seçin Open a new named branch-> şube adını seçin.

görüntü açıklamasını buraya girin

  1. Taşımak istediğiniz değişiklikler yapılmadıysa public(örneğin draft) 5.'e gidin (Değişiklikler zaten yayınlanmışsa ve kıdemli bir geliştirici değilseniz, işleri büyük ölçüde alt üst edebileceğiniz için kıdemli biriyle konuşmalısınız (bir günah keçisi alın) , Hiçbir sorumluluk almıyorum :)).

View-> Show Console(veya Ctrl+ L) seçeneğine gidin ve ardından konsolda yazın hg phase -f -d 2- burada 2 en düşük revizyondur, yeni şubeye geçeceksiniz.

  1. Branşmana ve revizyona git (değişiklikleri 3. adımda oluşturulan yeni şubeye taşıyorsanız en üstteki revizyon olmalıdır) Right Mouse->Update

  2. Dal ve revizyona gidin, değişiklikleri Right Mouse-> Modify History-> ' den taşıyacaksınız.Rebase

görüntü açıklamasını buraya girin

  1. Tıklayın Rebaseve çatışma olmasın dua edin, gerekirse birleştirin.

  2. Değişiklikleri itin, bu noktada tüm revizyonlar yine de olmalıdır draft.

  3. Değişiklikleri taşıdığınız dalda en üstteki revizyona gidin Right Mouse-> Change Phase to-> Public.

görüntü açıklamasını buraya girin

Umarım bu size biraz zaman kazandırır.


İyi iş! bunu deneyeceğim, sadece bir soru - neden sonunda aşamayı halka açalım? "Uzak bir depoda görülen herhangi bir değişiklik grubu herkese açıktır", bu yüzden zorladığınızda zaten herkese açık olarak ayarlanmayacak mı?
Joshua Duxbury

@JoshLeeDucks Zorlarken publicartık otomatik olarak değişmiyorlar (en azından benim için değişmiyorlar ).
Matas Vaitkevicius
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.