Apa sebenarnya yang dilakukan git rebase --skip?

107

Saya baru saja melakukan git pull --rebase origin masterdan ada konflik.

Pertama, konflik ini ada di file yang belum saya sentuh, dan sekitar 10 komit kembali. Mengapa ini terjadi?

Saya kemudian tidak sengaja mengetik git rebase --skip, dan 'melewatkan tambalan itu'.

Khawatir saya melewatkan komit, saya memeriksa versi baru dari cabang master dan melakukan perbedaan antara cabang tempat saya melakukan rebase, dan cabang master baru. Satu-satunya perubahan yang muncul di diff adalah komit terbaru, dan melihat log, tambalan yang 'dilewati', muncul di riwayat komit.

Adakah yang bisa menjelaskan apa yang terjadi di sini?

mrwooster
sumber
11
Bagaimana Anda mengetik secara tidak sengaja git rebase --skip. Mungkin salah? :)
manojlds
3
Ha! Dimaksudkan untuk mengetik --abort, tetapi untuk beberapa alasan yang tidak diketahui hasilnya --lewati. Bukankah benar-benar berpikir. :)
mrwooster
9
sejarah shell bagus dalam hal ini (untuk membuat Anda mengeksekusi sesuatu yang tidak Anda inginkan).
Florian Klein

Jawaban:

60

Itu melakukan apa yang dikatakannya, itu melompati komit. Jika Anda menjalankan rebase --abortkonflik selanjutnya selama rebase yang sama, komit yang dilewati juga tentu saja akan dikembalikan.

Jika perubahan Anda sudah ada di upstream, Git tidak akan dapat menerapkan komit Anda (tetapi biasanya harus melewatinya secara otomatis, jika tambalannya sama persis). Komitmen Anda sendiri akan dilewati, tetapi perubahan akan tetap ada di HEAD saat ini, karena sudah diterapkan di bagian hulu.

Anda harus benar-benar memastikan bahwa Anda tidak menghapus perubahan penting dari Anda;) (gunakan reflog untuk kembali ke keadaan sebelum rebase)

rajutan
sumber
4
Jadi mengapa komit masih muncul di log? Dan mengapa komit yang hilang sekarang muncul di diff?
mrwooster
3
Ya, konflik telah diselesaikan di hulu ... untuk beberapa alasan git rebase memunculkan konflik penggabungan lama ... hal lain yang membingungkan saya? ... apakah ini berarti bahwa itu melewatkan konflik, tetapi menerapkan tambalan yang menyelesaikan konflik?
mrwooster
3
Anda melewatkan commit Anda sendiri, yang memiliki perubahan yang sama seperti commit upstream. Anda melewatkan komit Anda, tetapi perubahan masih dilakukan (karena sudah ada di hulu)
knittl
1
@mittal tidak, saya rasa bukan --skipcara untuk pergi. Lewati akan melewatkan komit seluruhnya, membatalkan semua perubahan yang dibuat dalam komit ini.
rajutan
3
@mittal: anggap git rebasesebagai menyalin komitmen dari satu cabang ke cabang lain. Jadi ketika Anda melewatkan komit, konten asli dari komit akan dilewati dan tambalan tidak diterapkan (jadi semua perubahan yang dibuat pada file apa pun tidak akan membuatnya menjadi cabang target Anda). Cara termudah adalah menyiapkan repositori git sederhana dengan dua cabang, beberapa komit pada masing-masing cabang, lalu mencoba melakukan rebase dan melewatkan komit (Anda dapat menggunakan git rebase --interactiveuntuk menentukan komit mana yang akan disalin ( pick) atau dilewati ( skip)
knittl