Perbedaan terbesar adalah bagaimana nama-nama cabang dicatat dalam sejarah. Dengan cabang bernama, nama cabang disematkan di setiap perubahan dan dengan demikian akan menjadi bagian abadi dari sejarah. Dengan klon tidak akan ada catatan permanen dari mana perubahan tertentu berasal.
Ini berarti bahwa klon sangat bagus untuk eksperimen cepat di mana Anda tidak ingin merekam nama cabang, dan cabang bernama bagus untuk cabang jangka panjang ("1.x", "2.x" dan yang serupa).
Perhatikan juga bahwa repositori tunggal dapat dengan mudah mengakomodasi beberapa cabang ringan di Mercurial. Cabang in-repositori seperti itu dapat di-bookmark sehingga Anda dapat dengan mudah menemukannya lagi. Katakanlah Anda telah mengkloning repositori perusahaan ketika terlihat seperti ini:
[a] --- [b]
Anda kembali dan membuat [x]
dan [y]
:
[a] --- [b] --- [x] --- [y]
Berarti saat seseorang memasukkan [c]
dan [d]
ke dalam repositori, jadi ketika Anda menarik Anda mendapatkan grafik sejarah seperti ini:
[x] --- [y]
/
[a] --- [b] --- [c] --- [d]
Di sini ada dua kepala dalam satu repositori. Salinan kerja Anda akan selalu mencerminkan satu set perubahan, yang disebut setel induk salinan berfungsi. Periksa ini dengan:
% hg parents
Katakanlah itu melaporkan [y]
. Anda dapat melihat kepala dengan
% hg heads
dan ini akan melaporkan [y]
dan [d]
. Jika Anda ingin memperbarui repositori Anda ke checkout bersih [d]
, cukup lakukan (gantikan [d]
dengan nomor revisi untuk [d]
):
% hg update --clean [d]
Anda kemudian akan melihat hg parents
laporan itu [d]
. Ini berarti komit Anda berikutnya akan [d]
sebagai induk. Dengan demikian Anda dapat memperbaiki bug yang Anda perhatikan di cabang utama dan membuat perubahan [e]
:
[x] --- [y]
/
[a] --- [b] --- [c] --- [d] --- [e]
Untuk mendorong perubahan [e]
hanya, yang perlu Anda lakukan
% hg push -r [e]
di mana [e]
hash changeset. Secara default hg push
hanya akan membandingkan repositori dan melihat bahwa [x]
, [y]
, dan [e]
hilang, tetapi Anda tidak mungkin ingin berbagi [x]
dan [y]
belum.
Jika perbaikan bug juga mempengaruhi Anda, Anda ingin menggabungkannya dengan cabang fitur Anda:
% hg update [y]
% hg merge
Itu akan membuat grafik repositori Anda terlihat seperti ini:
[x] --- [y] ----------- [z]
/ /
[a] --- [b] --- [c] --- [d] --- [e]
dimana [z]
gabungan antara [y]
dan [e]
. Anda juga bisa memilih untuk membuang cabang:
% hg strip [x]
Poin utama saya dari cerita ini adalah ini: satu klon dapat dengan mudah mewakili beberapa jalur perkembangan. Ini selalu berlaku untuk "plain hg" tanpa menggunakan ekstensi apa pun. Namun, ekstensi bookmark sangat membantu. Ini akan memungkinkan Anda untuk menetapkan nama (bookmark) ke perubahan. Dalam kasus di atas, Anda ingin bookmark di kepala pengembangan Anda dan satu di kepala hulu. Bookmark dapat didorong dan ditarik dengan Mercurial 1.6 dan telah menjadi fitur bawaan di Mercurial 1.8.
Jika Anda memilih untuk membuat dua klon, klon pengembangan Anda akan terlihat seperti ini setelah membuat [x]
dan [y]
:
[a] --- [b] --- [x] --- [y]
Dan klon hulu Anda akan berisi:
[a] --- [b] --- [c] --- [d]
Anda sekarang melihat bug dan memperbaikinya. Di sini Anda tidak perlu melakukannya hg update
karena klon hulu siap digunakan. Anda berkomitmen dan membuat [e]
:
[a] --- [b] --- [c] --- [d] --- [e]
Untuk memasukkan perbaikan bug di klon pengembangan Anda, Anda menariknya di sana:
[a] --- [b] --- [x] --- [y]
\
[c] --- [d] --- [e]
dan gabungkan:
[a] --- [b] --- [x] --- [y] --- [z]
\ /
[c] --- [d] --- [e]
Grafik mungkin terlihat berbeda, tetapi memiliki struktur yang sama dan hasil akhirnya sama. Menggunakan klon, Anda harus melakukan sedikit pembukuan mental.
Cabang yang diberi nama tidak benar-benar masuk ke dalam gambar di sini karena cukup opsional. Mercurial sendiri dikembangkan menggunakan dua klon selama bertahun-tahun sebelum kami beralih menggunakan cabang bernama. Kami mempertahankan cabang yang disebut 'stable' sebagai tambahan dari cabang 'default' dan membuat rilis kami berdasarkan cabang 'stable'. Lihat halaman percabangan standar di wiki untuk deskripsi alur kerja yang direkomendasikan.