Misalkan riwayat git Anda terlihat seperti ini:
1 2 3 4 5
1–5 adalah revisi terpisah. Anda harus menghapus 3 sambil tetap 1, 2, 4 dan 5. Bagaimana ini bisa dilakukan?
Apakah ada metode yang efisien ketika ada ratusan revisi setelah yang akan dihapus?
git rebase --onto 2 3 HEAD
cukup banyak berarti rebase ke 2, dengan komit antara 3 dan KEPALA (KEPALA adalah opsional, atau 5 dalam kasus ini)Jawaban:
Untuk menggabungkan revisi 3 dan 4 menjadi satu revisi, Anda dapat menggunakan git rebase. Jika Anda ingin menghapus perubahan dalam revisi 3, Anda perlu menggunakan perintah edit dalam mode rebase interaktif. Jika Anda ingin menggabungkan perubahan menjadi satu revisi, gunakan squash.
Saya telah berhasil menggunakan teknik squash ini, tetapi tidak pernah perlu menghapus revisi sebelumnya. Dokumentasi git-rebase di bawah "Komitmen pemisah" semoga memberi Anda cukup ide untuk mengetahuinya. (Atau orang lain mungkin tahu).
Dari dokumentasi git :
sumber
Per komentar ini (dan saya memeriksa bahwa ini benar), jawaban rado sangat dekat tetapi meninggalkan git dalam keadaan kepala yang terpisah. Alih-alih, hapus
HEAD
dan gunakan ini untuk menghapus<commit-id>
dari cabang tempat Anda berada:sumber
^
untuk~1
membuatnya bekerja.--strategy-option theirs
di akhir.Berikut adalah cara untuk menghapus sesuatu yang tidak interaktif
<commit-id>
, hanya mengetahui yang<commit-id>
ingin Anda hapus:sumber
HEAD
agar tidak ada kepala yang terpisah.Seperti disebutkan sebelumnya git-rebase (1) adalah teman Anda. Dengan asumsi komit ada di
master
cabang Anda, Anda akan melakukan:Sebelum:
Setelah:
Dari git-rebase (1):
sumber
--onto master~3 master~1
?MERGE CONFLICT
kesalahan. Saya menggunakan skenario yang disebutkan di stackoverflow.com/questions/2938301/remove-specific-commit dan saya tidak dapat menghapus komit ke-2 dalam contoh itu.Jika semua yang ingin Anda lakukan adalah menghapus perubahan yang dibuat dalam revisi 3, Anda mungkin ingin menggunakan git revert.
Git revert hanya menciptakan revisi baru dengan perubahan yang membatalkan semua perubahan dalam revisi yang Anda kembalikan.
Artinya, Anda menyimpan informasi tentang komit yang tidak diinginkan, dan komit yang menghapus perubahan tersebut.
Ini mungkin jauh lebih ramah jika mungkin seseorang telah menarik dari repositori Anda dalam waktu yang bersamaan, karena revert pada dasarnya hanyalah komit standar.
sumber
Semua jawaban sejauh ini tidak membahas masalah trailing:
Langkah-langkahnya mengikuti, tetapi untuk referensi, mari kita asumsikan sejarah berikut:
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:
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 --continue
atau memutuskan untuk hidup dengan rasa malu danrebase --abort
.Sekarang Anda harusnya
master
tidak lagi memiliki R di dalamnya. Thesave
cabang 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
, dancherry-pick
. Dan Anda dapat menghapusbase
,remove-me
dansave
cabangsumber
Saya juga mendarat di situasi yang sama. Gunakan rebase interaktif menggunakan perintah di bawah ini dan saat memilih, letakkan komit ke-3.
sumber
Jadi inilah skenario yang saya hadapi, dan bagaimana saya menyelesaikannya.
di sini
R
ada komit yang harus saya hapus, danI
komit tunggal yang muncul setelahnyaR
Saya membuat komitmen kembali dan menghancurkan mereka bersama
Selama labu rebase interaktif 2 komit terakhir.
sumber
Jawaban rado dan kareem tidak melakukan apa pun untuk saya (hanya pesan "Cabang saat ini yang terbaru." Muncul). Mungkin ini terjadi karena simbol '^' tidak berfungsi di konsol Windows. Namun, menurut komentar ini , mengganti '^' dengan '~ 1' memecahkan masalah.
sumber