Mercurial'da bir özellik dalı nasıl doğru şekilde kapatılır?


240

Bir özellik dalında çalışmayı bitirdim feature-x. Sonuçlarını defaultşubeye geri birleştirmek feature-xve çıktılarından kurtulmak için kapatmak istiyorum hg branches.

Aşağıdaki senaryoyu buldum, ancak bazı sorunları var:

$ hg up default
$ hg merge feature-x
$ hg ci -m merge
$ hg up feature-x
$ hg ci -m 'Closed branch feature-x' --close-branch

Böylece feature-xşube (şarkı söyler 40- 41) kapanır, ancak her seferinde listelenecek yeni bir kafa , kapanış şube değişikliği kümesi vardır :44hg heads

$ hg log ...
o  44 Closed branch feature-x
|
| @  43 merge
|/|
| o  42 Changeset C
| |
o |  41 Changeset 2
| |
o |  40 Changeset 1
|/
o  39 Changeset B
|
o  38 Changeset A
|

Güncelleme : Görünüşe göre 1.5 sürümünden beri Mercurial hg headsartık çıktıda kapalı dalların başkanlarını göstermiyor .

Birleştirilmiş bir dalı bir kafa daha bırakmadan kapatmak mümkün müdür? Bir özellik dalını kapatmanın daha doğru yolu var mı?

İlgili sorular:


@Andrey: ancak işaret edilen makale sadece "--close-branch" hakkında konuşmuyor. Dalınızı budamanın dört yolunu gösterir . Artık gerçekten istemiyorsanız, makalede açıklandığı gibi klonlayabilirsiniz. Tek 'sorun', herhangi bir nedenle onu kapatmak, ancak etrafında tutmak istiyorsanız.
SyntaxT3rr0r

1
@WizardOfOdds Evet, budama ölü dalları hakkındaki tüm makaleyi okudum. Şubenin revizyon tarihinde kalmasını istiyorum, atmamalıyım. Daha önce özellik dallarını default"kapatmadan" birleştirdim . Sonuçta 0 yeni kafa ortaya çıktı ancak bu dallar hg branchessonsuza dek göründü (aktif olmayan dallar olarak).
Andrey Vlasovskikh

Özellikleri geliştirmek için tüm veri havuzunu klonlama ve özellik bittikten sonra yeniden birleştirme eğilimindeyim. Tarihte (kapalı) dal kalıntılarının olmasını sevmiyorum.
DanMan

Yanıtlar:


218

Bunun bir yolu, birleştirilen özellik dallarını açık (ve etkin olmayan) bırakmaktır:

$ hg up default
$ hg merge feature-x
$ hg ci -m merge

$ hg heads
    (1 head)

$ hg branches
default    43:...
feature-x  41:...
    (2 branches)

$ hg branches -a
default    43:...
    (1 branch)

Başka bir yol, fazladan bir taahhüt kullanarak birleştirmeden önce bir özellik dalını kapatmaktır:

$ hg up feature-x
$ hg ci -m 'Closed branch feature-x' --close-branch
$ hg up default
$ hg merge feature-x
$ hg ci -m merge

$ hg heads
    (1 head)

$ hg branches
default    43:...
    (1 branch)

İlki daha basit, ama açık bir dal bırakıyor. İkincisi açık kafa / dal bırakmaz, ancak bir tane daha yardımcı taahhüt gerektirir. Özellik dalına yapılan son gerçek taahhüdü bu ekstra taahhüdü kullanarak birleştirebilir --close-branch, ancak önceden hangi taahhüdün son olacağını bilmek gerekir.

Güncelleme : hem görünmez böylece herhangi bir zamanda şube kapatabilirsiniz Mercurial 1.5 yana hg branchesve hg headsartık. Muhtemelen sizi rahatsız edebilecek tek şey, teknik olarak revizyon grafiğinin hala çocuksuz bir revizyona sahip olmasıdır.

Güncelleme 2 : Mercurial 1.8 yer imleri Mercurial'ın temel özelliği haline geldiğinden. Yer imleri, dallanma için adlandırılmış dallardan daha uygundur. Ayrıca bu soruya bakın:


2
Mutlaka doğru değil Bookmarks are more convenient for branching than named branches. Hg yer imleri Git dalları ile aynı şey değildir. Bunlar, özellik dalları olarak uygun olmayan birçok kenar durumu ile doludur. Örneğin: bir havuzu klonladığınızda, defaultşubedeki en son taahhüdü elde edersiniz . Yer imleri kullanırsanız, bu değişiklik kümesi rastgele (kararsız) bir yer imine karşılık gelir. Adlandırılmış dalları kullanırsanız, genellikle istediğiniz gibi olan kararlı / varsayılan dalda en son taahhüdü alırsınız. Yer imleri bir gün oraya ulaşacak, ancak henüz orada değiller.
Gili

Yer işaretlerini yalnızca yerel depomda görünen özel etiketler olarak kullanıyorum. Tekrar ziyaret etmem gereken değişiklik kümelerinin hatırlatıcıları olarak hareket ediyorlar.
Gili

Ben bu yaklaşımı takip etmeye çalıştı, ancak itme çalışırken hala hata alıyorum: abort: push creates new remote branches:. Neyi yanlış yapabilirdim?
kasperd

79

kapatmayı unuttuğu şubeler için iki dava var

Durum 1: şube varsayılan olarak birleştirilmedi

bu durumda şubeye güncelleme yapıyorum ve --close-branch ile başka bir taahhütte bulunuyorum, talihsiz bir şekilde bu dalın yeni ipucu olmasını seçiyor ve bu nedenle diğer klonlara itmeden önce gerçek ipucunun daha fazla değişiklik ve diğerleri aldığından emin oluyorum o tuhaf uç hakkında kafa karıştırmayın.

hg up myBranch
hg commit --close-branch

Durum 2: şube varsayılan olarak birleştirildi

Bu durum, durum 1'den çok farklı değildir ve durum 1 ve iki ek adım için adımlar çoğaltılarak çözülebilir.

Bu durumda, şube değişiklik kümesine güncelleme yaparım, --close-branch ile başka bir işlem yaparım ve ipucu olan yeni değişiklik kümesini varsayılan olarak birleştiririm. son işlem varsayılan dalda yeni bir ipucu oluşturur - HOORAY!

hg up myBranch
hg commit --close-branch
hg up default
hg merge myBranch

Umarım bu gelecekteki okuyuculara yardımcı olur.


3
Benim gibi bir Mercurial acemi için iyi açık cevap. Ve hg yardım tarafından komutlardan biri olarak listelenmeyen "ci" kullanmadığınız için teşekkür ederiz, bu yüzden ne anlama geldiğini bilmiyorum :)
MB.

8
@MB .: bu gibi durumlarda hg help cisize açıklayacaktır.
Chris Morgan

'Hg birleştirme' komutunun size söyleyeceğine inanıyorum, sonunda başka bir taahhüt daha var
Chip Grandits

11

Ah, çok geç EDIT ... özellik-x değişiklik kümesini korumak istediğinizi belirten yorumunuzu okuyun biliyorum, bu nedenle burada klonlama yaklaşımı işe yaramaz.

Yine de burada cevabın başkalarına yardımcı olabileceğine izin vereceğim.

"Özellik X" ten tamamen kurtulmak istiyorsanız, örneğin işe yaramadıysa, klonlayabilirsiniz. Bu makalede açıklanan yöntemlerden biridir ve işe yarıyor ve özellikle kafalardan bahsediyor.

Bildiğim kadarıyla bu var ve "özellik-x" baş bir kez ve herkes kurtulmak istiyorum:

@    changeset:   7:00a7f69c8335
|\   tag:         tip
| |  parent:      4:31b6f976956b
| |  parent:      2:0a834fa43688
| |  summary:     merge
| |
| | o  changeset:   5:013a3e954cfd
| |/   summary:     Closed branch feature-x
| |
| o  changeset:   4:31b6f976956b
| |  summary:     Changeset2
| |
| o  changeset:   3:5cb34be9e777
| |  parent:      1:1cc843e7f4b5
| |  summary:     Changeset 1
| |
o |  changeset:   2:0a834fa43688
|/   summary:     Changeset C
|
o  changeset:   1:1cc843e7f4b5
|  summary:     Changeset B
|
o  changeset:   0:a9afb25eaede
   summary:     Changeset A

Yani bunu yaparsınız:

hg clone . ../cleanedrepo --rev 7

Ve aşağıdakilere sahip olacaksınız ve x özelliğinin gerçekten gittiğini göreceksiniz:

@    changeset:   5:00a7f69c8335
|\   tag:         tip
| |  parent:      4:31b6f976956b
| |  parent:      2:0a834fa43688
| |  summary:     merge
| |
| o  changeset:   4:31b6f976956b
| |  summary:     Changeset2
| |
| o  changeset:   3:5cb34be9e777
| |  parent:      1:1cc843e7f4b5
| |  summary:     Changeset 1
| |
o |  changeset:   2:0a834fa43688
|/   summary:     Changeset C
|
o  changeset:   1:1cc843e7f4b5
|  summary:     Changeset B
|
o  changeset:   0:a9afb25eaede
   summary:     Changeset A

Ne istediğini yanlış anlamış olabilirim ama lütfen modunu değiştirmeyin, kullanım durumunuzu yeniden üretmeye zaman ayırdım :)


7

Bu sadece edebilirsiniz ... kimse henüz bir özelliktir dalları kapanış en sağlam yolu önerdi ki, garip birleştirmek (yani yakın değiştirilmiş dosyaları ve eş zamanlı olarak şube taahhüt) --close-dal bayrağıyla taahhüt birleştirme:

hg up feature-x
hg merge default
hg ci -m "Merge feature-x and close branch" --close-branch
hg branch default -f

Yani, hepsi bu. Kimse revizyona fazladan kafa atmıyor. Ekstra taahhüt yok.


Cevabımda şöyle bahsettim: "" "Özellik dalına son gerçek taahhüdü, --close-branch kullanarak bu ekstra taahhütle birleştirebiliriz, ancak önceden hangi taahhüdün son olacağını bilmek gerekir." " "
Andrey Vlasovskikh

Tamam anladım. Cümlenin son kısmını tam olarak anlamıyorum ("ama biri bilmeli ..."), bu yüzden bunun farklı bir şey ifade ettiğini düşündüm. Ayrıca, bu yöntemin çoğu GUI aracı (TortoiseHG, SourceTree vb.) Tarafından desteklenmediğini belirtmek isterim.
tav

@AndreyVlasovskikh Bu cevabın amacı, branşın özellik dalının son taahhüdü yerine birleşmede kapatılmasıdır.
kasperd

@tav Yayınlamadan önce mergehg branch , birleştirmenin dal adının açık tutmak istediğiniz ad olduğunu doğrulamak için kullanmak iyi bir fikir olabilir .
kasperd

2
Daha yakından bakıldığında, birleştirme her zaman kapalı dalda olacaktır. İstenen sonuç, ebeveynlerinden birinin dalında olan ve diğer ebeveyninin dalını kapatacağıdır. Bu mümkün görünmüyor. Sonuçta bu uygulanabilir bir çözüm gibi görünmüyor. Çok kötü, gerçekten bir şubenin kapanış noktası olarak birleştirme kullanmak istedim.
kasperd
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.