Git rebase - melanjutkan keluhan bahkan ketika semua konflik penggabungan telah diselesaikan

115

Saya menghadapi masalah yang saya tidak yakin bagaimana menyelesaikannya.

Saya melakukan rebase terhadap master dari cabang saya:

git rebase master

dan mendapatkan kesalahan berikut

 First, rewinding head to replay your work on top of it...
 Applying: checkstyled.
 Using index info to reconstruct a base tree...
 Falling back to patching base and 3-way merge...
 Auto-merging AssetsLoader.java
 CONFLICT (content): Merge conflict in AssetsLoader.java
 Failed to merge in the changes.
 Patch failed at 0001 checkstyled.

Jadi saya pergi ke editor favorit saya, memperbaiki konflik 1 baris, menyimpan file dan melakukan status git dan mendapatkan output berikut:

 # Not currently on any branch.
 # Changes to be committed:
 #   (use "git reset HEAD <file>..." to unstage)
 #
 #  modified:   PassengerContactHandler.java
 #
 # Unmerged paths:
 #   (use "git reset HEAD <file>..." to unstage)
 #   (use "git add/rm <file>..." as appropriate to mark resolution)
 #
 #  both modified:      AssetsLoader.java
 #

Saya melakukan git add AssetsLoader.java dan status git dan mendapatkan yang berikut:

 # Not currently on any branch.
 # Changes to be committed:
 #   (use "git reset HEAD <file>..." to unstage)
 #
 #  modified:   AssetsLoader.java
 #  modified:   PassengerContactHandler.java
 #

dan ketika saya melakukan git rebase - lanjutkan saya mendapatkan:

git rebase --continue
You must edit all merge conflicts and then
mark them as resolved using git add

Saya tahu saya bisa melewati patch dan melanjutkan rebase, tapi saya tidak yakin apakah perubahan di PassengerContactHandler.java akan di-rebase ke cabang saya atau tidak.

jadi saya tidak yakin, Bagaimana saya harus melanjutkan?

Sunting: Mungkinkah file dengan konflik yang diselesaikan persis seperti versi aslinya?

Terima kasih banyak, Lucas

Sunting, itu baru saja terjadi pada saya lagi:

Itu baru saja terjadi pada saya lagi,

(307ac0d...)|REBASE)$ git status
# Not currently on any branch.
# Changes to be committed:
#   (use "git reset HEAD <file>..." to unstage)
#
#   modified:   assets/world/level1/Level-1.xml
#   modified:   George.java
#   modified:   DefaultPassenger.java
#
# Untracked files:
#   (use "git add <file>..." to include in what will be committed)
#
#   mb-art/originalAssets/27dec/

((307ac0d ...) | REBASE) $ git rebase - lanjutkan

You must edit all merge conflicts and then
mark them as resolved using git add

git --version

git version 1.7.1
Lucas
sumber
Itu hasil penuh git status, bukan? Tidak ada bagian yang hilang di bawahnya?
Kaskabel
git-rebasetidak boleh melaporkan bahwa ada konflik yang belum terselesaikan jika tidak ada. Jika Anda dapat mereproduksi masalah dalam kasus uji yang lebih sederhana, akan lebih mudah untuk men-debug, tetapi tetap saja, jika Anda git statustidak melaporkan konflik saat git rebase --continuemelakukannya, dan versi Git Anda saat ini, Anda dapat mencoba mengirim email ke Git dev milis di [email protected] dengan informasi diagnostik sebanyak yang Anda bisa.
Cascabel
1
Itu baru saja terjadi pada saya lagi, (307ac0d ...) | REBASE) $ git status # Saat ini tidak ada di cabang mana pun. # Perubahan yang harus dilakukan: # (gunakan "git reset HEAD <file> ..." ke unstage) # # diubah: assets / world / level1 / Level-1.xml # diubah: George.java # diubah: DefaultPassenger.java # # File yang tidak dilacak: # (gunakan "git add <file> ..." untuk disertakan dalam apa yang akan dilakukan) # # mb-art / originalAssets / 27dec /
Lucas
Saya pikir Anda harus menggunakan GITKRAKEN, ini akan membantu Anda dalam menyelesaikan konflik Anda
Nikhil Bhardwaj

Jawaban:

115

Hal ini terjadi karena saat memperbaiki konflik, Anda menghapus semua kode dalam tambalan yang diterapkan ke cabang tempat Anda melakukan rebasing. Gunakan git rebase --skipuntuk melanjutkan.

Sedikit lebih detail:

Biasanya, saat memperbaiki konflik selama rebasing, Anda akan mengedit file yang bentrok, menyimpan beberapa atau semua kode dalam tambalan yang saat ini sedang diterapkan ke cabang tempat Anda melakukan rebase. Setelah memperbaiki tambalan dan melakukan

git add your/conflicted/file
git status

Anda akan mendapatkan baris (biasanya hijau) yang menunjukkan file yang dimodifikasi

diubah: Anda / konflik / file

git rebase --continue akan berfungsi dengan baik dalam situasi ini.

Namun, terkadang, saat menyelesaikan konflik, Anda menghapus semua yang ada di tambalan baru Anda, hanya menyimpan kode dari cabang tempat Anda menjadi basis. Sekarang ketika Anda menambahkan file, itu akan persis seperti yang Anda coba rebase. Status git tidak akan menunjukkan garis hijau yang menampilkan file yang dimodifikasi. Sekarang, jika Anda melakukannya

git rebase --continue

git akan mengeluh

Tidak ada perubahan - apakah Anda lupa menggunakan 'git add'?

Apa yang sebenarnya ingin Anda lakukan dalam situasi ini adalah menggunakan

git rebase --skip

untuk melewati tambalan. Sebelumnya saya tidak pernah melakukan ini, karena saya selalu tidak yakin apa yang sebenarnya akan dilewati jika saya melakukannya, tidak jelas bagi saya apa arti sebenarnya "lewati tambalan ini". Tetapi jika Anda tidak mendapatkan garis hijau dengan

diubah: Anda / konflik / file

setelah mengedit file yang konflik, menambahkannya, dan melakukan status git, maka Anda dapat yakin telah menghapus seluruh tambalan, dan Anda dapat menggunakan

git rebase --skip

untuk melanjutkan.

Posting asli mengatakan ini terkadang berfungsi:

git add -A
git rebase --continue
# works magically?

... tapi jangan mengandalkan ini (dan pastikan untuk tidak menambahkan file sisa di folder repositori Anda)

jonasfh
sumber
1
Saya sepertinya memiliki masalah yang sama dan solusi yang sama, juga tampak ajaib!
bspink
Saya memiliki masalah yang sama, sepertinya jika Anda melakukan refaktorisasi di cabang rebased dan menambahkan file baru, dan kemudian proses resolusi penggabungan membuat perubahan pada file baru tersebut, Anda perlu menambahkannya lagi secara eksplisit.
Ibrahim
Jangan lakukan ini kecuali Anda ingin melacak semua file sampah ke repo Anda.
Jed Lynch
git add ...menjadi sangat menjengkelkan untuk mengetik setelah mengubah tumpukan file dengan jalur yang panjang. Apakah ada yang git add --all-the-files-i-changedbisa saya jalankan sebelumnya git rebase continue?
jozxyqk
3
Untuk berhati-hati saat menggunakan perintah git rebase --skip, Anda mungkin kehilangan pekerjaan (file yang diedit)
Youness Marhrani
8

Saya mendapat peringatan ini ketika saya memiliki file yang tidak diatur. Pastikan Anda tidak memiliki file yang tidak diatur. Jika Anda tidak ingin file tidak bertahap berubah, buang perubahan dengan

git rm <filename>  
ScottyBlades
sumber
2
Sederhananya, ini bisa menjadi komentar; sangat membantu itu harus menjadi jawaban. Terima kasih!
Lucas Lima
4

Coba jalankan ini di baris perintah Anda:

$ git mergetool

Harus memunculkan editor interaktif yang memungkinkan Anda menyelesaikan konflik. Lebih mudah daripada mencoba melakukannya secara manual, dan juga git akan mengenali saat Anda melakukan penggabungan. Juga akan menghindari situasi di mana Anda tidak sepenuhnya bergabung secara tidak sengaja yang dapat terjadi ketika Anda mencoba melakukannya secara manual.

Batkins
sumber
Hanya memikirkan itu mungkin lebih mudah dan juga akan memungkinkan Anda untuk menghindari situasi seperti ini di masa depan.
Batkins
1
Anda menyelamatkan malam saya. Meskipun ini alat yang sederhana, tetapi saya tidak akan pernah bisa menemukan cara untuk menyelesaikan konflik saya tanpa alat ini.
eonil
4

Setelah menyelesaikan konflik, pastikan file yang diubah ditambahkan ke file bertahap Anda. Ini memecahkan masalah saya.

primulaveris
sumber
Ini melakukan trik untuk saya. Saya memeriksa Sourcetree setelah mendapatkan pesan yang dijelaskan di OP, dan segera melihat dua file yang disebutkan di jendela perintah di sana sebagai tidak bertahap. Pementasan file, jalankan "git rebase --continue" dan saya kembali ke jalurnya.
Mass Dot Net
3

Anda melewatkan konflik penggabungan di AssetsLoader.java. Buka dan cari penanda konflik (">>>>", "====", "<<<<<") lalu lakukan git add lagi. Lakukan 'git diff --staged' jika Anda kesulitan menemukannya.

Eter
sumber
3
Saya melakukan grep pada semua file yang dilacak dan tidak ada penanda konflik.
Lucas
Apakah git diff --stagedmengungkapkan sesuatu yang berguna? Ini menunjukkan perubahan mana yang akan Anda lakukan untuk menyelesaikan konflik penggabungan pada saat ini di rebase. Harus ada "Ups, bukan itu yang ingin saya lakukan untuk menyelesaikan" bit ini di salah satu file.
Eter
4
Git tidak mencari penanda konflik gabungan saat Anda mencoba melanjutkan. Itu hanya memeriksa untuk melihat bahwa indeks dalam keadaan bersih. Jika Anda mementaskan file yang masih memiliki penanda konflik di dalamnya, Anda mengindikasikan bahwa Anda ingin melakukannya dengan mereka di dalamnya. Itu mungkin selalu salah, tapi itu akan membiarkan Anda melakukannya.
Cascabel
@Ether ini bukan alasan sama sekali. Anda dapat git addmembuat file bahkan dengan penanda konflik di dalamnya. Bagaimanapun, file semacam itu mungkin legal!
fge
@Jefromi: a ha, senang mengetahuinya! Saya selalu berasumsi bahwa spidolnya diperiksa, dan seseorang harus - memaksakan melewatinya jika disengaja.
Eter
3

Saya baru saja mengalami masalah ini, dan sementara saya pikir mungkin ada beberapa penyebab, inilah penyebab saya ...

Saya memiliki hook pra-komit git yang menolak komit dalam kondisi tertentu. Ini baik-baik saja saat melakukan secara manual, karena ini akan menampilkan keluaran dari hook, dan saya dapat memperbaikinya atau memilih untuk mengabaikannya menggunakan commit --no-verifikasi.

Masalahnya adalah ketika rebasing, rebase --continue juga akan memanggil hook (untuk melakukan perubahan terakhir). Tetapi rebase tidak akan menampilkan output hook, itu hanya akan melihat bahwa itu gagal, dan kemudian mengeluarkan kesalahan yang kurang spesifik yang mengatakan 'Anda harus mengedit semua konflik penggabungan dan kemudian menandainya sebagai diselesaikan menggunakan git add'

Untuk memperbaikinya, lakukan tahapan semua perubahan Anda, dan alih-alih melakukan 'git rebase --continue', coba 'git commit'. Jika Anda menderita masalah hook yang sama, Anda harus melihat alasan mengapa gagal.

Menariknya, meskipun git rebase tidak menampilkan keluaran dari git hook, ia menerima --no-verifikasi untuk melewati hook.

carpii
sumber
1
Saya memiliki masalah serupa. Tidak ada hal lain di sini yang berhasil untuk saya, tetapi hanya melakukan 'git commit' dan kemudian membatalkan tampaknya secara ajaib menyelesaikan apa pun ketidaksesuaian yang ada, dan kemudian saya berhasil 'git rebase - melanjutkan'.
patrickvacek
Sebagai catatan, karena saya telah berjuang dengan masalah serupa baru-baru ini, saya git rebasemenerima --no-verifyopsi. Namun, ini hanya menghilangkan pre-rebasehook, tetapi opsi ini tidak diterapkan pada panggilan berikutnya ke git commit.
pkrysiak
Berisi poin yang valid (lakukan perubahan) tetapi terlalu panjang untuk jawaban yang bagus.
Jack Miller
2

Setelah Anda memperbaiki perubahan Anda, Anda mungkin lupa menjalankan 'git add -A'

git add -A
git rebase --continue
gsalgadotoledo
sumber
1

Saya baru saja tersandung pada masalah ini. Saya tidak akan git rebase --skip karena git statusjelas menunjukkan modifikasi stagged, yang ingin saya pertahankan. Meskipun saya memiliki beberapa file tambahan yang datang secara tidak terduga. Saya diselesaikan dengan

git checkout .

untuk menghapus modifikasi tak bertanda, lalu git rebase --continueberhasil.

Ghislain
sumber