Ringkasan
Pesan kesalahan
Tidak dapat 'squash' tanpa komit sebelumnya
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
$ git rebase --abort
Katakan sejarah Anda
$ git log --pretty=oneline
a931ac7c808e2471b22b5bd20f0cad046b1c5d0d c
b76d157d507e819d7511132bdb5a80dd421d854f b
df239176e1a2ffac927d8b496ea00d5488481db5 a
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, tekan q
tombol.)
Berlari git rebase --interactive HEAD~2
memberi Anda editor
pick b76d157 b
pick a931ac7 c
# Rebase df23917..a931ac7 onto df23917
#
# 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
#
# If you remove a line here THAT COMMIT WILL BE LOST.
# However, if you remove everything, the rebase will be aborted.
#
(Perhatikan bahwa daftar todo ini berada dalam urutan terbalik dibandingkan dengan output dari git log
.)
Mengubah b pick
untuk squash
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 untuk
pick b76d157 b
squash a931ac7 c
dan simpan-berhenti editor Anda, Anda akan mendapatkan editor lain yang isinya
# This is a combination of 2 commits.
# The first commit's message is:
b
# This is the 2nd commit message:
c
Saat Anda menyimpan dan keluar, konten file yang diedit menjadi pesan komit dari komit gabungan baru:
$ git log --pretty=oneline
18fd73d3ce748f2a58d1b566c03dd9dafe0b6b4f b and c
df239176e1a2ffac927d8b496ea00d5488481db5 a
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.
Memotong kembali (atau bentuk penulisan ulang lainnya) cabang yang menjadi dasar pekerjaan orang lain adalah ide yang buruk: siapa pun di hilirnya dipaksa untuk secara manual memperbaiki sejarah mereka. Bagian ini menjelaskan cara melakukan perbaikan dari sudut pandang hilir. Perbaikan sebenarnya, bagaimanapun, adalah untuk menghindari rebasing hulu di tempat pertama. ...