Saya telah mengubah basis cabang secara lokal yang sudah didorong.
Git menyarankan bahwa cabang dan remote saya telah menyimpang dan bahwa:
"dan masing-masing memiliki 109 dan 73 komit yang berbeda"
Akankah mendorong cabang saya menyelesaikan ini - yaitu apakah ini yang diharapkan setelah rebase?
Jawaban:
Saat Anda me-rebase sebuah cabang, Anda harus menulis ulang komit untuk komit apa pun yang berada di atas komit di cabang tempat Anda melakukan rebasing. Ini karena salah satu properti komit adalah induknya (atau orang tuanya). Saat Anda melakukan rebase, Anda mengubah induk dari komit lokal terlama di cabang Anda - dan dengan demikian mengubah hash komit dari semua komit lokal Anda, karena perubahan ini menggelembung melalui komit secara transitif.
Karena Anda sudah mendorong cabang tersebut, Anda seharusnya telah menggabungkan di cabang sumber, daripada melakukan rebasing terhadapnya. Dimungkinkan untuk "memaksa mendorong" cabang baru Anda (menggunakan
-f
bendera), tetapi dorongan normal tidak akan berfungsi, karena integritas riwayat cabang akan terganggu. Jika Anda berkolaborasi dengan orang lain di cabang ini, memaksa mendorong adalah ide yang buruk, karena akan menyebabkan kolaborator lain menjadi sangat bingung ketika riwayat mereka tiba-tiba tidak cocok.TL; DR - Jika Anda tidak berkolaborasi, dorong cabang menggunakan push -f. Jika ya, setel ulang cabang ke keadaan sebelumnya, dan gabungkan di cabang sumber sebagai gantinya.
sumber
Semua komitmen Anda telah berubah id, jadi pengalihannya tidak benar - benar menyimpang.
Untuk menyelesaikan masalah Anda, Anda harus menimpa cabang jarak jauh Anda:
http://git-scm.com/book/ch3-6.html
Penjelasan:
Lihat bagaimana di gambar ini C3 tidak diletakkan sebagai C3 setelah rebase, tetapi sebagai C3 '. Ini karena ini bukan C3, tetapi semua kodenya berubah.
Pada gambar lain ini Anda mendapatkan gambaran tentang apa yang dilihat rebase ketika remote terlibat, dan mengapa ada pengalihan.
Bagaimanapun, setelah Anda melakukan dorongan paksa, itu akan memberi tahu Anda bahwa itu melakukan (pembaruan paksa), Anda seharusnya baik-baik saja pada saat itu.
Lihat link di atas, dan cari "git push --force". Anda akan melihat penjelasan yang lebih detail.
sumber
Saya berhasil dengan penyimpangan rebase untuk dorongan dengan melakukan hal berikut:
Tarikan menyelesaikan perbedaan.
SEBELUM menariknya
Keluaran TARIK
SETELAH menarik
SETELAH PUSH
Saya berasumsi ini mungkin yang dilakukan oleh dorongan paksa, dan saya belum memverifikasi.
Seperti yang dikatakan orang lain, hindari rebase jika Anda sudah memiliki permintaan tarik terbuka. Saya memberikan contoh ini sebagai sesuatu yang berhasil untuk saya.
sumber
Ini bisa diperbaiki tanpa dorongan paksa dengan melakukan rebasing cabang target ke cabang lokal Anda saat ini, beralih ke cabang target Anda, lalu rebasing cabang lokal Anda ke target. Ini tidak menyimpang sejak komit yang mungkin hilang ditambahkan dan tidak perlu dibuat lagi. Contoh penjelasan lebih mudah:
Jika Anda BELUM memperbarui cabang pengembangan Anda, maka "git checkout develop" && "fitur git rebase / doing_stuff" akan bekerja dengan benar karena tidak ada komit yang ditambahkan sejak pembayaran Anda. Namun, jika Anda telah memeriksa pengembangan dan menarik komitmen baru, maka Anda akan melihat perbedaan ini jika Anda mencoba melakukan rebase karena komitmen baru terlihat. Perbaikan yang mudah tanpa memaksa memaksa (biasanya bukan ide yang baik dalam lingkungan tim) adalah dengan:
Rebase dari langkah 2 membawa komit yang hilang ke dalam fitur / doing_stuff jadi ketika langkah 4 muncul, itu adalah yang terbaru dan tidak perlu membuat komit baru untuk perubahan.
Ini adalah solusi yang saya tahu berfungsi karena saya baru saja mengalami ini dan melakukan langkah-langkah di atas untuk berhasil mendorong pengembangan tanpa memaksa. Saya bekerja dalam tim yang terdiri lebih dari 50 pengembang sehingga dilarang memaksa mendorong apa pun selain cabang pengujian saya sendiri, jadi saya harus menemukan resolusi.
sumber