Saya mencari counter-part git commit --amend
di Mercurial, yaitu cara untuk mengubah komit yang terkait dengan copy pekerjaan saya. Saya hanya tertarik pada komit terakhir, bukan komit sebelumnya yang arbitrer.
Persyaratan untuk mengubah prosedur ini adalah:
jika memungkinkan, seharusnya tidak memerlukan ekstensi apa pun. Itu harus tidak memerlukan ekstensi non-standar , yaitu ekstensi yang tidak datang dengan instalasi Mercurial resmi.
jika komit untuk mengubah adalah salah satu kepala cabang saya saat ini, tidak ada kepala baru yang harus dibuat. Jika komit bukan head, head baru dapat dibuat.
prosedur harus aman dengan cara bahwa jika karena alasan apa pun perubahan gagal, saya ingin memiliki copy pekerjaan dan keadaan repositori yang sama dipulihkan seperti sebelum perubahan. Dengan kata lain, jika amandemen itu sendiri dapat gagal, harus ada prosedur gagal-aman untuk mengembalikan copy pekerjaan dan keadaan repositori. Saya mengacu pada "kegagalan" yang terletak pada sifat amend-prosedur (seperti misalnya konflik), bukan untuk masalah terkait sistem file (seperti pembatasan akses, tidak dapat mengunci file untuk menulis, ... )
Pembaruan (1):
- prosedur harus automatable , sehingga dapat dilakukan oleh klien GUI tanpa diperlukan interaksi pengguna.
Pembaruan (2):
- file dalam direktori kerja tidak boleh disentuh (mungkin ada kunci sistem file pada file yang dimodifikasi tertentu). Ini terutama berarti, bahwa pendekatan yang mungkin mungkin tidak memerlukan direktori kerja yang bersih.
sumber
Anda memiliki 3 opsi untuk mengedit komit di Mercurial:
hg strip --keep --rev -1
batalkan komit terakhir, sehingga Anda dapat melakukannya lagi (lihat jawaban ini untuk informasi lebih lanjut).Menggunakan ekstensi MQ , yang dikirimkan bersama Mercurial
Bahkan jika itu tidak dikirim dengan Mercurial, ekstensi Histedit layak disebutkan
Anda juga dapat melihat halaman Editing History dari wiki Mercurial.
Singkatnya, pengeditan riwayat sangat sulit dan tidak dianjurkan . Dan jika Anda sudah mendorong perubahan Anda, hampir tidak ada yang dapat Anda lakukan, kecuali jika Anda memiliki kontrol penuh terhadap semua klon lainnya.
Saya tidak terlalu terbiasa dengan
git commit --amend
perintah itu, tetapi AFAIK, Histedit adalah pendekatan yang tampaknya paling dekat, tetapi sayangnya itu tidak dikirimkan bersama Mercurial. MQ sangat rumit untuk digunakan, tetapi Anda dapat melakukan hampir semua hal dengan itu.sumber
hg revert myfile
untuk membatalkan penghapusan. Mungkin menambahkan kembali denganhg add
file setelahrollback
juga berfungsi.Setara GUI untuk
hg commit --amend
:Ini juga berfungsi dari GUI TortoiseHG (Saya menggunakan v2.5):
Swich ke tampilan 'Komit' atau, di tampilan meja kerja, pilih entri 'direktori kerja'. Tombol 'Komit' memiliki opsi bernama 'Ubah revisi saat ini' (klik panah tarik-turun tombol untuk menemukannya).
Kaisar peringatan :
Info lebih lanjut tentang ini di saluran dev THG
sumber
Saya selaras dengan apa yang telah ditulis krtek. Lebih khusus solusi 1:
Asumsi:
Larutan:
hg rollback
untuk membatalkan komit terakhirKembalikan benar-benar membatalkan operasi terakhir. Caranya cukup sederhana: operasi normal di HG hanya akan ditambahkan ke file; ini termasuk komit. Mercurial melacak panjang file dari transaksi terakhir dan karena itu dapat sepenuhnya membatalkan satu langkah dengan memotong file kembali ke panjang sebelumnya.
sumber
Dengan asumsi bahwa Anda belum menyebarkan perubahan Anda, inilah yang dapat Anda lakukan.
Tambahkan ke .hgrc Anda:
Dalam repositori Anda:
Tentu saja Anda tidak perlu memulai dengan revisi nol atau pop semua patch, untuk cukup satu pop (
hg qpop
) sudah cukup (lihat di bawah).hapus entri terakhir dalam
.hg/patches/series
file, atau tambalan yang tidak Anda sukai. Pengubahan urutan juga dimungkinkan.hg qpush -a; hg qfinish -a
.diff
file - file (patch yang belum diaplikasikan) yang masih dalam .hg / patch (harus ada dalam case Anda).Jika Anda tidak ingin untuk mengambil kembali semua patch Anda, Anda dapat mengeditnya dengan menggunakan
hg qimport -r0:tip
(atau serupa), kemudian mengedit hal-hal dan menggunakanhg qrefresh
untuk menggabungkan perubahan ke dalam patch paling atas pada stack Anda. Bacahg help qrefresh
.Dengan mengedit
.hg/patches/series
, Anda bahkan dapat menghapus beberapa tambalan, atau menyusun ulang sebagian. Jika revisi terakhir Anda adalah 99, Anda dapat menggunakannyahg qimport -r98:tip; hg qpop; [edit series file]; hg qpush -a; hg qfinish -a
.Tentu saja, prosedur ini sangat tidak dianjurkan dan berisiko . Buat cadangan semua sebelum Anda melakukan ini!
Sebagai seorang sidenote, saya telah melakukannya miliaran kali pada repositori khusus-pribadi.
sumber
hg qfold
, btwhg import -r<prev>:tip
. Sayangnya tidak ada jalan pintas untuk versi sebelumnya, seperti di subversi.Versi terbaru dari Mercurial termasuk
evolve
ekstensi yang menyediakanhg amend
perintah. Ini memungkinkan untuk mengubah komit tanpa kehilangan riwayat pra-ubah dalam kontrol versi Anda.Lihat https://www.mercurial-scm.org/doc/evolution/user-guide.html#example-3-amend-a-changeset-with-evolve untuk deskripsi lengkap
evolve
ekstensi.sumber
Mungkin tidak menyelesaikan semua masalah dalam pertanyaan awal, tetapi karena ini tampaknya menjadi pos de facto tentang bagaimana mercurial dapat mengubah komitmen sebelumnya, saya akan menambahkan informasi senilai 2 sen saya.
Jika Anda seperti saya, dan hanya ingin mengubah pesan komit sebelumnya (memperbaiki kesalahan ketik dll) tanpa menambahkan file, ini akan berfungsi
Tanpa menyertakan atau mengecualikan pola
hg commit
akan secara default menyertakan semua file dalam direktori kerja. Pola penerapan-X 'glob:**'
akan mengecualikan semua file yang mungkin, hanya memungkinkan untuk mengubah pesan komit.Secara fungsional sama dengan
git commit --amend
ketika tidak ada file dalam indeks / stage.sumber
Solusi lain bisa menggunakan
uncommit
perintah untuk mengecualikan file tertentu dari komit saat ini.hg uncommit [file/directory]
Ini sangat membantu ketika Anda ingin menjaga komit saat ini dan membatalkan beberapa file dari komit (terutama bermanfaat untuk yang
files/directories
telah dihapus).sumber