Mercurial: bagaimana mengubah perbaikan terakhir?

Saya mencari git commit --amend di Mercurial, yaitu cara untuk mengubah komit yang terkait dengan copy pekerjaan saya. Persyaratan untuk prosedur perubahan ini:

  • jika memungkinkan, tidak memerlukan ekstensi apa pun. Seharusnya tidak memerlukan ekstensi non-standar , yaitu, ekstensi yang tidak datang dengan instalasi Mercurial resmi.

  • jika komitmen amandemen adalah salah satu kepala cabang saya saat ini, tidak ada kepala baru . Jika fiksasi bukan kepala, kepala baru dapat dibuat.

  • prosedurnya harus aman sedemikian rupa sehingga jika karena alasan apa pun koreksi tidak dilakukan, saya ingin mengembalikan copy pekerjaan lama dan keadaan repositori sebelum membuat amandemen. Dengan kata lain, jika amandemen itu sendiri dapat gagal, harus ada prosedur gagal-aman untuk memulihkan kondisi kerja dan penyimpanan. Maksud saya "kegagalan" yang terletak pada sifat dari prosedur remediasi (misalnya, konflik), dan bukan masalah dengan sistem file (misalnya, pembatasan akses, ketidakmampuan untuk memblokir file untuk menulis, ...)

Pembaruan (1):

  • prosedur harus otomatis , sehingga dapat dilakukan oleh klien GUI tanpa interaksi pengguna.

Pembaruan (2):

  • file dalam direktori kerja tidak boleh terpengaruh (mungkin ada kunci sistem file pada beberapa file yang dimodifikasi). Ini terutama berarti bahwa pendekatan yang mungkin sama sekali tidak memerlukan direktori kerja yang bersih.
188
18 нояб. diatur oleh mstrap 18 nov. 2011-11-18 16:04 '11 pada pukul 16:04 2011-11-18 16:04
@ 5 balasan

Dengan rilis Mercurial 2.2, Anda dapat menggunakan opsi --amend dengan hg commit untuk memperbarui komit terbaru dari direktori kerja saat ini

Dari tautan di baris perintah :

Bendera -amend dapat digunakan untuk mengubah induk dari direktori kerja dengan kait baru yang berisi perubahan pada objek induk, selain yang saat ini dilewatkan pada status hg, jika ada. Komit lama disimpan dalam cadangan yang diatur dalam .hg / strip-backup (lihat Hg bundel bantuan dan hg membantu menguraikan cara mengembalikannya).

Pesan, pengguna, dan tanggal diambil dari komit yang dimodifikasi, jika ini tidak ditentukan. Ketika pesan tidak ditentukan pada baris perintah, editor akan terbuka dengan pesan komit yang dimodifikasi.

Yang hebat adalah bahwa mekanisme ini “aman” karena menggunakan fitur “Fase” yang relatif baru untuk mencegah pembaruan yang akan mengubah riwayat yang sudah tersedia di luar repositori lokal.

256
02 мая '12 в 21:46 2012-05-02 21:46 Jawaban diberikan oleh Chris Phillips pada 02 Mei '12 pada 21:46 2012-05-02 21:46

Anda memiliki 3 opsi untuk mengedit komit di Mercurial:

  • hg strip --keep --rev -1 komitmen terakhir (1), sehingga Anda dapat melakukannya lagi (lihat jawaban ini untuk informasi lebih lanjut).

  • Menggunakan ekstensi MQ yang datang dengan Mercurial

  • Bahkan jika itu tidak dikirim dengan Mercurial, ekstensi Histedit layak disebutkan.

Anda juga dapat melihat halaman Editing History di versi wiki Mercurial.

Singkatnya, sejarah pengeditan benar-benar rumit dan tidak dianjurkan . Dan jika Anda sudah mendorong perubahan Anda, Anda tidak bisa melakukan apa pun, kecuali ketika Anda memiliki kontrol penuh atas semua klon lainnya.

Saya tidak terlalu terbiasa dengan perintah git commit --amend , tapi AFAIK, Histedit adalah yang sepertinya pendekatan terdekat, tapi sayangnya itu tidak datang dengan Mercurial. MQ sangat sulit digunakan, tetapi Anda bisa melakukan apa saja dengannya.

49
18 нояб. jawabannya diberikan oleh krtek 18 nov. 2011-11-18 16:34 '11 pukul 16:34 2011-11-18 16:34

Setara GUI untuk hg commit --amend :

Ini juga berfungsi dari GUI TortoiseHG (Saya menggunakan v2.5):

Yang ada di tampilan "Komit" atau di tampilan meja kerja, pilih entri "direktori kerja". Tombol "Komit" memiliki opsi "Ubah versi saat ini" (klik panah drop-down tombol untuk menemukannya).

2019

33
04 янв. jawabannya diberikan oleh Cristi Diaconescu 04 Januari. 2013-01-04 14:04 '13 pada 14:04 2013-01-04 14:04

Dengan asumsi bahwa Anda belum mendistribusikan perubahan Anda, inilah yang dapat Anda lakukan.

  • Tambahkan ke .hgrc Anda:

     [extensions] mq = 
  • Dalam repositori Anda:

     hg qimport -r0:tip hg qpop -a 

    Tentu saja, Anda tidak perlu memulai dari awal atau mengapung semua patch, karena untuk yang terakhir satu file pop ( hg qpop ) sudah hg qpop (lihat di bawah).

  • hapus entri terakhir dalam file .hg/patches/series atau perbaikan yang tidak Anda sukai. Pengubahan urutan juga dimungkinkan.

  • hg qpush -a; hg qfinish -a
  • hapus file .diff (perbaikan yang tidak dapat diterapkan) masih dalam .hg / patches (harus ada dalam kasus Anda).

Jika Anda tidak ingin mengembalikan semua tambalan Anda, Anda dapat mengeditnya menggunakan hg qimport -r0:tip (atau serupa), lalu mengedit materi dan menggunakan hg qrefresh untuk menggabungkan perubahan ke tambalan teratas tumpukan Anda. Baca hg help qrefresh .

Dengan mengedit .hg/patches/series , Anda dapat menghapus beberapa patches atau mengubah urutannya. Jika revisi terakhir Anda adalah 99, Anda cukup menggunakan hg qimport -r98:tip; hg qpop; [edit series file]; hg qpush -a; hg qfinish -a hg qimport -r98:tip; hg qpop; [edit series file]; hg qpush -a; hg qfinish -a hg 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 segala sesuatu sebelum melakukannya!

Sebagai elemen sampingan, saya melakukannya dua kali dalam repositori dengan repositori pribadi.

8
18 нояб. jawaban yang diberikan hochl 18 nov. 2011-11-18 17:04 '11 pada jam 5:04 sore 2011-11-18 17:04

Saya menyesuaikan apa yang ditulis krtek. Lebih khusus lagi, solusi 1:

Asumsi:

  • Anda telah membuat satu set (!) Perubahan, tetapi belum menekannya.
  • Anda ingin mengubah set perubahan ini (misalnya, menambah, menghapus, atau mengubah file dan / atau komit pesan)

Solusi:

  • gunakan hg rollback untuk membatalkan komit terakhir
  • perbaiki perubahan baru pada tempatnya lagi

Kembalikan tidak membatalkan operasi terakhir. Cara kerjanya cukup sederhana: operasi normal di HG hanya akan ditambahkan ke file; ini termasuk memperbaiki. Mercurial melacak panjang file dari transaksi terakhir dan karena itu dapat sepenuhnya membatalkan satu >

6
18 нояб. jawabannya diberikan oleh Lucero 18 November 2011-11-18 16:47 '11 pada 16:47 2011-11-18 16:47

Pertanyaan lain pada tag atau Ajukan pertanyaan