Saya punya delapan komitmen di cabang yang ingin saya kirimi email ke beberapa orang yang belum git tercerahkan. Sejauh ini, semua yang saya lakukan memberi saya 8 file tambalan, atau mulai memberi saya tambalan file untuk setiap komit dalam sejarah cabang, sejak awal waktu. Saya menggunakan git rebase --interaktif untuk menekan komit, tapi sekarang semua yang saya coba memberi saya zillions patch dari awal waktu. Apa yang saya lakukan salah?
git format-patch master HEAD # yields zillions of patches, even though there's
# only one commit since master
git
patch
squash
git-squash
skiphoppy
sumber
sumber
Jawaban:
Saya akan merekomendasikan melakukan ini pada cabang sekali pakai sebagai berikut. Jika komit Anda berada di cabang "baris baru" dan Anda telah beralih kembali ke cabang "master" Anda, ini seharusnya bisa dilakukan:
Semoga ini membantu!
sumber
git comit -m "My squashed commits"
jika tidak akan menambah file yang tidak terlacak lainnyagit checkout 775ec2a && git checkout -b patch && git merge --squash branchname
Hanya dengan menambahkan satu solusi lagi ke pot: Jika Anda menggunakan ini sebagai gantinya:
Maka masih akan ada 8 tambalan ... tetapi semuanya akan berada dalam tambalan tunggal dan akan berlaku sebagai satu dengan:
sumber
git rebase -i ...
dan remas semuanya menjadi satu.Saya selalu menggunakan git diff jadi dalam contoh Anda, sesuatu seperti
sumber
git log
, lihat jawaban saya untuk contohIni adalah adaptasi dari jawaban Adam Alexander, kalau-kalau perubahan Anda di cabang utama. Ini lakukan hal berikut:
sumber
Seperti yang sudah Anda ketahui, a
git format-patch -8 HEAD
akan memberi Anda delapan tambalan.Jika Anda ingin 8 komit Anda muncul sebagai satu, dan tidak keberatan menulis ulang sejarah cabang Anda (
o-o-X-A-B-C-D-E-F-G-H
), Anda dapat:atau, dan itu akan menjadi solusi yang lebih baik, putar ulang semua 8 komitmen Anda dari
X
(komit sebelum 8 komitmen Anda) pada cabang baruDengan begitu, Anda hanya memiliki satu komitmen pada cabang "pengiriman", dan itu mewakili semua 8 komitmen terakhir Anda
sumber
git merge master
hanya melakukan fast forward dan tidak memecah menjadi satu. Ubah untukgit merge --squash master
membuat semua komit tergencet dan terlihat di area panggung. Alur Anda akan bekerja dengan perubahan ini. (Saya menggunakan git versi 2.1.0.)Format-patch antara dua tag:
sumber
Cara termudah adalah menggunakan
git diff
, dan menambahkangit log
jika Anda ingin pesan komit gabungan yang dihasilkan oleh metode squash. Misalnya, untuk membuat tambalan antara komitabcd
dan1234
:Kemudian saat menerapkan tambalan:
Jangan lupakan
--binary
argumengit diff
ketika berurusan dengan file non-teks, misalnya gambar atau video.sumber
Berdasarkan jawaban Adam Alexander:
sumber