Bagaimana cara mengembalikan rentang komit di git? Dari melihat dokumentasi gitrevision , saya tidak dapat melihat cara menentukan kisaran yang saya butuhkan. Sebagai contoh:
A -> B -> C -> D -> E -> HEAD
Saya ingin melakukan hal yang setara dengan:
git revert B-D
dimana hasilnya adalah:
A -> B -> C -> D -> E -> F -> HEAD
di mana F berisi kebalikan dari BD inklusif.
Jawaban:
Versi Git apa yang Anda gunakan?
Mengembalikan beberapa commit hanya didukung di Git1.7.2 +: lihat " Rollback ke commit lama menggunakan pengembalian beberapa kali. " Untuk detail selengkapnya. Halaman manual
saat ini hanya untuk versi Git saat ini (1.7.4+).
git revert
Seperti yang dilaporkan OP Alex Spurling di komentar:
Mengupgrade ke 1.7.4 berfungsi dengan baik.
Untuk menjawab pertanyaan saya sendiri, inilah sintaks yang saya cari:
B^
berarti "komit orang tua pertama dari B": yang memungkinkan untuk disertakanB
dalam pengembalian.Lihat "
git rev-parse
MENENTUKAN bagian REVISI " yang menyertakan sintaks<rev>^
, misalnyaHEAD^
: lihat lebih lanjut di " Apa arti karakter tanda sisipan (^
)? ")Perhatikan bahwa setiap komit yang dikembalikan dilakukan secara terpisah.
Henrik N mengklarifikasi di komentar :
Seperti yang ditunjukkan di bawah ini, Anda dapat kembali tanpa langsung melakukan:
sumber
git revert OLDER_COMMIT^..NEWER_COMMIT
^
ke parameter revisi berarti induk pertama dari objek commit itu".Jika Anda ingin mengembalikan rentang komit B ke D (setidaknya dalam git versi 2) dalam satu komit, Anda dapat melakukannya
Ini mengembalikan perubahan yang dilakukan oleh komit dari komit induk B (dikecualikan) ke komit D (disertakan), tetapi tidak membuat komit apa pun dengan perubahan yang dikembalikan. Kembalikan hanya mengubah pohon kerja dan indeks.
Jangan lupa untuk melakukan perubahan setelahnya
Anda juga dapat mengembalikan beberapa komit yang tidak terkait dalam satu komit, menggunakan metode yang sama. misalnya untuk mengembalikan B dan D tetapi bukan C
Referensi: https://www.kernel.org/pub/software/scm/git/docs/git-revert.html
Terima kasih Honza Haering atas koreksinya
sumber
git revert -n B..D
tidak mengembalikan commit B, hanya C dan D.git revert -n B^..D
juga mengembalikan B.git revert -n master~5..master~2
:, dikatakan komit terbaru kelima disertakan. Tapimaster~5
sebenarnya komit terbaru ke-6. Lihat pilihan revisi di dokumen git untuk info rinci tentang..
notasi :-)Melakukan
git revert OLDER_COMMIT^..NEWER_COMMIT
tidak berhasil untuk saya.Saya menggunakan
git revert -n OLDER_COMMIT^..NEWER_COMMIT
dan semuanya baik-baik saja. Saya menggunakan versi git1.7.9.6
.sumber
-n
atau--no-commit
pilihan akan mengembalikan semua perubahan di kisaran di satu komit, bukan menciptakan revert komit untuk setiap komit dalam kisaran. Hasil akhirnya sama, perubahan yang sama akan dikembalikan. Tergantung bagaimana Anda ingin histori git Anda terlihat.Gunakan
git rebase -i
untuk memadatkan komitmen yang relevan menjadi satu. Kemudian Anda hanya memiliki satu komitmen untuk kembali.sumber