Git: Bagaimana cara mengedit / menulis ulang pesan gabungan?

148

Bagaimana cara saya mengedit atau menulis ulang pesan gabungan?

git commit --amendberfungsi jika itu adalah komit terakhir yang dibuat ( HEAD), tetapi bagaimana jika itu datang sebelumnya HEAD?

git rebase -i HEAD~5 tidak mencantumkan komitmen gabungan.

ma11hew28
sumber

Jawaban:

207

Jika Anda menambahkan --preserve-mergesopsi (atau sinonimnya -p) ke git rebase -iperintah, maka git akan mencoba untuk mempertahankan penggabungan saat rebasing, daripada membuat linierisasi sejarah, dan Anda harus dapat mengubah komit penggabungan juga:

git rebase -i -p HEAD~5
Mark Longair
sumber
1
Saya sudah melakukan ini tetapi setelah melakukan perubahan dan mencoba dan mendorong perubahan saya, saya mengerti! [rejected] HEAD -> master (non-fast-forward)error: failed to push some refs to
Marc
1
coba jalankan git push -f dan kemudian cabang asal Anda. ini seharusnya bekerja. Saya memiliki masalah yang sama, untuk beberapa alasan ini adalah artefak rebasing karena yang pada dasarnya terjadi adalah setelah rebasing Anda berakhir dengan sebuah hed yang terpisah, sehingga -paksa harus memperbaikinya dan harus mendorong semuanya.
Radu Comaneci
11
@ Mark Ini terjadi karena Anda memodifikasi komit yang sudah Anda kirim. Ini dianggap praktik buruk untuk memaksakan push ke server karena itu benar-benar dapat mendefinisi Anda dan rekan kerja. Nah, jika Anda sendirian itu seharusnya tidak menjadi masalah.
ibizaman
Di mana HEAD~5induk dari komit yang ingin Anda ubah (biasanya sha1 ^).
Gabriel Devillers
2
--preserve-mergessekarang--rebase-merges
OrangeDog
32

Perhatikan bahwa, mulai git1.7.9.6 (dan git1.7.10 +), git mergeitu sendiri akan selalu memicu editor , bagi Anda untuk menambahkan detail ke gabungan.

" git merge $tag" untuk menggabungkan tag beranotasi selalu membuka editor selama sesi edit interaktif. seri v1.7.10 memperkenalkan variabel lingkungan GIT_MERGE_AUTOEDIT untuk membantu skrip yang lebih lama menolak perilaku ini, tetapi track pemeliharaan juga harus mendukungnya.

Itu juga memperkenalkan variabel lingkungan GIT_MERGE_AUTOEDITuntuk membantu skrip yang lebih lama menolak perilaku ini.

Lihat " Antisipasi Git 1.7.10 ":

Baru-baru ini dalam sebuah diskusi di milis Git , Linus mengakui (dan saya setuju) bahwa ini adalah salah satu kesalahan desain yang kami buat di awal sejarah Git.
Dan pada 1.7.10 dan yang lebih baru, perintah git merge yang dijalankan dalam sesi interaktif (yaitu input standar dan output standarnya terhubung ke terminal) akan membuka editor sebelum membuat komit untuk merekam hasil penggabungan, untuk memberikan pengguna memiliki kesempatan untuk menjelaskan penggabungan, sama seperti perintah git commit yang dijalankan pengguna setelah menyelesaikan penggabungan yang konflik.

Linus berkata:

Tapi saya tidak begitu peduli bagaimana cara kerjanya - masalah utama saya adalah git membuatnya terlalu mudah untuk memiliki pesan penggabungan yang buruk.
Saya pikir bagian dari itu adalah kebodohan yang bahkan lebih sederhana: kita bahkan tidak pernah menjalankan editor secara default untuk "git merge", tetapi kita melakukannya untuk " git commit".
Itu adalah kesalahan desain, dan itu berarti bahwa jika Anda ingin benar-benar menambahkan catatan ke penggabungan, Anda harus melakukan pekerjaan ekstra. Jadi orang tidak
.


Perhatikan bahwa, sebelum Git 2.17 (Q2 2018), " git rebase -p" pesan log yang digabungkan dari komit gabungan, yang sekarang sudah diperbaiki.

Lihat komit ed5144d (08 Feb 2018) oleh Gregory Herrero (``) .
Disarankan oleh: Vegard Nossum ( vegard) , dan Quentin Casasnovas ( casasnovas) .
(Digabung oleh Junio ​​C Hamano - gitster- dalam komit 8b49408 , 27 Feb 2018)

rebase -p: perbaiki pesan komit yang salah saat menelepon git merge.

Sejak komit dd6fb00 (" rebase -p: fix quoting saat memanggil git merge", Januari 2018, Git 2.16.0-rc2), pesan komit dari gabungan komit menjadi rebed diteruskan ke perintah gabungan menggunakan mengeksekusi subshell ' git rev-parse --sq-quote'.

Kutipan ganda diperlukan di sekitar subkulit ini sehingga, baris baru disimpan untuk git mergeperintah.

Sebelum tambalan ini, gabungkan pesan berikut:

"Merge mybranch into mynewbranch

Awesome commit."

menjadi:

"Merge mybranch into mynewbranch Awesome commit."

setelah a rebase -p.


Dengan Git 2.23 (Q2 2019), " merge -c" instruksi selama " git rebase --rebase-merges" harus memberi pengguna kesempatan untuk mengedit pesan log, bahkan ketika tidak ada kebutuhan untuk membuat gabungan baru dan mengganti yang sudah ada (yaitu fast-forward saja ), tetapi tidak.
Yang sudah diperbaiki.

Lihat komit 6df8df0 (02 Mei 2019) oleh Phillip Wood ( phillipwood) .
(Digabung oleh Junio ​​C Hamano - gitster- di commit c510261 , 13 Jun 2019)

VONC
sumber
16

Jawaban bagus lainnya hanya menggunakan perintah primitif - oleh knittl https://stackoverflow.com/a/7599522/94687 :

git checkout <sha of merge>
git commit --amend # edit message
git rebase HEAD previous_branch

atau perintah rebase akhir yang lebih baik (lebih benar):

git rebase <sha of merge> previous_branch --onto HEAD

BTW, menggunakan perintah primitif mungkin memiliki "fitur" yang bagus untuk tidak mengonsumsi terlalu banyak CPU dan membuat Anda menunggu waktu yang tidak diketahui sampai Git selesai memikirkan daftar komit yang perlu diubah kembali dalam kasus git rebase -p -i HEAD^^^^(perintah seperti itu yang akan menghasilkan daftar hanya 4 komit terakhir dengan penggabungan sebagai yang terakhir dalam kasus saya dalam kasus saya memakan waktu sekitar 50 detik!).

imz - Ivan Zakharyaschev
sumber
2
Ini sangat berguna, selamatkan saya sedikit waktu. Perusahaan saya memblokir beberapa pesan komit dalam repositori, yang mudah dengan --amend atau dengan perintah rebase tetapi: Masalah besar jika kita menggabungkan beberapa cabang ke dalam milik Anda, melakukan beberapa komit dan mencoba mendorong, pesan gabungan default git diblokir ( ini harus diperbaiki, saya tahu) yang memaksa kita untuk mengubah pesan itu. Sampai jawaban ini saya telah mencoba banyak hal untuk mengubah pesan menggabungkan antara riwayat komitmen dengan tidak berhasil.
Giovanni Silva
2

git merge --edit
Memungkinkan Anda memberikan komentar meskipun penggabungan non-interaktif.

git merge --edit --no-ff dapat berguna jika Anda mengikuti alur git dengan rebasing di cabang pengembangan dan bergabung dengannya tanpa maju cepat.

Do-do-new
sumber
2

Untuk versi Git saat ini (Mai 2020):

git rebase -i -r <parent>,

lalu ganti editor merge -C ...dengan merge -c ....

Ini akan membuka pesan komit di editor selama rebasing, di mana Anda dapat mengubahnya.

(Terima kasih kepada VonC untuk petunjuknya .)

Eugen Labun
sumber
0

The git rebase -i HEAD~5perintah muncul editor. Ini daftar komit yang ditentukan (dalam hal ini lima di antaranya). Kolom pertama berisi pickuntuk setiap komit. Cukup ganti pickdengan reworddi editor itu dan simpan + tutup editor. Kemudian git akan muncul editor untuk setiap komit mana Anda berubah pickke reworddan akan membiarkan Anda mengedit pesan commit.

ChrisD
sumber
6
Ini tidak bekerja untuk gabungan komit kecuali Anda juga menambahkan -pke git rebaseperintah.
Paul Harga
4
jawaban yang bagus jika itu adalah pertanyaan yang berbeda
doz87