Saya memiliki sepasang komitmen yang seharusnya hanya satu. Jika saya menggunakan git, saya akan menggunakan:
git rebase -i <some-commit-before>
dan kemudian remas.
Bisakah saya melakukannya dengan lincah? Jika ya, bagaimana caranya?
Ya, Anda dapat melakukan ini menggunakan mercurial tanpa ekstensi apa pun dengan Concatenating Changesets .
Bergantian jika Anda ingin menggunakan ekstensi, Anda dapat menggunakan:
Favorit saya adalah
hg strip --keep
perintah. Dan kemudian saya melakukan semua perubahan dalam satu komit.Ini adalah cara tercepat dan ternyaman bagi saya, karena saya suka melakukan banyak hal kecil selama pekerjaan saya sehari-hari;)
Catatan 1:
strip
membutuhkan ekstensi bawaanmq
untuk diaktifkan.Catatan 2: Klien Git / Mercurial favorit saya (SmartGit / Hg) ditambahkan dengan
--keep
parameter default selamastrip
. Dan yang lebih nyaman: ini menyediakan opsi yang disebutjoin commits
:]sumber
hg strip --keep --rev [rev]
Di manarev
nomor revisi dari komit pertama yang ingin Anda hilangkan dengan yang terakhir--rev
adalah opsional, perintah lengkap adalahhg strip --keep [rev]
hg help strip
memberihg strip [-k] [-f] [-n] [-B bookmark] [-r] REV...
, dan menghilangkan revisi memberi sayaabort: empty revision set
.hg strip
bukanlah ide terbaik. Ini tidak sepenuhnya aman. Cobahg histedit
, mungkin coba gunakan ekstensi berevolusi.The ekstensi Rebase bekerja seperti pesona. Untuk squash 2 komit:
Titik adalah jalan pintas untuk revisi saat ini.
Lebih mudah lagi bila Anda memiliki beberapa komit di cabang dan ingin menciutkan semuanya menjadi satu:
Bagaimana ini bekerja:
(dari http://mercurial-scm.org/wiki/RebaseExtension#Collapsing )
sumber
evolve
adalah perpanjangan dari mercurial yang membantu kita dalam memiliki sejarah yang bisa berubah dengan aman, ini masih eksperimental. Anda dapat menggunakannya dengan kloning dari yang repo dan menambahkannya di .hgrc Anda seperti ini.Dengan asumsi Anda mengkloning repo evolve di direktori home Anda. Sekarang Anda siap untuk pergi. Anda juga dapat mencari bantuan dengan
hg help fold
.Lipat Perintah
Anda memerintahkan
fold
untuk meremas / melipat rantai komitmen linier yang tidak putus. Apa yang dilakukan flip adalah, ia membuat kumpulan perubahan baru yang berisi perubahan dari semua kumpulan perubahan dan menandai semua komitmen tersebut sebagai usang. Anda dapat melihat lebih dalam tentang ini di dokumen .Sekarang misalkan Anda memiliki sejarah berikut.
Anda ingin squash
e
,f
dang
. Anda dapat melakukanHasilnya akan seperti itu
di mana
h
perubahan yang berisi perubahan dari ketiga komite
,f
dang
.Anda juga dapat melipat rangkaian perubahan dari tengah histori, misalnya Anda tidak harus memilih rantai yang menyertakan ujungnya. Misalkan Anda ingin melipat
b
,c
dand
. Anda dapat melakukanIni akan menghasilkan
di mana
i
adalah changeset terlipatb
,c
,d
danj
adalah changeset samah
. Panduan pengguna Evolve harus dibaca.sumber
--keep
opsi rebase menutupi ini (diikuti dengan menandai revisi sebagai rahasia, atau menggunakan strip pada mereka setelah Anda memeriksa hasilnya). Bahkan memindahkan revisi di antara revisi lainnya dimungkinkan dengan urutan dua perintah rebase.Dengan Mercurial 4.8 (November 2018, 9 tahun kemudian), Anda dapat mempertimbangkan perintah baru
hg absorb
(ini adalah fitur eksperimental sebelumnya ).Lihat " Menyerap Perubahan Komit di Mercurial 4.8 "
sumber
Saya pikir
chistedit
(dibangun sejak Mercurial 2.3) adalah yang paling dekat denganrebase -i
Mercurial murni (chistedit
adalah versi interaktifhistedit
). Setelah di histedit,fold
peta perintah ke rebasesquash
danroll
peta perintah ke rebasefixup
. Lihat dokumen histedit untuk info lebih lanjut.Berikut ini contoh sederhananya. Asumsikan Anda memiliki yang berikut ini dan ingin memindahkan semua perubahan 1e21c4b1 ke revisi sebelumnya dan hanya menyimpan pesan revisi sebelumnya.
Anda dapat menjalankan
hg chistedit -r b4a738a4
untuk mengedit riwayat kembali ke b4a738a4. Di chistedit Anda kemudian mengarahkan kursor ke 1e21c4b1 dan tekanr
untuk menunjukkan Anda ingin menggulung revisi itu. Perhatikan bahwa urutan dalam histedit (terlama ke terbaru) dibalik darihg log
(terbaru ke terlama).Setelah memilih perubahan Anda, Anda kemudian memilih
c
untuk mengikatnya. Hasilnya adalah sebagai berikut:@ bfa4a3be drees tip | A commit o 788aa028 drees | Barang yang lebih tua
Jika Anda relatif baru mengenal mereka, maka
histedit
bisa menjadi pilihan yang lebih baik daripadachistedit
karena menyediakan deskripsi perintah dalam file histedit untuk referensi. Hanya perlu sedikit lebih banyak pengeditan untuk mengatur perintah menggunakan pengeditan teks biasa (seperti rebase normal).Catatan, untuk menggunakan salah satu
histedit
atauchistedit
Anda perlu menambahkanhistedit
ekstensi di ~ / .hgrc Anda:Saya menyarankan
chistedit
karena itu paling dekatrebase -i
dan bekerja di mana saja dalam sejarah. Jika Anda benar-benar hanya ingin memasukkan / mengubah revisi saat ini ke revisi sebelumnya, maka @G. Saran Demeckistrip
bisa bagus karena apa yang terjadi jelas. Itu dibangun sejak Mercuria 2.8. Untuk mendapatkan hasil yang setara seperti di atas, Anda dapat melakukan hal berikut:Catatan
strip
, seperti histedit, perlu diaktifkan di ~ / .hgrc Anda:sumber
Anggaplah Anda ingin memadatkan (menyatukan) 2 komit terbaru.
Temukan nomor revisi
kemungkinan keluaran:
Cabang reset lunak
Lakukan perubahan lagi
Catatan
strip
membutuhkan ekstensi bawaan untuk diaktifkan. Buat / edit~/.hgrc
file konfigurasi dengan konten berikut:sumber
Saya menggunakan:
sumber