Katakanlah saya memiliki repositori Mercurial lokal dan jarak jauh. Sekarang, saya mulai mengerjakan sebuah fitur. Saya mengerjakannya, dan ketika saya pikir itu sudah selesai, saya melakukan set perubahan. Mengujinya sedikit lagi, saya menemukan bahwa saya dapat lebih meningkatkan fitur ini dengan mengutak-atik sesuatu dalam kode. Saya membuat perubahan dan berkomitmen. 20 menit kemudian, saya menemukan ada bug di fitur baru ini, jadi saya memperbaikinya dan melakukannya juga.
Sekarang saya memiliki 3 kumpulan perubahan yang saya ingin dorong ke repositori jarak jauh sebagai satu kumpulan perubahan dengan pesan "Menerapkan fitur X", misalnya.
Bagaimana saya bisa melakukan ini tanpa banyak kerumitan? Saya yakin saya bisa melakukannya dengan tambalan, tetapi sepertinya banyak pekerjaan.
sumber
Jawaban:
Bagaimana dengan Ciutkan Ekstensi ?
sumber
hg rebase --collapse
. Lihat wiki hg pada perintah rebase. Karena pertanyaan ini adalah hasil pencarian keseluruhan ke-3 dan yang pertama di stackoverflow, saya pikir info itu mungkin berguna.hg rebase
dengan--collapse
dalam satu cabang.The histedit ekstensi adalah apa yang Anda cari.
atau
akan memunculkan daftar perubahan yang keluar. Dari daftar Anda bisa
histedit akan meminta Anda untuk pesan komit baru dari kumpulan perubahan terlipat yang defaultnya ke dua pesan dengan "\ n *** \ n" memisahkan mereka.
Anda juga bisa mendapatkan hasil yang serupa dengan menggunakan ekstensi mq, tetapi ini jauh lebih sulit.
Anda juga dapat menggunakan ekstensi penciutan untuk hanya melakukan pelipatan, tetapi tidak menyediakan UI sebaik dan tidak menyediakan cara untuk mengedit pesan komit yang dihasilkan. Mengedit pesan komit yang dihasilkan juga memungkinkan untuk membersihkan pesan terakhir, yang pada akhirnya selalu saya manfaatkan.
sumber
Ya, Anda dapat melakukannya dengan tambalan: Anggaplah pekerjaan Anda ada di set perubahan 100 hingga 110, inklusif
Buat tambalan:
% hg export -o mypatch 100:110 --git
Perbarui ke 99:
% hg update 99
Terapkan tambalan dengan --no-commit (jika tidak, Anda akan mendapatkan semua perubahan Anda kembali):
% hg import --no-commit mypatch
Lakukan semua perubahan sekaligus:
% hg commit
Anda sekarang memiliki dua kepala (110 dan 111) yang seharusnya setara dalam hal file yang mereka hasilkan di direktori kerja Anda - mungkin membedakannya untuk kewarasan sebelum menghapus yang lama:
% hg strip 100
Oke, sekarang setelah saya mengeja semuanya, memang tampak panjang, tetapi setelah melakukannya sendiri berkali-kali, saya tidak merasa itu terlalu banyak tugas ...
sumber
hg strip --keep
dan kemudian melakukan semuanya dalam satu komit?hg strip
akan menempatkan backup di.hg/strip-backup/
direktori. Saya kira itu tidak seamangit reflog
tetapi masih menyediakan semacam penyelamatan.Jika Anda menggunakan TortoiseHg, gunakan hanya dapat memilih dua revisi (gunakan CTRL untuk memilih revisi non-berikutnya), klik kanan dan pilih "Kompres Riwayat" .
Setelah itu Anda akan mendapatkan daftar perubahan baru di kepala baru mulai dari perubahan pertama yang Anda pilih sebelumnya, itu akan berisi semua daftar perubahan turunan di antara yang Anda pilih.
Anda cukup menghapus daftar perubahan lama jika Anda tidak membutuhkannya lagi: gunakan ekstensi MQ untuk itu. Sekali lagi, di TortoiseHg: klik kanan pada daftar perubahan pertama yang perlu dihilangkan dengan semua turunannya, "Modify History -> Strip" .
sumber
Metode yang saya sukai menggunakan mq untuk pelipatan ini adalah menggunakan TortoiseHg seperti yang dijelaskan di sini . Namun, ini dapat dengan mudah dilakukan dari baris perintah seperti:
(Mungkin ada cara yang lebih baik untuk melakukan langkah qfold, tapi saya tidak menyadarinya, karena saya biasanya menggunakan TortoiseHg untuk operasi itu.)
Tampaknya agak rumit pada awalnya, tetapi setelah Anda mulai menggunakan mq, itu sangat mudah dan alami - plus Anda bisa melakukan semua jenis hal lain dengan mq yang bisa sangat berguna!
sumber
hg collapse
danhg histedit
cara terbaik. Atau, lebih tepatnya, akan menjadi cara terbaik, jika mereka bekerja dengan andal ... Saya harushistedit
menabrak tumpukan sampah dalam waktu tiga menit.Collapse
tidak jauh lebih baik.Pikir saya mungkin berbagi dua BKM lainnya:
hg rebase --collapse
Ekstensi ini didistribusikan dengan Mercurial. Saya belum punya masalah dengan itu. Anda mungkin harus memainkan beberapa game untuk mengatasi
hg rebase
keterbatasan - pada dasarnya, ia tidak suka melakukan rebasing ke leluhur di cabang yang sama, bernama atau default, meskipun ia mengizinkannya jika melakukan rebasing di antara cabang (bernama).Pindahkan repositori (
foo/.hg
) ke direktori kerja (bar
) dan file-nya. Bukan sebaliknya.Beberapa orang telah berbicara tentang membuat dua pohon klon, dan menyalin file di antara keduanya. Atau menambal di antara mereka. Sebaliknya, lebih mudah untuk memindahkan
.hg
direktori.Ini bekerja selama repositori sebenarnya,
.hg
pohon, tidak bergantung pada direktori kerja dan file-nya.Jika mereka tidak independen ...
sumber
histedit
adalah pilihan yang sangat bagus untuk tugas ini. Saya masih tidak mempercayainya karena saya melakukan git rebase -i, tetapi tidak macet .. setidaknya versi yang lebih baru akan meninggalkan Anda di cabang temp jika ada yang tidak beres jadi satu-satunya saat perubahan set akan dilucuti adalah setelah cabang baru dilakukan.Saya belum pernah menggunakan Mercurial, tetapi ini sangat mirip dengan apa yang dibicarakan Martin Fowler di blognya belum lama ini:
http://martinfowler.com/bliki/MercurialSquashCommit.html
sumber
Mengapa tidak
hg strip --keep
memerintah saja ?Kemudian Anda dapat melakukan semua perubahan sebagai satu komit.
sumber
HistEdit akan melakukan apa yang Anda inginkan, tetapi mungkin berlebihan. Jika satu-satunya hal yang Anda butuhkan adalah melipat beberapa kumpulan perubahan bersama, Ciutkan Ekstensi akan melakukan pekerjaan itu.
sumber
Misalkan Anda memiliki dua tidak diterbitkan
THIS
danTHAT
komit di Mercurial dan ingin mereka bergabung menjadi komit tunggal diTHIS
titik ::Periksa apakah komit Anda tidak dipublikasikan ::
Perbarui untuk
LAST
melakukan ::dan impor komit hingga
THIS
ke MQ ::Batalkan penerapan semua tambalan dan terapkan hanya terlebih dahulu
THIS
::Bergabung dengan
THAT
::CATATAN Untuk mencari nama
THATNAME
gunakan ::Terapkan semua tambalan dan pindahkan ke riwayat repositori ::
Posting blog saya tentang subjek adalah Bergabung dengan dua komitmen di Mercurial .
sumber
Ya,
strip --keep
berfungsi untuk pertanyaan Penulis. Tapi itu sedikit berbeda dari yang lain, misalnya, jika Anda memiliki versi dari 1 hingga 30 tetapi hanya ingin menciutkan versi 12-15. Solusi lain berhasil tetapi tidakstrip --keep
.sumber