Mercurial: Bisakah saya mengganti nama cabang?

205

Kami sekarang memiliki cabang "stiging", di mana "pementasan" tampaknya cocok semantik yang jauh lebih baik. Apa strategi yang baik untuk menangani ini?

KevDog
sumber

Jawaban:

224

Perbarui ke stigingcabang dan buat cabang baru darinya. Kemudian tutup cabang lama.

Singkatnya:

hg update stiging
hg branch staging
hg commit -m"Changing stiging branch to staging."
hg update stiging
hg commit --close-branch -m"This was a typo; use staging instead."
hg push --new-branch
Elliot Cameron
sumber
1
Ini adalah cara terbaik untuk melakukan ini yang saya temukan. Menutup cabang mencegah orang lain menggunakannya secara tidak sengaja karena tidak muncul di output "cabang hg". Masih memungkinkan Anda untuk mengaksesnya nanti jika Anda tahu namanya.
Utensil
2
Apakah Mercurial mengizinkan penggunaan kembali nama cabang tertutup? Yaitu, jika Anda memiliki cabang v3, dapatkah Anda menggunakan teknik di atas untuk mengubah nama menjadi v4 dan kemudian memotong cabang v3 baru meskipun telah meninggalkan v3 tertutup?
Joshua Goldberg
4
@ JoshuaGoldberg, 3noch salah. Mercurial akan memungkinkan Anda untuk menggunakan kembali nama cabang tertutup jika Anda menggunakannya --force. Sebagai contoh: hg branch --force v3. Ini akan menghasilkan hg update v3pembaruan ke v3cabang baru , seperti yang Anda inginkan.
Gili
2
mengonfirmasi komentar Gili dengan cabang bantuan hg: "- memaksa menetapkan nama cabang bahkan jika itu membayangi cabang yang ada"
Joshua Goldberg
7
Jika Anda menutup stigingsebelum bercabang, Anda tidak mendapatkan "ujung yang longgar"
max.mustermann
60

Untuk pembaca yang akan datang: Dengan rebaseekstensi, Anda dapat membuat cabang baru dengan orang tua yang sama stigingdan memindahkan seluruh sejarah cabang ke sana, seperti ini:

hg update -r "parents(min(branch('stiging')))"
hg branch staging
hg commit
hg rebase --source "min(branch('stiging'))" --dest staging

Ini mengasumsikan bahwa stiginghanya memiliki satu orangtua. Tentu saja Anda bisa menggunakan angka revisi eksplisit saja.

Catatan 1: Jika cabang stigingmenyertakan gabungan dengan cabang lain, saya pikir ini akan mempertahankannya, selama stagingdan stigingmemiliki induk yang sama. Tapi aku akan mengeceknya.

Catatan 2: Karena ini mengedit sejarah, cabang lama tidak akan hilang begitu saja dari repositori yang dikloning (lihat rebasedokumentasi). Kecuali setiap orang dapat mengkloning baru, itu mungkin bukan solusi yang sangat praktis untuk kelompok besar.

Note3 / Edit (milik @JasonRCoombs): Sekarang fase - fase standar dalam mercurial, rebaseakan menolak untuk memodifikasi perubahan yang telah didorong. Entah membodohinya dengan mengubah fase kembali ke draft (with hg phases), atau membiarkan cabang lama tetap di sana, dan hanya membuat salinan yang dinamai dengan benar (misalnya, dengan `hg rebase --keep ').

Alexis
sumber
+1 untuk tim kecil tempat Anda dapat memaksa pengguna untuk mengkloning ini adalah ide yang bagus - atau gunakan hg convertsebagai gantinya.
hochl
5
Dengan Mercurial versi terbaru, perintah rebase akan gagal dengan "tidak dapat menset ulang perubahan yang tidak dapat diubah" jika perubahan yang akan dipindahkan adalah "publik". Entah memaksa mereka untuk menjadi konsep (dengan fase hg) atau meneruskan --keepke perintah rebase, yang akan menyalin alih-alih memindahkan perubahan.
Jason R. Coombs
Pada langkah 4: abort: can't rebase immutable changeset 11b1e2b7dc4f. Perhatikan bahwa saya telah mencangkok perubahan dari cabang lain ke cabang ini. Selain itu, itu terpisah dan bergabung.
Mark Jeronimus
@ Mark, lihat Catatan 3 di atas.
alexis
6
Alih-alih melakukan set perubahan pada cabang baru dan kemudian rebasing di atasnya, Anda bisa menghilangkan itu dan menggunakan nilai .Anda --destdan rebase akan mengambil nama cabang baru secara otomatis.
weberc2
16

Jika Anda memiliki set perubahan di dalamnya, maka Anda harus menggunakan ekstensi konversi dengan branchmap untuk mengubah nama itu. Setiap orang kemudian harus mengkloning repo baru atau menanggalkan cabang lama.

tghw
sumber
1
Ini adalah solusi yang menarik, dapatkah Anda menjelaskan lebih banyak?
DrM
15

Buat cabang baru yang disebut "pementasan" dan lupakan yang lain ...

lctr30
sumber
+1 itulah yang akan saya lakukan. Changeet lama masih akan memiliki nama branche yang lama, tetapi yang baru akan memiliki nama cabang yang baru.
barjak
6

Ini memodifikasi riwayat dan hanya untuk pengguna Mercurial tingkat lanjut. Jangan lakukan ini jika Anda tidak tahu apa artinya itu.

Jika stiging hanya lokal, Anda dapat mengubahnya menjadi staging dengan kombinasi graft dan strip . Mulailah dengan memperbarui ke set leluhur di mana stiging telah menyimpang. Buat cabang pementasan dan graft setiap komit dari stiging ke pementasan. Pementasan sekarang harus menjadi salinan stiging. Terakhir, hancurkan stiging dengan melepaskan komit pertamanya.

hg update {SHA-1 of the ancestor changeset}
hg branch staging
hg graft {first changeset in stiging} ... {stiging head-1} {stiging head}
hg strip {first changeset in stiging}
hg push --new-branch
AWrightIV
sumber
1
Untuk langkah 3 Anda dapat menggunakanhg graft {first changeset in stiging}..{stiging head}
KCD