Bagaimana cara menutup cabang fitur dengan benar di Mercurial?

240

Saya sudah selesai mengerjakan cabang fitur feature-x. Saya ingin menggabungkan hasil kembali ke defaultcabang dan menutup feature-xuntuk menyingkirkannya di keluaran hg branches.

Saya datang dengan skenario berikut, tetapi memiliki beberapa masalah:

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

Jadi feature-xcabang (perubahan 40- 41) ditutup, tetapi ada satu kepala baru , cabang perubahan 44yang berubah, yang akan dicantumkan di hg headssetiap waktu:

$ 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
|

Pembaruan : Tampaknya sejak versi 1.5 Mercurial tidak menampilkan kepala cabang yang tertutup dalam keluaran hg headslagi.

Apakah mungkin untuk menutup cabang gabungan tanpa meninggalkan satu kepala lagi? Apakah ada cara yang lebih benar untuk menutup cabang fitur?

Pertanyaan-pertanyaan Terkait:

Andrey Vlasovskikh
sumber
@ Andrew: tetapi artikel yang ditunjukkan TIDAK hanya berbicara tentang "--close-branch". Ini menunjukkan empat cara untuk memangkas cabang Anda. Jika Anda benar-benar tidak menginginkannya lagi, Anda dapat mengkloning sebagaimana dijelaskan dalam artikel. Satu-satunya 'masalah' adalah jika karena alasan apa pun Anda ingin menutupnya, tetap pertahankan.
SyntaxT3rr0r
1
@WizardOfOdds Ya, saya sudah membaca seluruh artikel tentang pemangkasan cabang yang mati. Saya ingin cabang tetap dalam sejarah revisi, bukan untuk membuangnya. Sebelumnya saya baru saja menggabungkan cabang fitur menjadi defaulttanpa "menutup" mereka. Ini menghasilkan 0 kepala baru tetapi cabang tersebut terlihat hg branchesselamanya (sebagai cabang tidak aktif).
Andrey Vlasovskikh
Untuk mengembangkan fitur, saya cenderung mengkloning seluruh repositori dan kemudian menggabungkannya kembali setelah fitur selesai. Saya tidak suka memiliki sisa-sisa (tertutup) cabang dalam sejarah.
DanMan

Jawaban:

218

Salah satu caranya adalah membiarkan cabang fitur yang digabung tetap terbuka (dan tidak aktif):

$ 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)

Cara lain adalah dengan menutup cabang fitur sebelum bergabung menggunakan komit ekstra:

$ 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)

Yang pertama lebih sederhana, tetapi meninggalkan cabang terbuka. Yang kedua tidak meninggalkan kepala terbuka / cabang, tetapi membutuhkan satu lagi komitmen tambahan. Seseorang dapat menggabungkan komit aktual terakhir ke cabang fitur dengan komit tambahan ini menggunakan --close-branch, tetapi orang harus tahu sebelumnya komit mana yang akan menjadi yang terakhir.

Pembaruan : Sejak Mercurial 1.5 Anda dapat menutup cabang kapan saja sehingga tidak akan muncul di keduanya hg branchesdan hg headslagi. Satu-satunya hal yang mungkin dapat mengganggu Anda adalah bahwa secara teknis grafik revisi masih akan memiliki satu revisi lagi tanpa anak.

Pembaruan 2 : Sejak Mercurial 1.8 bookmark telah menjadi fitur inti dari Mercurial. Bookmark lebih nyaman untuk bercabang daripada cabang-cabang yang disebutkan Lihat juga pertanyaan ini:

Andrey Vlasovskikh
sumber
2
Belum tentu benar demikian Bookmarks are more convenient for branching than named branches. Bookmark Hg tidak sama dengan cabang Git. Mereka penuh dengan banyak kasus tepi yang membuatnya tidak cocok sebagai cabang fitur. Sebagai contoh: ketika Anda mengkloning repositori Anda akan berakhir dengan komit terbaru di defaultcabang. Jika Anda menggunakan bookmark, perubahan ini terkait dengan bookmark acak (tidak stabil). Jika Anda menggunakan cabang bernama, Anda akan mendapatkan komit terbaru di cabang stabil / default, yang biasanya Anda inginkan. Penanda akan sampai di sana suatu hari, tetapi belum ada di sana.
Gili
Saya menggunakan bookmark sebagai tag pribadi yang hanya terlihat di repositori lokal saya. Mereka bertindak sebagai pengingat perubahan yang perlu saya kunjungi kembali.
Gili
Saya mencoba mengikuti pendekatan ini, tapi aku masih mendapatkan error ketika mencoba untuk push: abort: push creates new remote branches:. Apa yang bisa saya lakukan salah?
kasperd
79

imho ada dua kasus untuk cabang yang lupa ditutup

Kasus 1: cabang tidak digabung ke default

dalam hal ini saya memperbarui ke cabang dan melakukan komitmen lain dengan --close-branch, sayangnya ini memilih cabang untuk menjadi ujung baru dan karenanya sebelum mendorongnya ke klon lain saya memastikan bahwa ujung yang sebenarnya menerima beberapa perubahan lagi dan yang lainnya jangan bingung tentang tip aneh itu.

hg up myBranch
hg commit --close-branch

Kasus 2: cabang digabung ke default

Kasing ini tidak jauh berbeda dengan kasing 1 dan dapat diselesaikan dengan mereproduksi langkah untuk kasing 1 dan dua kasing tambahan.

dalam hal ini saya perbarui ke cabang changeset, lakukan komit lain dengan --close-branch dan gabungkan perubahan baru yang menjadi tip ke default. operasi terakhir menciptakan tip baru yang ada di cabang default - HOORAY!

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

Semoga ini bisa membantu pembaca masa depan.

Nachbars Lumpi
sumber
3
Jawaban yang jelas dan bagus untuk pemula Mercurial seperti saya. Dan terima kasih karena tidak menggunakan "ci" yang tidak terdaftar sebagai salah satu perintah oleh hg bantuan, jadi saya tidak tahu apa artinya :)
MB.
8
@ MB: dalam kasus seperti itu, hg help ciakan menjelaskannya kepada Anda.
Chris Morgan
Saya percaya karena perintah 'hg merge' akan memberi tahu Anda, masih ada lagi komit di akhir
Chip Grandits
11

EDIT Aduh, sudah terlambat ... Saya tahu membaca komentar Anda yang menyatakan bahwa Anda ingin menjaga fitur-x changeset sekitar, sehingga pendekatan kloning di sini tidak bekerja.

Saya masih akan membiarkan jawabannya di sini karena dapat membantu orang lain.

Jika Anda ingin sepenuhnya menghilangkan "fitur X", karena, misalnya, tidak berfungsi, Anda dapat mengkloning. Ini adalah salah satu metode yang dijelaskan dalam artikel dan itu berhasil, dan berbicara secara khusus tentang kepala.

Sejauh yang saya mengerti Anda memiliki ini dan ingin menyingkirkan "feature-x" head sekali dan untuk semua:

@    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

Jadi kamu melakukan ini:

hg clone . ../cleanedrepo --rev 7

Dan Anda akan memiliki yang berikut ini, dan Anda akan melihat bahwa fitur-x memang hilang:

@    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

Saya mungkin salah paham tentang apa yang Anda inginkan tetapi tolong jangan dimatikan, saya mengambil waktu mereproduksi use case Anda :)

SintaksT3rr0r
sumber
7

Sungguh aneh, bahwa belum ada yang menyarankan cara paling kuat untuk menutup cabang fitur ... Anda bisa menggabungkan gabungan komit dengan flag --close-branch (mis. Komit file yang dimodifikasi dan tutup cabang secara bersamaan):

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

Jadi, itu saja. Tidak ada kepala tambahan pada revgraph. Tidak ada komitmen ekstra.

tav
sumber
Saya telah menyebutkannya dalam jawaban saya: "" "Seseorang dapat menggabungkan komit aktual terakhir ke cabang fitur dengan komit ekstra ini menggunakan --close-branch, tetapi orang harus tahu sebelumnya komit mana yang akan menjadi yang terakhir." " "
Andrey Vlasovskikh
Ok aku paham. Saya hanya tidak mengerti bagian terakhir kalimat ("tetapi orang harus tahu ..."), jadi saya pikir itu berarti sesuatu yang berbeda. Saya juga ingin mencatat bahwa metode ini tidak didukung oleh sebagian besar alat GUI (TortoiseHG, SourceTree dll.).
tav
@AndreyVlasovskikh Inti dari jawaban ini adalah untuk menutup cabang di gabungan daripada di komit terakhir dari cabang fitur.
kasperd
@tav Sebelum mengeluarkan mergeperintah, mungkin ide yang baik untuk digunakan hg branchuntuk memverifikasi bahwa nama cabang dari penggabungan adalah salah satu yang ingin Anda tetap buka.
kasperd
2
Jika dilihat lebih dekat, tampaknya penggabungan akan selalu berada di cabang tertutup. Hasil yang diinginkan adalah pada cabang salah satu orang tuanya dan menutup cabang dari orang tuanya. Sepertinya itu tidak mungkin. Jadi ini tidak terlihat seperti solusi yang bisa diterapkan. Sayang sekali, saya benar-benar ingin menggunakan gabungan sebagai titik penutup cabang.
kasperd