Memperluas apa yang saya tulis dalam komentar
Aturan umum adalah bahwa Anda tidak boleh menulis ulang (mengubah) sejarah yang telah Anda terbitkan, karena seseorang mungkin telah mendasari pekerjaan mereka di atasnya. Jika Anda menulis ulang (mengubah) riwayat, Anda akan membuat masalah dengan menggabungkan perubahan mereka dan dengan memperbarui untuk mereka.
Jadi solusinya adalah untuk membuat komit baru yang muallaf perubahan yang Anda ingin menyingkirkan. Anda dapat melakukan ini menggunakan perintah git revert .
Anda memiliki situasi berikut:
A <- B <- C <- D <- master <- HEAD
(panah di sini merujuk ke arah penunjuk: referensi "induk" dalam kasus komit, komit atas dalam kasus kepala cabang (cabang ref), dan nama cabang dalam kasus referensi KEPALA).
Yang perlu Anda buat adalah sebagai berikut:
A <- B <- C <- D <- [(BCD) ^ - 1] <- master <- HEAD
di mana "[(BCD) ^ - 1]" berarti komit yang mengembalikan perubahan dalam komit B, C, D. Matematika memberi tahu kita bahwa (BCD) ^ - 1 = D ^ -1 C ^ -1 B ^ -1, jadi Anda bisa mendapatkan situasi yang diperlukan menggunakan perintah berikut:
$ git revert --no-commit D
$ git revert --no-commit C
$ git revert --no-commit B
$ git commit -m "the commit message"
Solusi alternatif adalah dengan checkout konten dari commit A, dan komit pada kondisi ini:
$ git checkout -f A -- .
$ git commit -a
Maka Anda akan memiliki situasi berikut:
A <- B <- C <- D <- A '<- master <- HEAD
Komit A 'memiliki konten yang sama dengan komit A, tetapi komit berbeda (pesan komit, orang tua, tanggal komit).
The solusi dengan Jeff Ferland, dimodifikasi oleh Charles Bailey dibangun berdasarkan ide yang sama, tetapi menggunakan ulang git :
$ git reset --hard A
$ git reset --soft @{1} # (or ORIG_HEAD), which is D
$ git commit
git push -f HEAD~4:master
(dengan anggapan cabang remote adalah master). Ya, Anda dapat mendorong komit seperti itu.