Semua jawaban sejauh ini tidak membahas masalah trailing:
Apakah ada metode yang efisien ketika ada ratusan revisi setelah yang akan dihapus?
Langkah-langkahnya mengikuti, tetapi untuk referensi, mari kita asumsikan sejarah berikut:
[master] -> [hundreds-of-commits-including-merges] -> [C] -> [R] -> [B]
C : komit hanya mengikuti komit yang akan dihapus (bersih)
R : Komit untuk dihapus
B : komit tepat sebelum komit untuk dihapus (basis)
Karena kendala "ratusan revisi", saya mengasumsikan pra-kondisi berikut:
- ada beberapa komitmen memalukan yang Anda harap tidak pernah ada
- ada NOL komitmen selanjutnya yang benar-benar bergantung pada komitmen yang memalukan (nol konflik saat kembali)
- Anda tidak peduli bahwa Anda akan terdaftar sebagai 'Pengemis' dari ratusan komitmen yang ikut campur ('Pengarang' akan dipertahankan)
- Anda belum pernah membagikan repositori
- atau Anda benar-benar memiliki pengaruh yang cukup besar terhadap semua orang yang pernah mengkloning sejarah dengan komitmen di dalamnya untuk meyakinkan mereka untuk menggunakan sejarah baru Anda
- dan Anda tidak peduli tentang penulisan ulang sejarah
Ini adalah serangkaian kendala yang cukup ketat, tetapi ada jawaban menarik yang benar-benar berfungsi dalam kasus sudut ini.
Berikut langkah-langkahnya:
git branch base B
git branch remove-me R
git branch save
git rebase --preserve-merges --onto base remove-me
Jika benar-benar tidak ada konflik, maka ini harus dilanjutkan tanpa interupsi lebih lanjut. Jika ada konflik, Anda dapat menyelesaikannya dan rebase --continueatau memutuskan untuk hidup dengan rasa malu dan rebase --abort.
Sekarang Anda harusnya mastertidak lagi memiliki R di dalamnya. The savecabang poin ke tempat Anda sebelumnya, jika anda ingin mendamaikan.
Bagaimana Anda ingin mengatur transfer orang lain ke riwayat baru Anda terserah Anda. Anda perlu berkenalan dengan stash, reset --hard, dan cherry-pick. Dan Anda dapat menghapus base, remove-medan savecabang