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?
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?
Jawaban:
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 bawaan mq
untuk diaktifkan.
Catatan 2: Klien Git / Mercurial favorit saya (SmartGit / Hg) ditambahkan dengan --keep
parameter default selama strip
. Dan yang lebih nyaman: ini menyediakan opsi yang disebut join commits
:]
hg strip --keep --rev [rev]
Di mana rev
nomor revisi dari komit pertama yang ingin Anda hilangkan dengan yang terakhir
--rev
adalah opsional, perintah lengkap adalahhg strip --keep [rev]
hg help strip
memberi hg strip [-k] [-f] [-n] [-B bookmark] [-r] REV...
, dan menghilangkan revisi memberi saya abort: empty revision set
.
hg strip
bukanlah ide terbaik. Ini tidak sepenuhnya aman. Coba hg histedit
, mungkin coba gunakan ekstensi berevolusi.
The ekstensi Rebase bekerja seperti pesona. Untuk squash 2 komit:
$ hg rebase --dest .~2 --base . --collapse
Titik adalah jalan pintas untuk revisi saat ini.
Lebih mudah lagi bila Anda memiliki beberapa komit di cabang dan ingin menciutkan semuanya menjadi satu:
$ hg rebase --dest {destination branch (e.g. master)} --base . --collapse
Bagaimana ini bekerja:
(dari http://mercurial-scm.org/wiki/RebaseExtension#Collapsing )
Jika Anda membaca jawaban ini, Anda dapat melupakan setiap opsi lain yang disebutkan dalam jawaban ini dan menggunakan
fold
perintah dari ekstensi evolve .
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.
[extensions]
evolve = ~/evolve/hgext/evolve.py
Dengan asumsi Anda mengkloning repo evolve di direktori home Anda. Sekarang Anda siap untuk pergi. Anda juga dapat mencari bantuan dengan hg help fold
.
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.
a -> b -> c -> d -> e -> f -> g
Anda ingin squash e
, f
dan g
. Anda dapat melakukan
hg up g
hg fold -r e
Hasilnya akan seperti itu
a -> b -> c -> d -> h
di mana h
perubahan yang berisi perubahan dari ketiga komit e
, f
dan g
.
Anda juga dapat melipat rangkaian perubahan dari tengah histori, misalnya Anda tidak harus memilih rantai yang menyertakan ujungnya. Misalkan Anda ingin melipat b
, c
dan d
. Anda dapat melakukan
hg up d
hg fold -r b
hg evolve --all
Ini akan menghasilkan
a -> i -> j
di mana i
adalah changeset terlipat b
, c
, d
dan j
adalah changeset sama h
.
Panduan pengguna Evolve harus dibaca.
--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 "
Ekstensi absorb akan mengambil setiap perubahan dalam direktori kerja Anda, mencari tahu komit mana dalam rangkaian Anda yang memodifikasi baris itu, dan secara otomatis mengubah perubahan pada komit itu.
Jika ada ambiguitas (mis. Beberapa komit memodifikasi baris yang sama), maka absorb akan mengabaikan perubahan itu dan membiarkannya di direktori kerja Anda untuk diselesaikan secara manual.Pada tingkat teknis,
hg absorb
temukan semua perubahan yang tidak mengikat dan upaya untuk memetakan setiap baris yang diubah menjadi komit sebelumnya yang tidak ambigu.
Untuk setiap perubahan yang dapat dipetakan dengan rapi, perubahan yang tidak mengikat diserap ke dalam komit sebelumnya yang sesuai. Komitmen yang terpengaruh oleh operasi di-rebased secara otomatis.
Jika perubahan tidak bisa dipetakan ke komit sebelumnya yang tidak ambigu, itu dibiarkan tanpa komitmen dan pengguna bisa kembali ke alur kerja yang ada (misalnya menggunakanhg histedit
).Logika penulisan ulang otomatis
hg absorb
diimplementasikan dengan mengikuti histori baris: Ini pada dasarnya berbeda dari pendekatan yang diambil olehhg histedit
ataugit rebase
, yang cenderung mengandalkan strategi penggabungan berdasarkan penggabungan 3 arah untuk mendapatkan versi baru dari file yang diberi beberapa masukan versi.Pendekatan ini dikombinasikan dengan fakta bahwa hg absorb melompati perubahan dengan komit aplikasi yang ambigu berarti bahwa hg absorb tidak akan pernah mengalami konflik penggabungan!
Sekarang, Anda mungkin berpikir jika Anda mengabaikan baris dengan target aplikasi yang ambigu, tambalan akan selalu diterapkan dengan rapi menggunakan penggabungan 3 arah klasik. Pernyataan ini secara logis terdengar benar. Namun tidak:
hg absorb
dapat menghindari konflik penggabungan saat penggabungan dilakukan olehhg histedit
ataugit rebase -i
akan gagal.
Saya pikir chistedit
(dibangun sejak Mercurial 2.3) adalah yang paling dekat dengan rebase -i
Mercurial murni ( chistedit
adalah versi interaktif histedit
). Setelah di histedit, fold
peta perintah ke rebase squash
dan roll
peta perintah ke rebase fixup
. 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.
@ 1e21c4b1 drees tip
| A commit you want to squash
o b4a738a4 drees
| A commit
o 788aa028 drees
| Older stuff
Anda dapat menjalankan hg chistedit -r b4a738a4
untuk mengedit riwayat kembali ke b4a738a4. Di chistedit Anda kemudian mengarahkan kursor ke 1e21c4b1 dan tekan r
untuk menunjukkan Anda ingin menggulung revisi itu. Perhatikan bahwa urutan dalam histedit (terlama ke terbaru) dibalik dari hg log
(terbaru ke terlama).
#0 pick 160:b4a738a49916 A commit
#1 ^roll 161:1e21c4b1500c
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 daripada chistedit
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
atau chistedit
Anda perlu menambahkan histedit
ekstensi di ~ / .hgrc Anda:
[extensions]
histedit =
Saya menyarankan chistedit
karena itu paling dekat rebase -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 Demecki strip
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:
hg strip .
hg add
hg commit --amend
Catatan strip
, seperti histedit, perlu diaktifkan di ~ / .hgrc Anda:
[extensions]
strip =
Anggaplah Anda ingin memadatkan (menyatukan) 2 komit terbaru.
Temukan nomor revisi
hg log -G -l 3
kemungkinan keluaran:
@ changeset: 156:a922d923cf6f
| branch: default
| tag: tip
| user: naXa!
| date: Thu Dec 13 15:45:58 2018 +0300
| summary: commit message 3
|
o changeset: 155:5feb73422486
| branch: default
| user: naXa!
| date: Thu Dec 13 15:22:15 2018 +0300
| summary: commit message 2
|
o changeset: 154:2e490482bd75
| branch: default
~ user: naXa!
date: Thu Dec 13 03:28:27 2018 +0300
summary: commit message 1
Cabang reset lunak
hg strip --keep -r 155
Lakukan perubahan lagi
hg commit -m "new commit message"
strip
membutuhkan ekstensi bawaan untuk diaktifkan. Buat / edit ~/.hgrc
file konfigurasi dengan konten berikut:
[extensions]
strip =