Saya mencoba untuk menghentikan berbagai komitmen - HEAD to HEAD ~ 3. Apakah ada cara cepat untuk melakukan ini, atau apakah saya perlu menggunakan rebase --interactive?
git
interactive
rebase
squash
Phillip
sumber
sumber
Jawaban:
Pastikan pohon kerja Anda bersih, lalu
sumber
git reset --soft HEAD~3 && git commit -m "my message"
git config alias.mysquash '!f(){ git reset --soft HEAD~$1 && git commit ${2:+-m "$2"}; };f'
.git mysquash 3 'some message'
akan berfungsi, tetapi saya juga mengubahnya sehinggagit musquash 3
akan menghilangkan -m sepenuhnya sehingga Anda akan mendapatkangit commit
UI interaktif dalam kasus itu.Saya pribadi menyukai solusi wilhelmtell :
Namun, saya membuat alias dengan beberapa pengecekan kesalahan sehingga Anda bisa melakukan ini:
Saya sarankan menyiapkan alias yang benar-benar menjalankan skrip sehingga lebih mudah untuk (a) membuat kode skrip Anda dan (b) melakukan pekerjaan yang lebih kompleks dengan pemeriksaan kesalahan. Di bawah ini adalah skrip yang melakukan pekerjaan squash dan di bawahnya adalah skrip untuk menyiapkan alias git Anda.
Script untuk squash (squash.sh)
Kemudian untuk menghubungkan skrip squash.sh itu ke alias git, buat skrip lain untuk menyiapkan alias git Anda seperti itu ( create_aliases.command atau create_aliases.sh ):
sumber
$PATH
namagit-squash.sh
dan secara otomatis akan diberi nama aliasgit squash
. Saya tidak mengubah jawaban Anda, kalau-kalau ada alasan untuk menggunakancreate-aiases.sh
skrip yang tidak saya ketahui.Untuk menambah jawaban oleh wilhelmtell, saya merasa nyaman untuk melakukan soft reset
HEAD~2
dan kemudian mengubah komitHEAD~3
:Ini akan menggabungkan semua komit ke
HEAD~3
komit dan menggunakan pesan komitnya. Pastikan untuk memulai dari pohon kerja yang bersih.sumber
Saya menggunakan:
Bekerja dengan baik. Hanya saja, jangan mencoba memiliki log komit dengan baris yang dimulai dengan "pilih" :)
sumber
Gunakan perintah berikut untuk menghentikan 4 komit terakhir dalam komit terakhir:
Dengan alias:
Dari https://github.com/brauliobo/gitconfig/blob/master/configs/.gitconfig
sumber
Berikut ini adalah satu baris untuk menghentikan 2 komit terakhir. Dalam contoh ini, pesan dari komit terakhir kedua akan disimpan. Anda dapat mengubah pesan sesuai keinginan Anda.
Perintah ini akan sangat berguna jika Anda membuat alias untuk perintah ini dan menggunakan alias sebagai gantinya.
sumber
Untuk menghancurkan segalanya sejak cabang itu bercabang dari master:
sumber
--reedit-message=HEAD
akan menggunakan pesan dari komit terakhir yang bukan bagian dari squashing . Ini mungkin bukan yang Anda inginkan. Untuk mendapatkan pesan dari komit pertama yang akan disertakan , baik (1) gantiHEAD
dengan hash komit yang Anda inginkan pesannya, atau (2) lompat ke komit pertama untuk disertakan dangit commit --amend --reedit-message=HEAD
. Inilah yang dilakukan oleh jawaban yang harmonis.Anda bisa cukup dekat dengan
Ini mengasumsikan Anda menguasai dengan sejarah linier. Ini bukan squash karena membuang komitmen perantara. Anda perlu mengubah HEAD baru untuk mengubah pesan komit.
sumber
HEAD~4
dijadikan induknya.