Anda dapat menjalankan git rebase --interactive
dan menyusun ulang D sebelum B dan memasukkan squash D ke A.
Git akan membuka editor, dan Anda melihat file seperti ini, mis: git rebase --interactive HEAD~4
pick aaaaaaa Commit A
pick bbbbbbb Commit B
pick ccccccc Commit C
pick ddddddd Commit D
# Rebase aaaaaaa..ddddddd onto 1234567 (4 command(s))
#
# Commands:
# p, pick = use commit
# r, reword = use commit, but edit the commit message
# e, edit = use commit, but stop for amending
# s, squash = use commit, but meld into previous commit
# f, fixup = like "squash", but discard this commit's log message
# x, exec = run command (the rest of the line) using shell
#
# These lines can be re-ordered; they are executed from top to bottom.
#
# If you remove a line here THAT COMMIT WILL BE LOST.
#
# However, if you remove everything, the rebase will be aborted.
#
# Note that empty commits are commented out
Sekarang Anda mengubah file itu menjadi seperti ini:
pick aaaaaaa Commit A
squash ddddddd Commit D
pick bbbbbbb Commit B
pick ccccccc Commit C
Dan git sekarang akan menggabungkan perubahan A dan D menjadi satu komit, dan menempatkan B dan C sesudahnya. Ketika Anda tidak ingin menyimpan pesan komit D, alih-alih squash
, Anda akan menggunakan fixup
kata kunci. Untuk lebih lanjut fixup
, Anda dapat berkonsultasi dengan git rebase
dokumen , atau memeriksa pertanyaan ini yang memiliki beberapa jawaban bagus.
There is no tracking information for the current branch
kesalahan saat rebasing. Dalam hal ini Anda perlu menentukan jumlah komit Anda ingin bekerja dengan, seperti ini:git rebase -i HEAD~4
. Lihat jawaban ini .Catatan: Anda tidak boleh mengubah komit yang telah didorong ke repo lain dengan cara apa pun kecuali Anda tahu konsekuensinya .
git log --oneline -4
git rebase --interactive
Ketik
i
(Masukkan VIM dalam mode penyisipan)Ubah daftar agar terlihat seperti ini (Anda tidak harus menghapus atau memasukkan pesan komit). Jangan salah mengeja
squash
! :Ketik Esckemudian
ZZ
(Simpan dan keluar dari VIM)Tipe
i
Ubah teks menjadi seperti apa Anda ingin pesan komit baru terlihat. Saya merekomendasikan ini sebagai deskripsi perubahan dalam komit
A
danD
:Ketikkan Esckemudian
ZZ
git log --oneline -4
git show E
Anda sekarang telah membuat komit baru
E
. BerkomitmenA
danD
tidak lagi dalam sejarah Anda tetapi tidak hilang. Anda masih dapat memulihkannya pada saat ini dan untuk sementara waktugit rebase --hard D
(git rebase --hard
akan menghancurkan perubahan lokal! ).sumber
Bagi mereka yang menggunakan SourceTree :
Pastikan Anda belum mendorong komit.
Squash with previous
sumber
Rebase interaktif berfungsi dengan baik hingga Anda memiliki cabang fitur besar dengan 20-30 komit dan / atau beberapa penggabungan dari master atau / dan memperbaiki konflik saat Anda melakukan komit di cabang Anda. Bahkan dengan menemukan komit saya melalui sejarah dan mengganti
pick
dengansquash
tidak bekerja di sini. Jadi saya mencari cara lain dan menemukan artikel ini . Saya melakukan perubahan untuk mengerjakan ini di cabang terpisah:Sebelum ini saya mendapatkan permintaan tarik saya dengan sekitar ~ 30 komit dengan 2-3 gabungan dari master + memperbaiki konflik. Dan setelah ini saya mendapatkan PR yang jelas dengan satu komit.
PS di sini adalah skrip bash untuk melakukan langkah-langkah ini di automode.
sumber
master checkout $ git
$ git log --oneline
$ git rebase --onto HEAD ^^^ HEAD ^
$ git log --oneline
sumber
--oneline
? Dan sepertinya Anda terjatuhC
danB
, bukan itu yang ingin OP.git show A
) dan D, C dan B hilang dalam ref-log saya. Harusgit rebase D
kembali.