Apakah ada cara untuk menghapus komit lokal di Mercurial?


209

Jadi saya terus membuat kesalahan konyol di Mercurial. Sering kali, saya akan mulai bekerja tanpa melakukan "tarik hg" dan "pembaruan hg." Ketika saya mencoba untuk mendorong perubahan saya, saya mendapatkan kesalahan.

Apakah ada cara untuk menghapus komit lokal saya sehingga saya dapat menghindari membuat beberapa kepala, cabang, dll? Saya hanya ingin menghapus komit lokal saya, menggabungkan perubahan saya dengan tip, dan kemudian komit kembali. Kedengarannya sederhana, bukan? Sepertinya saya tidak dapat menemukan cara untuk menghapus komit lokal dengan mudah sehingga saya dapat bergabung dengan tip dengan bersih.

Sekali lagi, saya hanya mencoba menghapus komit lokal yang dibuat dengan "hg ci". Saya tidak ingin mengubah file, mengembalikan, dll.



12
Ini bukan kesalahan konyol, itu alur kerja normal ketika beberapa orang bekerja dengan repositori yang sama secara bersamaan.
Juozas Kontvainis

Jawaban:


247

Aktifkan ekstensi " strip " dan ketikkan yang berikut:

hg strip #changeset# --keep

Di mana #changeset#hash untuk perubahan yang ingin Anda hapus. Ini akan menghapus set perubahan yang dimaksud termasuk perubahan yang turun darinya dan akan membuat direktori kerja Anda tidak tersentuh . Jika Anda ingin juga mengembalikan perubahan kode yang dikomit, hapus --keepopsi.

Untuk informasi lebih lanjut, periksa Strip Extension .

Jika Anda mendapatkan "strip perintah" yang tidak dikenal, Anda mungkin perlu mengaktifkannya. Untuk melakukannya menemukan .hgrcatau Mercurial.iniberkas dan menambahkan berikut untuk itu:

[extensions]
strip =

Perhatikan bahwa (seperti yang disebutkan Juozas dalam komentarnya) memiliki banyak kepala adalah alur kerja normal dalam Mercurial. Anda seharusnya tidak menggunakan perintah strip untuk melawan itu. Sebagai gantinya, Anda harus menggabungkan kepala Anda dengan kepala yang masuk, menyelesaikan setiap konflik, menguji, dan kemudian mendorong.

The stripperintah ini berguna bila Anda benar-benar ingin menyingkirkan changesets yang mencemari cabang. Bahkan, jika Anda berada dalam situasi pertanyaan ini dan Anda ingin menghapus semua set perubahan "draft" secara permanen, periksa jawaban teratas , yang pada dasarnya menyarankan untuk melakukan:

hg strip 'roots(outgoing())'

8
@Harhar: Anda harus mengaktifkan ekstensi
Samaursa

1
Sejak mercurial 2.8, strip adalah ekstensi mandiri, jadi strip = tidak apa-apa. WhatsNew for Mercurial 2.8
Chih-Hsuan Yen

104

Jika Anda menggunakan Hg Tortoise cukup aktifkan ekstensi " strip " di:

  1. File / Pengaturan / Ekstensi /
  2. Pilih strip

Kemudian pilih revisi bawah dari tempat Anda ingin memulai striping, dengan melakukannya right click, dan memilih:

  1. Ubah riwayat
  2. Mengupas

Seperti ini:

masukkan deskripsi gambar di sini

Dalam contoh ini akan dihapus dari revisi ke 19 ke yang terakhir dilakukan (22).


2
File/Settings/Extensions/Saya berharap bisa menambahkan lebih banyak suara. Terima kasih banyak!
dyatchenko

Argh! Saya mencoba ini tetapi sepertinya membuang semua perubahan saya meskipun tidak mencentang "tidak ada cadangan" atau "buang perubahan lokal". Saya ingin menyimpan perubahan itu, tapi jangan lakukan itu! Apakah ada cara untuk memulihkannya sekarang ??
Tim Tisdall

2
Saya sepertinya tidak bisa menemukan cara untuk melakukannya dengan benar, tetapi sepertinya menjaga konten yang Anda harus lulus --keepdan TortoiseHg tidak memberikan opsi itu. Jadi ... Anda harus melakukannya di baris perintah dengan hg strip -r . --keep.
Tim Tisdall

3
dari bantuan strip: 'Semua perubahan yang dilucuti disimpan dalam ".hg / strip-backup" sebagai sebuah bundel (lihat "hg help bundle" dan "hg help unbundle"). Mereka dapat dipulihkan dengan menjalankan "hg unbundle .hg / strip-backup / BUNDLE", di mana BUNDLE adalah file bundel yang dibuat oleh strip. '
Tim Tisdall

Dalam SourceTree itu bermanfaat juga. Terima kasih!
Ponomarenko Oleh

22

Jawaban modern (hanya relevan setelah Mercurial 2.1):

Gunakan Fase dan tandai revisi yang tidak ingin Anda bagikan sebagai rahasia (pribadi). Dengan begitu ketika Anda menekan mereka tidak akan dikirim.

Di TortoiseHG Anda dapat mengklik kanan komit untuk mengubah fase-nya.

Juga: Anda juga dapat menggunakan ekstensi "rebase" untuk memindahkan komit lokal Anda ke kepala repositori bersama setelah Anda menarik.


Pribadi == rahasia sekarang
Dmitry Osinovskiy

15

Seperti yang ditunjukkan semua orang, Anda mungkin hanya perlu menarik dan kemudian menggabungkan kepala, tetapi jika Anda benar-benar ingin menyingkirkan komitmen Anda tanpa alat EditingHistory maka Anda dapat hg clone -rrepo Anda untuk mendapatkan semua kecuali perubahan itu.

Ini tidak menghapusnya dari repositori asli, tetapi itu membuat klon baru yang tidak memilikinya. Kemudian Anda dapat menghapus repo yang Anda modifikasi (jika mau).


Apakah "hg clone -r" menghapus perubahan lokal? Saya hanya ingin menghapus komit lokal untuk menjaga hal-hal sederhana.
user191535

4
Itu tidak menghapus mereka dari repositori yang dikloning, tetapi itu membuat klon baru yang tidak memilikinya. Kemudian Anda dapat menghapus repo yang Anda modifikasi jika diinginkan.
Ry4an Brase

9

Saya menemukan masalah ini juga. Saya membuat 2 commitdan ingin mengembalikan dan menghapus kedua commit.

$ hg rollback

Tapi hg rollbackkembali ke komit terakhir, bukan 2 komit. Saat itu saya tidak menyadarinya dan saya mengubah kodenya.

Ketika saya menemukan hg rollbackbaru saja mengembalikan satu komit, saya menemukan saya bisa menggunakan hg strip #changeset#. Jadi, saya biasa hg log -l 10menemukan 10 komitmen terbaru dan mendapatkan perubahan yang tepat yang saya inginkan strip.

$ hg log -l 10
changeset:   2499:81a7a8f7a5cd
branch:      component_engine
tag:         tip
user:        myname<myname@email.com>
date:        Fri Aug 14 12:22:02 2015 +0800
summary:     get runs from sandbox

changeset:   2498:9e3e1de76127
branch:      component_engine
user:        other_user_name<name@email.com>
date:        Mon Aug 03 09:50:18 2015 +0800
summary:     Set current destination to a copy incoming exchange

......

$ hg strip 2499
abort: local changes found

Apa abort: local changes foundartinya Ini berarti hgmenemukan perubahan pada kode yang belum dilakukan. Jadi, untuk menyelesaikan ini, Anda harus hg diffmenyimpan kode yang telah Anda ubah dan hg revertdan hg strip #changeset#. Seperti ini:

$ hg diff > /PATH/TO/SAVE/YOUR/DIFF/FILE/my.diff
$ hg revert file_you_have_changed
$ hg strip #changeset#

Setelah Anda melakukan hal di atas, Anda dapat patchfile diff dan kode Anda dapat ditambahkan kembali ke proyek Anda.

$ patch -p1 < /PATH/TO/SAVE/YOUR/DIFF/FILE/my.diff

9

Anda dapat menyiasatinya dengan lebih mudah dengan ekstensi Rebase , cukup gunakan hg pull --rebasedan komit Anda secara otomatis dikirim kembali ke revisi yang ditarik, menghindari masalah percabangan.


1
Dengan mengorbankan sejarah yang tidak akurat dan kemungkinan korupsi jika Anda melakukan kesalahan.
Ry4an Brase

5

Jika Anda terbiasa dengan git, Anda akan senang menggunakan histedit yang berfungsi seperti itu git rebase -i.


4

hg stripadalah apa yang kamu cari. Ini analog git resetjika Anda terbiasa dengan git.

Gunakan konsol:

  1. Anda perlu tahu nomor revisi. hg log -l 10. Perintah ini menunjukkan 10 komit terakhir. Temukan komit yang Anda cari. Anda memerlukan 4 digit angka dari baris changesetchangeset: 5888:ba6205914681

  2. Lalu hg strip -r 5888 --keep. Ini menghapus catatan dari komit tetapi membuat semua file dimodifikasi dan kemudian Anda bisa komit kembali. (jika Anda ingin menghapus file hanya menghapus --keephg strip -r 5888


1

[Hg Tortoise 4.6.1] Jika ini adalah tindakan terbaru, Anda dapat menggunakan tindakan "Kembalikan / Batalkan" (Ctrl + U).

Gambar HG Tortoise


Periksa kembali penyertaan gambar.
Bill Keller

0

Selain jawaban excelent Samaursa, Anda dapat menggunakan evolveekstensi prunesebagai versi yang aman dan dapat dipulihkan stripyang memungkinkan Anda untuk kembali jika Anda melakukan kesalahan.

Saya memiliki alias ini di .hgrc:

 # Prunes all draft changesets on the current repository
 reset-tree = prune -r "outgoing() and not obsolete()"
 # *STRIPS* all draft changesets on current repository. This deletes history.
 force-reset-tree = strip 'roots(outgoing())'

Catatan yang prunejuga memiliki --keep, sama seperti strip, untuk menjaga direktori kerja tetap memungkinkan Anda untuk mengaktifkan kembali file.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.