Mercurial membatalkan komitmen terakhir


125

Bagaimana saya bisa membatalkan perubahan Mercurial terakhir yang tidak sengaja dilakukan (tidak didorong)?

Jika memungkinkan, cara untuk melakukannya dengan TortoiseHg akan lebih disukai.

Memperbarui

Dalam kasus konkret saya, saya melakukan perubahan (tidak didorong). Kemudian saya menarik dan memperbarui dari server. Dengan pembaruan baru ini saya putuskan, bahwa komit terakhir saya sudah usang dan saya tidak ingin menyinkronkannya. Jadi sepertinya, itu hg rollbackbukan yang saya cari, karena itu akan mengembalikan tarikan daripada komit saya.


1
Bagaimana dengan membuat dua hg rollback, lalu menarik lagi?
VonC

1
Rollback pertama tidak membatalkan tarikan, rollback kedua memberi tahu saya "tidak ada informasi rollback yang tersedia".
Martin Buberl

1
Saya telah mengalami situasi yang sama, dan sejauh yang saya tahu bahwa setelah Anda melakukan operasi lain - Anda tidak dapat kembali atau menghapusnya dari sejarah. Anda harus mengkloning repositori hg.

3
strip --keep: stackoverflow.com/questions/29413851/… langsung menyelesaikan tugas, seperti halnya MQ qimport. Sebagai alternatif, mungkin lebih baik hanya dengan rebaseskenario jika perubahan lokal juga harus dijaga dan tidak ada konflik. (Gunakan gabungan untuk menyimpan beberapa perubahan gabungan dari kedua cabang saat itu adalah tujuan akhir grafik yang diinginkan, terutama pada kasus non-fastforward.) Mungkin juga berlaku hanya untuk menutup cabang, yang masih 'mempertahankan sejarah' (tetapi berbeda dari gabungan) tergantung pada kondisi akhir yang diinginkan.
user2864740

2
Sebagai @ user2864740 mengatakan, hg strip --keepadalah perintah melakukan digunakan, tetapi Anda perlu memberikan revisi, misalnya: hg strip --keep -r .. Jawaban ini menjelaskan dengan baik stackoverflow.com/a/19064016/1286571
ForeverWintr

Jawaban:


77

Salah satu caranya hg rollback (ditinggalkan pada Hg2.7, Agustus 2013)

Silakan gunakan hg commit --amendalih-alih rollbackuntuk memperbaiki kesalahan di komit terakhir.

Kembalikan transaksi terakhir di repositori.

Saat melakukan atau menggabungkan , Mercurial menambahkan entri perubahan terakhir.
Mercurial menyimpan log transaksi dari nama setiap file yang disentuh dan panjangnya sebelum transaksi. Pada batalkan, itu memotong setiap file dengan panjang sebelumnya. Kesederhanaan ini adalah satu keuntungan dari membuat revlog hanya ditambahkan. Jurnal transaksi juga memungkinkan operasi pembatalan.

Lihat bagian Pemulihan TortoiseHg :

teks alternatif

Utas ini juga merinci perbedaan antara hg rollbackdan hg strip:
(ditulis oleh Martin Geisler yang juga berkontribusi pada SO)

  • ' hg rollback' akan menghapus transaksi terakhir. Transaksi adalah konsep yang sering ditemukan dalam database. Di Mercurial kami memulai transaksi ketika operasi tertentu dijalankan, seperti komit, dorong, tarik ...
    Ketika operasi selesai dengan sukses, transaksi ditandai sebagai selesai. Jika kesalahan terjadi, transaksi "dibatalkan" dan repositori dibiarkan dalam kondisi yang sama seperti sebelumnya.
    Anda dapat memicu rollback secara manual dengan 'hg rollback'. Ini akan membatalkan perintah transaksional terakhir. Jika perintah tarikan membawa 10 perubahan baru ke dalam repositori di cabang berbeda, maka ' hg rollback' akan menghapus semuanya. Harap dicatat: tidak ada cadangan saat Anda mengembalikan transaksi!

  • ' hg strip' akan menghapus perubahan dan semua turunannya. Perubahan disimpan sebagai bundel, yang dapat Anda terapkan kembali jika Anda membutuhkannya kembali.

ForeverWintr menyarankan dalam komentar (pada 2016, 5 tahun kemudian)

Anda dapat 'membatalkan komitmen' file dengan terlebih dahulu melupakannya, misalnya hg forget filea; hg commit --amend:, tetapi itu tampaknya tidak intuitif.
hg strip --keepmungkin merupakan solusi yang lebih baik untuk hg modern.


Ketika saya mengerti bahwa koreksi rollback menghapus transaksi terakhir. Dalam kasus saya, saya melakukan komit, kemudian saya menarik dari server. Jadi, apakah itu berarti saya akan mengembalikan tarikan alih-alih melakukan?
Martin Buberl

1
@Martin Buberl: Menurut selenic.com/mercurial/hg.1.html#rollback , pull dianggap sebagai transaksi. Jadi, jika Anda menarik, mengeksekusi hg rollbackakan membatalkan tarikan alih-alih komit.
Tim Henigan

2
Saya tidak yakin bagaimana cara hg commit --amendkerjanya, tetapi bagi saya itu memberi saya editor untuk mengubah pesan komit dan tidak ada metode untuk mengubah file mana yang disertakan. Saya keluar dari editor tanpa menyimpan dan menemukan bahwa komit saya yang salah telah diubah untuk menyertakan SEMUA file yang diubah!
Tim Tisdall

2
Tidak jelas bagi saya bagaimana menyelesaikan jawaban atas pertanyaan menggunakan hg commit --amend. Anda dapat 'membatalkan komitmen' file dengan pertama-tama mengambilnya hg forget, misal hg forget filea; hg commit --amend:, tetapi itu tampaknya tidak intuitif. hg strip --keep mungkin merupakan solusi yang lebih baik untuk hg modern.
ForeverWintr

1
@JasonS book.mercurial-scm.org/read/… adalah bacaan yang bagus, meskipun dalam kasus Anda, Anda juga dapat mempertimbangkan hg reset: stackoverflow.com/a/31302998/6309
VonC

46

hg strip akan sepenuhnya menghapus revisi (dan keturunan apa pun) dari repositori.

Untuk menggunakan strip Anda harus menginstal MqExtension dengan menambahkan baris berikut ke .hgrc Anda (atau mercurial.ini):

[extensions]
mq =

Di TortoiseHg, perintah strip tersedia di meja kerja. Klik kanan pada revisi dan pilih 'Modify history' -> 'Strip'.

Karena stripmengubah riwayat repositori, Anda hanya boleh menggunakannya pada revisi yang belum dibagikan kepada siapa pun. Jika Anda menggunakan lincah 2.1+ Anda dapat menggunakan fase untuk melacak informasi ini. Jika komit masih dalam tahap konsep, belum dibagi dengan repositori lain sehingga Anda dapat menghapusnya dengan aman. (Terima kasih kepada Zasurus karena menunjukkan ini).


2
JIKA revisi yang dimaksud masih dalam frasa konsep (atau Anda memiliki akses ke SEMUA repo yang telah didorong / ditarik ke dan menerapkan strip untuk semuanya) (yang merupakan kasus dalam deskripsi ini) maka ini adalah sooo pilihan terbaik dan terbersih.
GazB

4
Jika Anda telah menginstal TortoiseHg, ada antarmuka grafis untuk mengaktifkan mq secara global. Dalam versi saat ini: aktifkan "file-> pengaturan-> tab pengaturan global-> ekstensi-> mq" atau akses file pengaturan melalui tombol "Edit file".
David

19

Karena Anda tidak dapat mengembalikan, Anda harus menggabungkan komit ke kepala baru yang Anda dapatkan saat menarik. Jika Anda tidak ingin ada pekerjaan yang Anda lakukan di dalamnya, Anda dapat dengan mudah melakukannya menggunakan tip ini .

Jadi, jika Anda menarik dan memperbarui ke kepala mereka, Anda dapat melakukan ini:

hg --config ui.merge=internal:local merge

menyimpan semua perubahan dalam revisi yang sedang diperiksa, dan tidak ada perubahan dalam revisi yang tidak dicentang (yang Anda tulis yang tidak lagi Anda inginkan).

Ini adalah cara yang bagus untuk melakukannya karena membuat riwayat Anda akurat dan lengkap. Jika 2 tahun dari sekarang seseorang menemukan bug dalam apa yang Anda tarik, Anda dapat melihat implementasi (yang tidak digunakan tetapi disimpan) Anda pada hal yang sama dan berkata, "oh, saya melakukannya dengan benar". :)


5

hg rollback adalah apa yang kamu inginkan.

Dalam TortoiseHg, hg rollbackdilakukan dalam dialog komit. Buka dialog komit dan pilih "Undo".

teks alternatif


1
Saya membuat komit, lalu menarik dan memperbarui / menyinkronkan. Dengan perubahan baru yang saya dapatkan ini, saya memutuskan komit terakhir saya sudah usang dan ingin membatalkannya. Tombol Undo di TortoiseHg dinonaktifkan dalam kasus saya.
Martin Buberl

Kembalikan sekarang sudah ditinggalkan.
UpTheCreek

Dalam versi Tortoise HG saat ini, Anda bisa mendapatkan opsi Rollback / Undo dari item menu Repository.
daveywc

Kutipan @UpTheCreek diperlukan.
DanMan

@DanMan - periksa tautan yang dia berikan.
UpTheCreek

3

Dalam versi terbaru dari TortoiseHg Workbench 4.4.1 (07.2018) Anda dapat menggunakan Repository- Rollback/undo...:
masukkan deskripsi gambar di sini


1

Penanganannya.

Jika Anda tidak mendorong ke server, Anda akan mengkloning ke folder baru yang lain pembatalan (menghapus semua file) dari folder repositori Anda dan mengkloning baru.


0

setelah Anda menarik dan memperbarui ruang kerja Anda lakukan thg dan klik kanan pada set perubahan yang ingin Anda singkirkan dan kemudian klik modifikasi histori -> strip, itu akan menghapus set perubahan dan Anda akan menunjuk ke tip default.

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.