Hapus semua perubahan lokal dan kembali ke pohon

95

Saya menggunakan Mercurial dan saya mengalami kekacauan yang mengerikan secara lokal, dengan tiga kepala. Saya tidak bisa mendorong, dan saya hanya ingin menghapus semua perubahan lokal saya dan melakukan dan mulai lagi dengan kode yang benar-benar bersih dan riwayat yang bersih.

Dengan kata lain, saya ingin mengakhiri dengan (a) kode yang persis sama secara lokal seperti yang ada di ujung cabang jarak jauh dan (b) tidak ada riwayat dari setiap komit lokal.

Saya tahu hg update -Cmenimpa perubahan lokal apa pun. Tapi bagaimana cara menghapus komit lokal?

Untuk lebih jelasnya, saya tidak tertarik untuk melestarikan semua pekerjaan yang telah saya lakukan secara lokal. Saya hanya ingin cara termudah untuk kembali ke kasir lokal yang benar-benar bersih.

Richard
sumber

Jawaban:

129

Ketika cara paling sederhana (baru hg clone) tidak praktis, saya menggunakan hg strip:

% hg outgoing -l 1
% hg strip $rev # replace $rev with the revision number from outgoing

Ulangi sampai hg outgoingdiam. Perhatikan bahwa hg strip $revmelenyapkan $revdan semua keturunannya.

Perhatikan bahwa Anda mungkin harus mengaktifkannya terlebih dahulu stripdi pengaturan Mercurial .

PS: pendekatan yang lebih cerdas adalah dengan menggunakan bahasa revset, dan melakukan:

% hg strip 'roots(outgoing())'
hanya seseorang
sumber
1
Terima kasih! Saya berakhir dalam situasi yang diselesaikan dengan sempurna, tanpa keributan apa pun.
eswald
1
Ini menyelamatkan saya dari perbaikan besar di atas, sangat sederhana, terima kasih!
David C
3
Jika ada yang mengalami masalah hg strip 'roots(outgoing())'dalam bekerja karena tidak mengenalinya 'roots(outgoing())'. Saya bisa membuatnya bekerja hg strip "roots(outgoing())".
jsea
@SombreErmine masuk cmd.exe, ya.
hanya seseorang
21

Anda akan ingin membuat klon lokal di mana Anda hanya menyimpan kumpulan perubahan yang juga ada di repositori jarak jauh. Gunakan TortoiseHg , hg logatau yang serupa untuk mencari tahu mana dari revisi Anda yang merupakan revisi terakhir yang tidak Anda buat (yang sebelum kekacauan dimulai). Menggunakan hg outgoingdapat membantu di sini - ini akan mencantumkan semua set perubahan yang Anda buat - pilih nomor revisi lebih awal dari yang mana pun.

Jika revisi target dipanggil gooddan klon Anda dipanggil foo, lakukan:

hg clone -r good foo foo-clean

Ini akan menjadi operasi lokal yang cepat - tidak ada alasan untuk mengunduh semuanya lagi . The foo-cleanclone hanya akan berisi changesets hingga revisi good. Anda sekarang dapat mengganti foo-clean/.hg/hgrcdengan foo/.hg/hgrcuntuk mempertahankan pengaturan lokal-repositori Anda seperti jalur push / pull default.

Ketika Anda puas karena foo-cleanmemiliki semua yang Anda butuhkan foo, maka cukup hapus foodan ganti nama foo-cleanmenjadi foo. Lakukan a hg pulluntuk mendapatkan perubahan baru dari repositori jarak jauh ke klon Anda dan lanjutkan seperti biasa.


Jika tidak ada yang mendorong perubahan baru ke repositori jarak jauh, maka sangat mudah untuk menentukan revisi mana yang ingin Anda gunakan seperti di goodatas: hg id defaultakan memberi tahu Anda ID tip di repositori jarak jauh.

Martin Geisler
sumber
Saya mengalami situasi yang sama, tetapi juga memiliki banyak file di direktori repo tetapi berada di hgignore. Tidak dapat menginstal hg strip dan ingin menghapus komit lokal tanpa mengganti seluruh klon. Ada ide? -- Ah! Jika saya belum menambahkan file apa pun, saya seharusnya bisa menyalin klon lain ke direktori lama saya !?
Peteter
Hati-hati dengan metode ini jika Anda memiliki banyak cabang. Mengkloning ke revisi tertentu hanya mendapatkan set perubahan di cabang revisi yang ditentukan. Anda kemudian mungkin harus melakukan hg pull -rrevisi "bagus" terakhir dari setiap cabang tambahan.
Yitz
9

Baik. Jadi hapus saja semua barang lokal, hg initrepositori lokal baru dan hg pulltip terbaru yang Anda miliki. Jangan lupa hg updatesetelah ini.

alemjerus
sumber
Terima kasih. Ketika Anda mengatakan 'hapus semua barang lokal', apakah maksud Anda hapus seluruh repositori, atau hanya perubahan saya? Apa yang dilakukan hg init (telah di-Google tetapi tidak dapat melihat penjelasan sederhana) dan apakah saya perlu menggunakan flag apa pun dengannya? Apakah itu akan menghapus hal-hal seperti preferensi Mercurial .hgrc saya?
Richard
Pembaruan: jika saya menghapus semuanya di direktori root proyek, lalu ketik 'hg init', saya mendapatkan 'abort: repository. sudah ada!'. Apakah saya perlu menyiapkan dan bekerja dari direktori baru? Saya lebih suka tidak jika memungkinkan ... pasti ada cara sederhana untuk membunuh semua yang telah saya lakukan secara lokal ?!
Richard
Ya, hapus semuanya termasuk semua barang repositori. Mulai dari folder bersih baru. Preferensi Anda, Anda dapat menyimpan dalam file cadangan, dan kemudian mengembalikannya ke dalam repositori baru yang Anda buat dengan nama reponame hg init. Rincian init dan barang: hgbook.red-bean.com/read/mercurial-in-daily-use.html
alemjerus
6
alemjerus: hg init+ hg pull= hg clonePerbedaannya adalah itu hg clonemembuat .hg/hgrcfile bagus untuk Anda dan itu hg cloneakan menggunakan hardlink untuk menghemat ruang saat mengkloning pada sistem file yang sama.
Martin Geisler
Richard: Keluarannya hg help initada di sini: selenic.com/mercurial/hg.1.html#init Tapi mungkin itu terlalu singkat? Silakan kirim email ke milis kami jika Anda membutuhkan bantuan lebih lanjut! Lihat: mercurial.selenic.com/wiki/MailingLists
Martin Geisler
5

Anda dapat menggunakan

revisi hg strip

untuk menghentikan revisi apa pun dan subtree di repositori lokal Anda.

https://www.mercurial-scm.org/wiki/Strip

Tetapi jangan mencoba menggunakannya untuk apa pun yang sudah didorong.

averasko
sumber
Anda dapat menggunakannya pada revisi publik, tetapi jika Anda menariknya lagi, itu akan muncul kembali. (hg strip hanya berfungsi dengan repositori lokal.)
Mike Rosoft
2

Hapus saja semua yang Anda miliki di sistem lokal Anda dan kloning ulang repo jarak jauh.

OJ.
sumber
2
hg strip `hg out --template" {rev} {author} \ n "| grep YOUR_AUTHOR_NAME | cut -d "" -f 1`

melakukan trik untuk saya.

Ini menghapus semua revisi yang tidak didorong ke repositori default yang dibuat dengan nama penulis Anda.

Anda juga bisa menggunakan gaya ini agar tidak memeriksa dengan repositori default tetapi dengan Repositori lain

hg lepaskan `hg out OTHER_REPO_ALIAS --template" {rev} {author} \ n "| grep YOUR_AUTHOR_NAME | cut -d "" -f 1`
Sebastian
sumber
0

Jika Anda menggunakan TortoiseHg, satu cara sederhana untuk keluar dari kekacauan (kecil) adalah dengan memperbarui revisi terbaru, kemudian pilih set perubahan Anda dan mulai "gabungkan dengan lokal". Saat dialog penggabungan muncul, cukup klik ikon '+' kecil untuk menampilkan beberapa opsi tambahan, salah satunya adalah "buang kumpulan perubahan dari revisi target penggabungan (lainnya)". Melakukan hal ini berarti perubahan Anda akan tetap ada di repo dan didorong, tetapi tidak akan berpengaruh, karena perubahan itu akan dibuang dalam penggabungan. Jika Anda memiliki banyak set perubahan yang mencakup banyak kepala, Anda mungkin tidak ingin mencemari repo dengan cara ini, tetapi ini adalah perbaikan sederhana dan patut dipertimbangkan jika set perubahan yang Anda buang berisi data yang mungkin ingin Anda rujuk nanti.

MrFlamey
sumber