Mercurial untuk Pemula: Panduan Praktis Definitif

237

Terinspirasi oleh Git untuk pemula: Panduan praktis definitif .

Ini adalah kompilasi informasi tentang penggunaan Mercurial untuk pemula untuk penggunaan praktis .

Pemula - seorang programmer yang telah menyentuh kontrol sumber tanpa memahaminya dengan baik.

Praktis - mencakup situasi yang sering ditemui mayoritas pengguna - membuat repositori, bercabang, menggabungkan, menarik / mendorong dari / ke repositori jarak jauh, dll.

Catatan :

  • Jelaskan bagaimana menyelesaikan sesuatu daripada bagaimana sesuatu dilaksanakan.
  • Berurusan dengan satu pertanyaan per jawaban.
  • Jawab dengan jelas dan seringkas mungkin.
  • Edit / perpanjang jawaban yang sudah ada daripada buat jawaban baru pada topik yang sama.
  • Berikan tautan ke wiki Mercurial atau HG Book untuk orang yang ingin mempelajari lebih lanjut.

Pertanyaan:

Instalasi / Pengaturan

Bekerja dengan kode

Penandaan, percabangan, rilis, baseline

Lain

Referensi Mercurial lainnya

Laz
sumber

Jawaban:

16

Bagaimana Anda mengonfigurasinya untuk mengabaikan file?

Ignore dikonfigurasikan dalam file teks normal bernama .hgignore di root repositori Anda. Tambahkan seperti file normal dengan:

hg add .hgignore

Ada dua opsi sintaks yang tersedia untuk pencocokan file, glob dan regexp. glob adalah ekspansi nama file unix-like dan regexp adalah ekspresi reguler. Anda mengaktifkan masing-masing dengan menambahkan syntax: globatau syntax: regexppada garis dengan sendirinya. Semua baris berikut yang akan menggunakan sintaks itu, sampai penanda sintaks berikutnya. Anda dapat memiliki marker sintaks sebanyak yang Anda inginkan. Sintaks defaultnya adalah regexp, jadi jika Anda hanya menggunakan regexp Anda tidak perlu marker sintaks.

Anda dapat menambahkan komentar dengan #

Contoh:

# python temporary files
syntax: glob
*.pyc

#editor autosaves
*~

# temporary data
syntax: regexp
temp

Abaikan hanya berlaku untuk file yang tidak dikelola (yaitu file yang belum masuk). Untuk mengabaikan file yang berada di bawah kontrol versi, Anda dapat menggunakan sakelar -I dan -X.

Joakim Lundborg
sumber
7
Mungkin bermanfaat untuk menyebutkan bahwa jika Anda secara manual hg addmengabaikan file, Mercurial akan melacaknya. Misalnya, jika Anda memiliki banyak file seperti deploy-test.conf, deploy-production.conf, dll dan tidak ingin versi mereka (mereka mungkin memiliki password di dalamnya) tetapi Anda lakukan ingin versi deploy-template.confAnda hanya bisa mengabaikan deploy*dan manual menambahkan deploy-templace.conf.
Steve Losh
7

Bagaimana Anda melihat apa yang tidak dikomit, atau status basis kode Anda saat ini?

Untuk melihat daftar file yang telah diubah:

$ hg status

Ini akan mencetak setiap file yang telah diubah beserta statusnya, yang dapat mencakup:

  • M- Diubah. File telah diubah dan perubahan belum dilakukan.
  • A- Ditambahkan. File tidak dilacak sebelumnya, tetapi jika Anda melakukan Mercurial akan mulai melacaknya.
  • R- Dihapus. File itu dilacak sebelumnya, tetapi jika Anda melakukan Mercurial akan berhenti melacaknya dalam komitmen ini dan yang akan datang.
  • ?- Tidak dikenal. File saat ini tidak dilacak oleh Mercurial. Komitmen tidak akan berpengaruh padanya kecuali Anda menggunakannya hg adduntuk menambahkannya.
  • !- Hilang. File dilacak tetapi Mercurial tidak dapat menemukannya di copy pekerjaan.

Untuk melihat perubahan yang sebenarnya telah dibuat ke file:

$ hg diff
Steve Losh
sumber
6

Bagaimana Anda membuat proyek / repositori baru?

$ hg init my-repository

sumber
5

Bagaimana cara saya berinteraksi dengan Subversion?

Ada tiga cara:


The ekstensi mengkonversi akan mengkloning sebuah repositori Subversion yang ada menjadi satu Mercurial. Itu datang dengan Mercurial. Ini kira-kira berfungsi seperti ini:

hg convert <Subversion URL or directory> <path to new Mercurial repository>

Sebagai contoh, ini akan mengambil bagasi repositori memcached SixApart.

hg convert http://code.sixapart.com/svn/memcached/trunk

Ekstensi tersebut secara bertahap dapat membawa revisi baru dari repositori Subversion ke repositori Mercurial (sedikit seperti tarikan). Namun itu tidak mendukung mengambil revisi Mercurial dan mengirimkannya kembali ke Subversion (tanpa dorongan). [XXX: Perbaiki ini jika salah] .


The hgsubversion ekstensi . Dalam banyak hal, ini adalah solusi paling canggih karena menggunakan API Subversion untuk berkomunikasi dengan repositori Subversion. Ini bertujuan untuk menjadi yang jembatan hg-svn. Ini memungkinkan trip-trip penuh revisi (klon penuh, tarik, dan dorong), Namun pada tulisan ini [XXX: Ubah ini jika / ketika menjadi salah] masih dalam pengembangan dan belum ada rilis resmi. Sebagai akibatnya, ia hanya bekerja dengan Mercurial terbaru (1.3 saat tulisan ini).

  • Itu memetakan tag dan cabang (mendahului semua tag dengan tags/untuk membedakan mereka dari cabang bernama setara).
  • Ia memelihara cabang khusus closed-branchesuntuk menutup cabang yang dihapus di Subversion.
  • Ini mengharuskan repositori Subversion ditata sesuai dengan konvensi trunk / branch / tag.
  • Set perintah biasanya hg svn <subcommand>meskipun bertujuan untuk diintegrasikan ke titik bahwa Anda tidak memerlukan bagian 'svn' (yaitu ingin memperlakukan klon Subversion sebanyak mungkin seperti repositori Mercurial lainnya);;

Ini berfungsi seperti ini:

klon:

hg svnclone <Subversion URL> 

ATAU (hanya untuk svn://URL)

hg clone <svn:// URL>

Tarik:

hg svn pull

Dorong:

hg svn push

masuk:

hg svn incoming

keluar:

hg svn outgoing

Memeriksa seluruh repositori:

hg svnclone http://code.sixapart.com/svn/memcached

The hgsvn utilitas ( pohon bitbucket ). Hingga baru-baru ini hanya memungkinkan Anda mengkloning dan menarik repositori Subversion, tetapi pada saat hgsvn 0.1.7itu mendukung push. [Saya tidak tahu seberapa baik itu mendorong. Siapa pun yang lebih berpengalaman harus memperbarui ini.] Ia memiliki fitur-fitur penting berikut:

  • Ini menghasilkan tag Mercurial untuk setiap tag SVN.
  • Itu menempatkan tag lokal pada setiap perubahan untuk menandai revisi SVN-nya.
  • Itu menempatkan setiap revisi Mercurial pada cabang bernama dinamai cabang SVN-nya. Misalnya branches/some-featureakan seperti hg branch some-feature. Itu menempatkan trunk trunk(yaitu tidak ada pada cabang default Mercurial, kecuali pengguna secara eksplisit beralih ke itu.)
  • Ini akan mencoba mengidentifikasi cabang dan tag, dan membuatnya tetapi jika tidak bisa hanya melompati mereka. Ini berguna ketika repositori Subversion tidak mengikuti tata letak trunk / branch / tag konvensional.

Ini berfungsi seperti ini:

klon:

hgimportsvn <Subversion URL>

Tarik:

hgpullsvn

Dorong:

hgpushsvn

masuk:

hgpullsvn -n

keluar:

hgpushsvn -n

Memeriksa seluruh repositori:

hgimportsvn http://code.sixapart.com/svn/memcached

Memeriksa hanya bagasi:

hgimportsvn http://code.sixapart.com/svn/memcached/trunk
quark
sumber
2
Saya baru saja menggunakan hg convertdan itu benar-benar membutuhkan waktu lama ketika Anda memiliki repositori svn dengan banyak komit. Menyiapkan repositori lokal dengan svnsyncbanyak membantu mempercepat - terutama ketika Anda perlu melakukannya beberapa kali, karena Anda memiliki beberapa opsi yang salah dalam perintah convert Anda.
Debilski
Saya pikir semua metode ini lebih cepat jika Anda memiliki salinan lokal dari repositori SVN. Tetapi Anda tidak selalu bisa mendapatkan repositori lengkap, bukan? Saya pikir svnsyncperlu mengakses file repositori yang sebenarnya, bukan hanya URL.
quark
Harap dicatat bahwa hgsvn sekarang dalam Mode Pemeliharaan , sehingga tidak lagi dikembangkan secara aktif. Mereka merekomendasikan menggunakan hgsubversion sebagai gantinya.
Jon L.
5

Bagaimana Anda membandingkan dua revisi file, atau file Anda saat ini dan revisi sebelumnya?

Keduanya digunakan hg diff. Kapan hg diffdigunakan semua perubahan dalam copy pekerjaan dan tip (komit terbaru) ditampilkan.

Untuk "Bagaimana Anda membandingkan dua revisi file?"

$ hg diff -r{rev1} -r{rev2} {file.code}

Perintah di atas akan menunjukkan perbedaan antara rev1 dan rev2 dari "file.code".

Untuk "Bagaimana Anda membandingkan file Anda saat ini dan revisi sebelumnya?"

$ hg diff {file.code}

Perintah di atas akan menunjukkan perbedaan antara versi "file.code" saat ini dan revisi terbaru (yang terakhir dilakukan).

: D

NawaMan
sumber
4

Bagaimana Anda 'menandai' 'tag' atau 'merilis' set revisi tertentu untuk set file tertentu sehingga Anda selalu dapat menariknya nanti?

$ hg tag my-tag

Anda juga dapat mengkloning repositori Anda untuk membuat repositori tag khusus .

$ hg clone working-repository my-tag-repository

sumber
3
Mengapa tidak hg tag my-tag?
Steve Losh
4

Bagaimana Anda bercabang?

$ hg cabut cabang saya

atau

$ hg klon-repositori asli-cabang saya

Meskipun harus dicatat bahwa cabang membuat direktori "virtual" (yaitu, file tetap sama, tetapi hg memperlakukannya seolah-olah mereka berbeda di dalam sistem), sementara klon membuat salinan lengkap yang sebenarnya. Sebenarnya, clone tidak bercabang.

Nick Hodges
sumber
4
Ini adalah cara kelas berat yang membuat orang git mengolok-olok orang Mercurial untuk merekomendasikan. Cara yang lebih ringan dan lebih akrab bagi pemula adalahhg branch my-branch
Steve Losh
8
Anda harus perhatikan, bahwa ini adalah dua operasi yang sama sekali berbeda.
stepancheg
2
Saya menemukan panduan ini yang dapat membantu untuk bercabang di Mercurial: stevelosh.com/blog/2009/08/a-guide-to-branching-in-mercurial
mbillard
Untuk cabang ringan di hg yang tidak permanen (sebagai cabang hg) gunakan ekstensi bookmark lincah
hultqvist
Artikel yang ditautkan oleh GoodEnough menyediakan metode ringan lainnya menggunakan bookmark. Tampaknya cukup baik untuk perubahan yang tidak signifikan sehingga layak mendapatkan cabang mereka sendiri
Casebash
4

Plugin GUI / IDE yang bagus untuk Mercurial?

GUI

  • TortoiseHg untuk hampir semua OS. Termasuk integrasi Windows Explorer. Ini juga bekerja di Linux dan beberapa OS lainnya: termasuk Max OS X. Ini memiliki antarmuka yang agak kikuk dan sedikit janggal untuk digunakan pada awalnya, tetapi sangat lengkap dan kuat.
  • Murky berjalan pada Mac OS X 10.5 atau lebih baru. Murky bagus untuk menjelajahi repositori dan perintah-perintah dasar, tetapi Anda juga perlu tahu cara menggunakan baris perintah.
  • MacHg adalah Mac OS X Gui yang bagus yang memiliki fungsionalitas dan polesan lebih sedikit daripada Murky, tetapi Anda masih akan memerlukan baris perintah juga.
  • SourceTree awalnya adalah klien Mac, dengan versi Windows tersedia baru-baru ini. UI yang cukup bagus (setidaknya pada OS X), mendukung sebagian besar fitur Hg, termasuk rak.

Plugin

Macke
sumber
3

Bagaimana Anda melakukan perubahan?

Aktifkan perintah ini dari repositori * mercurial lokal saat ini

hg commit [OPTION]... [FILE]...

alias: ci

  • Repositori mercurial lokal memiliki .hg di dalam direktori saat ini

Di mana opsi dapat:

 -A --addremove     mark new/missing files as added/removed before committing
    --close-branch  mark a branch as closed, hiding it from the branch list
 -I --include       include names matching the given patterns
 -X --exclude       exclude names matching the given patterns
 -m --message       use <text> as commit message
 -l --logfile       read commit message from <file>
 -d --date          record datecode as commit date
 -u --user          record user as committer

Contoh perintahnya adalah:

hg commit -m "added readme" README

CATATAN :

  • Jika daftar file dihilangkan, semua perubahan yang dilaporkan oleh "status hg" akan dilakukan.
  • Jika Anda melakukan hasil gabungan, jangan berikan nama file apa pun atau -I / -X filter.
  • Jika tidak ada pesan komit yang ditentukan, editor yang dikonfigurasi mulai meminta Anda untuk pesan.
jpartogi
sumber
3

Bagaimana cara mengatur Mercurial?

Mercurial menyimpan informasi konfigurasinya di ~/.hgrcsistem * nix dan %UserProfile%\mercurial.inisistem Windows. ( %UserProfile%biasanya "C:\Documents and Settings\[username]\"pada sistem Windows 2000 atau Windows XP, dan biasanya C:\Users\[username]\pada sistem Windows Vista dan Windows 7.)

Sebagai titik awal, Anda harus menetapkan nama pengguna Mercurial Anda dengan menempatkan yang berikut di .hgrcatau mercurial.ini:

# This is a Mercurial configuration file.
[ui]
username = Firstname Lastname <[email protected]>

Pengguna TortoiseHg di sistem Windows dapat juga menjalankannya hgtk userconfig

Lihat juga " Membuat file konfigurasi Mercurial " di bab 2 dari " Mercurial: The Definitive Guide ."

las3rjock
sumber
3

Bagaimana Anda menggabungkan cabang?

$ cd repository-where-i-want-to merge
$ hg pull branch-i-want-to-merge
$ hg merge # if necessary
Martin Geisler
sumber
Sebagai pengguna baru, dan sebagai orang baru untuk sumber kontrol revisi secara umum, saya tidak begitu mengerti jawaban ini. Bisakah Anda mengklarifikasi dan memperluas posting Anda? Saya masih tidak begitu mengerti bagaimana menggunakan perintah gabungan.
Jamin Grey
3

Bagaimana cara menginstal Mercurial?

Harap edit dengan baik jika Anda telah menginstal dari sumber di Linux, atau menggunakan installer Windows.

Mac OS X 10.4 (Tiger), 10.5 (Leopard)

Gunakan easy_install Python (dengan Setuptools ):

sudo easy_install mercurial

Ini menemukan versi terbaru (1.3.1 saat penulisan) dan menginstal di:

/Library/Frameworks/Python.framework/Versions/2.6/bin/

Dengan Python 2.6 ini juga menyiasati paket pemasang Mercurial OS X (pada 1.2.1 per 26 Juli 2009) mengeluh bahwa ia membutuhkan Python 2.5. Dari dokumentasi , tampak bahwa Fink dan Macports menginstal versi 1.2.

Linux

Sebagian besar paket Linux eksplisit tampak tertinggal dari versi saat ini, jadi gunakan easy_install (seperti di atas) atau unduh tarball Mercurial , ekstrak arsip, ubah ke direktori mercurial, dan jalankan:

$ make
$ sudo make install    # do a system-wide install
$ hg debuginstall      # sanity check
$ hg                   # see help

(dari Introducing Mercurial, sistem kontrol versi terdistribusi )

Windows

Ada paket biner dari versi terbaru Mercurial . TortoiseHg adalah ekstensi shell Windows untuk, dan menginstal, Mercurial. Cygwin juga dapat menginstal Mercurial.

Atau (petunjuk terlalu panjang sehingga terkait di sini), Anda dapat membangun dioptimalkan atau Python murni versi Mercurial dari sumber.

Dave Everitt
sumber
1
Untuk membangun lincah dari sumber, orang akan membutuhkan header Python. Instal python-dev atau python-devel untuk mereka yang menggunakan distribusi berorientasi paket.
Nicolas Dumazet
3

Bagaimana Anda mendapatkan kode terbaru?

Mercurial mengingat di mana repositori dikloning dari (dalam .hg / hgrc) sehingga Anda bisa menjalankan:

hg pull

untuk menarik kode terbaru dari repositori asal. (Ini tidak memperbarui direktori kerja)

hg update

untuk memperbarui direktori kerja.

hg pull -u

untuk melakukan tarikan dan pembaruan sekaligus.

Laz
sumber
1
Asal dicatat .hg/hgrcketika Anda melakukan kloning, jadi Anda tidak harus menentukan kapan Anda menarik / mendorong. Anda dapat menambahkan lebih banyak jalur ke [paths]bagian ini .hg/hgrcjika Anda mau.
Martin Geisler
3

Bagaimana Anda memeriksa kode?

hg clone [OPTION]... SOURCE [DEST]

Di mana opsi dapat:

 -U --noupdate      the clone will only contain a repository (no working copy)
 -r --rev           a changeset you would like to have after cloning
    --pull          use pull protocol to copy metadata
    --uncompressed  use uncompressed transfer (fast over LAN)
 -e --ssh           specify ssh command to use
    --remotecmd     specify hg command to run on the remote side

Di mana sumber adalah sumber dari file asli yang terletak di repositori, di mana ia bisa berupa URL jarak jauh atau direktori sistem file. Sebagai contoh:

Dan tujuan adalah tempat kode sumber akan berlokasi di sistem file lokal Anda.

jpartogi
sumber
1

Bagaimana Anda melakukan perubahan?

$ hg commit -m "Commit message"
NawaMan
sumber
1

Bagaimana Anda melihat perubahan apa yang akan dikirim ke repositori hulu saat Anda mendorong?

Gunakan hg outgoinguntuk mendapatkan daftar perubahan yang akan diatur ke repositori default:

$ hg outgoing

Untuk mendapatkan perubahan kode yang sebenarnya, gunakan -p( --patch). Ini akan menampilkan setiap perubahan secara penuh:

$ hg outgoing -p
robotadam
sumber
1

Bagaimana Anda menghapus file dari repositori?

Untuk menghapus file dari repositori, dan menghapusnya di komit berikutnya:

$ hg remove {file(s)}

Untuk menghapus file dari repositori, tetapi belum dihapus

$ hg remove -Af {file(s)}

atau dari Mercurial 1.3

$ hg forget {file(s)}
David Sykes
sumber
1

Bagaimana Anda kembali ke versi kode sebelumnya?

Dari pertanyaan ini

$ hg update [-r REV]

@van: Jika nanti Anda berkomitmen, Anda akan secara efektif membuat cabang baru. Maka Anda mungkin terus bekerja hanya pada cabang ini atau akhirnya menggabungkan yang sudah ada ke dalamnya.

David Sykes
sumber
1

Bagaimana Anda mengembalikan suatu Changeset?

Beberapa opsi tersedia

Easy Way (mundur satu set perubahan tunggal)

$ hg backout -m 'back out second change' tip
reverting myfile
changeset 2:01adc4672142 backs out changeset 1:7e341ee3be7a
$ cat myfile
first change

Hard Way (berbeda secara manual dan berlaku)

Langkah 1 : Buat file patch untuk mengembalikan apa yang berubah antara revisi 107 dan 108:

hg diff -r107 -r108 --reverse  > revert-change.patch

(secara bergantian, hg diff -r108 -r107 tanpa --reverse akan melakukan hal yang sama)

Langkah 2 : Terapkan file tambalan:

patch -p1 < revert-change.patch

Beberapa perbedaan mungkin gagal diterapkan, misalnya:

Hunk #3 FAILED at 517.
1 out of 3 hunks FAILED -- saving rejects to file 'foo/bar.c.rej'

File .rej akan berisi konten diff yang gagal diterapkan, Anda harus melihatnya.

slf
sumber
1
Bukankah ini untuk apa hg backout?
Wim Coenen
Ya, namun hg backout hanya mendukung satu set id perubahan untuk mundur. Pasti harus disebutkan, saya akan memperbarui sesuai
slf
1

Bagaimana Anda melihat riwayat revisi file atau repositori?

Untuk menampilkan riwayat revisi seluruh repositori atau file

$ hg log {file(s)}

atau

$ hg history {file(s)}

Dan untuk melihat daftar dalam urutan terbalik

$ hg log -r:
David Sykes
sumber
1

Bagaimana Anda menggabungkan bagian dari satu cabang ke cabang lain?

Aktifkan ekstensi 'transplantasi' di .hg / hgrc Anda

[extensions]
transplant=

Muat cabang target kemudian transplantasi revisi target.
misal: cherry pick revisi 81 dari cabang 'foo' ke cabang saat ini

$ hg transplant -b foo 81
John Mee
sumber
Versi Mercurial yang lebih baru tidak membutuhkan ekstensi transplantasi. Anda dapat menggunakan graftperintah bawaan untuk melakukan hal yang sama. hg help graftuntuk info lebih lanjut
DOOManiac
1

Bagaimana cara Anda mengekstrak tambalan dari perubahan tertentu?

$ hg export -o patchfile changeset

Anda kemudian dapat mengimpor ini ke cabang lain dengan:

$ hg import patchfile
David Sykes
sumber