Saya mencoba menggabungkan 2 komitmen menjadi 1, jadi saya mengikuti "squashing commit dengan rebase" dari git ready .
Saya berlari
git rebase --interactive HEAD~2
Di editor yang dihasilkan, saya mengubah pick
ke squash
dan kemudian menyimpan-berhenti, tetapi rebase gagal dengan kesalahan
Tidak dapat 'squash' tanpa komit sebelumnya
Sekarang pohon kerja saya telah mencapai kondisi ini, saya kesulitan memulihkan.
Perintah git rebase --interactive HEAD~2
gagal dengan:
Rebase interaktif sudah dimulai
dan git rebase --continue
gagal dengan
Tidak dapat 'squash' tanpa komit sebelumnya
Jawaban:
Ringkasan
Pesan kesalahan
berarti Anda kemungkinan berusaha untuk "jatuh ke bawah." Git selalu menekan komit yang lebih baru ke komit yang lebih lama atau "ke atas" seperti yang dilihat pada daftar todo rebase interaktif, yaitu komit pada baris sebelumnya. Mengubah perintah pada baris pertama daftar todo Anda
squash
akan selalu menghasilkan kesalahan ini karena tidak ada komitmen pertama yang diperas.Cara Mengatasinya
Pertama kembali ke tempat Anda mulai
Katakan sejarah Anda
Yaitu, a adalah komit pertama, kemudian b, dan akhirnya c. Setelah melakukan c, kami memutuskan untuk menekan b dan c bersama-sama:
(Catatan: Menjalankan
git log
pipa hasilnya ke pager,less
secara default di sebagian besar platform. Untuk keluar dari pager dan kembali ke prompt perintah Anda, tekanq
tombol.)Berlari
git rebase --interactive HEAD~2
memberi Anda editor(Perhatikan bahwa daftar todo ini berada dalam urutan terbalik dibandingkan dengan output dari
git log
.)Mengubah b
pick
untuksquash
akan mengakibatkan kesalahan yang Anda lihat, tetapi jika bukan Anda labu c ke b (baru komit ke dalam yang lebih tua atau “meremas ke atas”) dengan mengubah daftar todo untukdan simpan-berhenti editor Anda, Anda akan mendapatkan editor lain yang isinya
Saat Anda menyimpan dan keluar, konten file yang diedit menjadi pesan komit dari komit gabungan baru:
Catatan Tentang Sejarah Penulisan Ulang
Rebase interaktif riwayat penulisan ulang. Mencoba untuk mendorong ke remote yang berisi riwayat lama akan gagal karena itu bukan fast-forward.
Jika cabang yang Anda rebound adalah cabang topik atau fitur di mana Anda bekerja sendiri , bukan masalah besar. Mendorong ke repositori lain akan membutuhkan
--force
opsi, atau Anda mungkin bisa, tergantung pada izin repositori jarak jauh, untuk pertama-tama menghapus cabang lama dan kemudian mendorong versi rebased. Contoh perintah yang berpotensi menghancurkan pekerjaan berada di luar cakupan jawaban ini.Menulis ulang sejarah yang sudah diterbitkan pada cabang di mana Anda bekerja dengan orang lain tanpa alasan yang sangat baik seperti membocorkan kata sandi atau kekuatan perincian sensitif lainnya bekerja pada kolaborator Anda dan bersifat antisosial dan akan mengganggu pengembang lain. Bagian "Memulihkan Dari Rebase Hulu" dalam
git rebase
dokumentasi menjelaskan, dengan penekanan tambahan.sumber
git log hashoftheoldcommit
dan itu berhasil, tetapi saya ingin melihatgit log --graph
dengan semua komitmen yang tidak dapat dijangkau ini disertakanJika ada banyak komit, Anda dapat menggunakannya
git rebase -i
untuk memecah dua komit menjadi satu.Jika hanya ada dua komit yang ingin Anda gabungkan, dan mereka adalah "dua terbaru", perintah berikut dapat digunakan untuk menggabungkan dua komit menjadi satu:
sumber
git reset --soft HEAD~10
, di mana 10 adalah jumlah komit yang ingin Anda gabungkan.HEAD
dengan menggunakan digit reset --soft 47b5c5...
mana47b5c5...
SHA1 ID dari komit.Rebase: Anda Tidak Akan Membutuhkannya:
Cara sederhana untuk skenario yang paling sering.
Umumnya:
Sebenarnya jika semua yang Anda inginkan hanya cukup menggabungkan beberapa komit baru menjadi satu tetapi tidak perlu
drop
,reword
dan pekerjaan rebase lainnya.Anda cukup melakukannya:
~n
adalah jumlah komit untuk lembut un-komit (yaitu~1
,~2
, ...)Kemudian, gunakan perintah berikut untuk mengubah pesan komit.
yang hampir sama dengan jarak jauh
squash
dan satupick
.Dan itu berfungsi untuk n melakukan tetapi tidak hanya dua melakukan seperti yang diminta di atas.
sumber
~n
adalah jumlah komit untuk lembut un-komit (yaitu~1
,~2
, ...)n
komitmen terakhir, tetapin
komitmen di tengah? Bisakah saya melakukannya dengan mudah?git rebase -i
apa yang perlu Anda lakukansquash
bekerja. @chumakoffn
komit terbaru menjadi satu, gunakan pertama kaligit reset --soft @~m
, di manam = n - 1
Pertama, Anda harus memeriksa berapa banyak komitmen yang Anda miliki:
Ada dua status:
Pertama, hanya ada dua komitmen:
Sebagai contoh:
(Dalam hal ini, Anda tidak dapat menggunakan git rebase untuk melakukannya) yang perlu Anda lakukan sebagai berikut.
Yang lain adalah bahwa ada lebih dari dua komitmen; Anda ingin menggabungkan komit C dan D.
Sebagai contoh:
(dalam kondisi ini, Anda dapat menggunakan git rebase)
Dan daripada menggunakan "squash" untuk melakukannya. Sisanya menipis sangat mudah. Jika Anda masih belum tahu, silakan baca http://zerodie.github.io/blog/2012/01/19/git-rebase-i/
sumber
git push -f origin master
mungkin perlu.Dengan asumsi Anda berada di cabang topik Anda sendiri. Jika Anda ingin menggabungkan 2 komit terakhir menjadi satu dan terlihat seperti pahlawan, cabut komit tepat sebelum Anda membuat dua komit terakhir.
Kemudian squash melakukan cabang lain di cabang baru ini:
Itu akan membawa perubahan tetapi tidak melakukannya. Jadi, komit saja dan selesai.
Sekarang Anda dapat menggabungkan cabang topik baru ini kembali ke cabang utama Anda.
sumber
a
danc
mengharuskan untuk digabung bersama dan tetapb
seperti itu.git checkout -b combine-last-two-commits "HEAD^2"
) di git versi 2.17, saya mendapatkan kesalahan:fatal: 'HEAD^2' is not a commit and a branch 'combine-last-two-commits' cannot be created from it
Anda dapat membatalkan rebase dengan
dan ketika Anda menjalankan perintah rebase interaktif lagi squash; komit harus di bawah pick komit dalam daftar
sumber
Saya sering menggunakan git reset --mixed untuk mengembalikan versi dasar sebelum banyak komit yang ingin Anda gabungkan, kemudian saya membuat komit baru, dengan cara itu Anda dapat membiarkan komit Anda terbaru, pastikan versi Anda HEAD setelah Anda mendorong ke server.
Jika saya ingin menggabungkan dua komit menjadi satu, pertama saya gunakan:
"249cf9392da197573a17c8426c282" adalah versi ketiga, juga merupakan versi dasar Anda sebelum Anda bergabung, setelah itu, saya membuat komit baru:
Itu semua, harapan adalah cara lain untuk semua orang.
FYI, dari
git reset --help
:sumber
$ git rebase --abort
Jalankan kode ini kapan saja jika Anda ingin membatalkan git rebase
$ git rebase -i HEAD~2
Untuk mengajukan kembali dua komitmen terakhir. Perintah di atas akan membuka editor kode
Setelah: wq Anda akan berada dalam mode rebase aktif
Catatan : Anda akan mendapatkan editor lain jika tidak ada pesan peringatan / kesalahan, Jika ada kesalahan atau peringatan editor lain tidak akan ditampilkan, Anda dapat membatalkan dengan menjalankann
$ git rebase --abort
jika Anda melihat kesalahan atau peringatan lain hanya melanjutkan dengan menjalankan$ git rebase --continue
Anda akan melihat 2 pesan komit Anda. Pilih satu atau tulis pesan komit Anda sendiri, simpan dan keluar [: wq]
Catatan 2: Anda mungkin perlu memaksakan perubahan Anda ke repo jarak jauh jika Anda menjalankan perintah rebase
$ git push -f
$ git push -f origin master
sumber
git push -f origin/master
adalah jawaban lain yang tidak ada. +1Karena saya gunakan
git cherry-pick
untuk hampir semua hal, bagi saya itu wajar untuk melakukannya bahkan di sini.Mengingat bahwa saya telah
branchX
memeriksa dan ada dua komitmen di ujungnya, yang ingin saya buat satu komit yang menggabungkan konten mereka, saya melakukan ini:Jika saya ingin memperbarui
branchX
juga (dan saya kira ini adalah sisi bawah dari metode ini) saya juga harus:sumber
Jika cabang master Anda
git log
terlihat seperti berikut:dan Anda ingin menggabungkan dua komitmen teratas lakukan saja langkah-langkah mudah berikut:
git checkout 77df2a40e53136c7a2d58fd847372 -b merged-commits
git cherry-pick -n -x ac72a4308ba70cc42aace47509a5e
. (Selesaikan konflik jika timbul)git commit --amend
.Itu dia. Anda dapat mendorong versi gabungan ini di cabang "gabungan komitmen" jika Anda mau.
Juga, Anda dapat membuang dua komit back-to-back di cabang master Anda sekarang. Cukup perbarui cabang master Anda sebagai:
sumber
Jika Anda ingin menggabungkan dua komit terbaru dan hanya menggunakan pesan komit yang lebih lama, Anda dapat mengotomatiskan proses menggunakan
expect
.Saya berasumsi:
Saya diuji dengan
git version 2.14.3 (Apple Git-98)
.sumber
expect
tidak dijelaskan.expect
.