Konflik gabungan git rebase tidak dapat dilanjutkan

131

Saya mencoba untuk rebase 'dev' untuk mengejar cabang 'master'.

$ git checkout dev 
$ git rebase master 
First, rewinding head to replay your work on top of it...
Applying: Corrected compilation problems that came from conversion from SVN.
Using index info to reconstruct a base tree...
M       src/com/....
<stdin>:125: trailing whitespace.
/**
<stdin>:126: trailing whitespace.
 *
<stdin>:127: trailing whitespace.
 */
<stdin>:128: trailing whitespace.
package com....
<stdin>:129: trailing whitespace.

warning: squelched 117 whitespace errors
warning: 122 lines add whitespace errors.
Falling back to patching base and 3-way merge...
Auto-merging src/com/....
CONFLICT (content): Merge conflict in src/com/...
Failed to merge in the changes.
Patch failed at 0001 Corrected compilation problems that came from conversion from SVN.

When you have resolved this problem run "git rebase --continue".
If you would prefer to skip this patch, instead run "git rebase --skip".
To check out the original branch and stop rebasing run "git rebase --abort".

$ vi src/com/.....   { fixed the merge issue on one file } 
$ git add -A . 
$ git rebase --continue 
src/com/....: needs merge
You must edit all merge conflicts and then
mark them as resolved using git add
$ vi src/com....      { verified, no >>> or <<< left, no merge markers } 
$ git rebase --continue 
Applying: Corrected compilation problems that came from conversion from SVN.
No changes - did you forget to use 'git add'?
If there is nothing left to stage, chances are that something else
already introduced the same changes; you might want to skip this patch.

When you have resolved this problem run "git rebase --continue".
If you would prefer to skip this patch, instead run "git rebase --skip".
To check out the original branch and stop rebasing run "git rebase --abort".

Ada ide?

awm
sumber
Catatan: ada beberapa kasus di mana a git rebase --skipmasih tidak dapat berfungsi dengan baik. Hingga Git 2.0.2 (Juli 2014). Lihat jawaban saya di bawah ini
VonC

Jawaban:

223

Ada beberapa situasi di mana saya pernah melihat rebasemacet. Salah satunya adalah jika perubahan menjadi nol (komit memiliki perubahan yang sudah dibuat sebelumnya dalam rebase) dalam hal ini Anda mungkin harus menggunakangit rebase --skip .

Cukup mudah untuk mengatakannya. Jika Anda melakukannya, git statustidak akan ada perubahan. Jika demikian lewati saja. Jika bukan itu masalahnya, silakan kirim salinannya git statusdan saya dapat mencoba membantu lebih lanjut.

Chris Nicola
sumber
Tidak itu, ada perubahan "tidak" karena. Saya melewatkannya dan membandingkan file itu setelah itu seharusnya.
awm
Ini membantu saya ketika 'git pull --rebase origin master' saya tampaknya terjebak dalam lingkaran antara kebutuhan untuk menyelesaikan konflik dan melompat. Setelah sedikit lebih sabar, saya diperbaiki, ty!
AnneTheAgile
3
git status mengembalikan: "rebase sedang berlangsung; ke <commitnumber> Anda saat ini rebasing cabang '<branchname>' on '<commitnumber>'. (semua konflik tetap: jalankan" git rebase --continue ")". git rebase --continue mengembalikan tidak ada perubahan sedangkan git rebase --skip lakukan tetapi dalam kasus saya saya mendapatkan situasi itu lagi dan lagi. Apakah itu benar atau ada yang salah?
adi
Terima kasih. Saya khawatir --skipakan melakukan lebih buruk daripada hanya melanjutkan dengan perubahan yang saya buat.
jchook
Dalam kasus saya baik Intellij Idea GUI dan SourceTree menunjukkan bahwa setiap file ditambahkan ke dalam komit, sedangkan git statusmenunjukkan, bahwa ada file yang dimodifikasi, tetapi tidak ditambahkan ke dalam komit. Performing add somefile.txtdiizinkan untuk melanjutkan rebasing.
azizbekian
16

Salah satu kali saya mengalami masalah ini adalah ketika melakukan git commitsetelah git add. Jadi, urutan berikut akan menghasilkan kesalahan rebase yang Anda sebutkan:

git add <file with conflict>
git commit -m "<some message>"
git rebase --continue

Sementara, urutan di bawah ini berjalan tanpa kesalahan, dan melanjutkan rebase:
git add <file with conflict>
git rebase --continue

Mungkin saja bahwa git add -Adengan opsi "Semua" menciptakan situasi yang serupa. (Harap dicatat, saya sangat tidak berpengalaman dalam git, jadi jawaban ini mungkin tidak benar.) Untuk amannya, git rebase --skipsepertinya juga berfungsi dengan baik dalam situasi ini.

Steve Reed
sumber
6

Catatan: Git 2.0.2 (Juli 2014) telah memperbaiki satu kasus di mana a git rebase --skipakan macet dan tidak akan dapat melanjutkan dengan rebase saat ini.
Lihat komit 95104c7 oleh brian m. carlson ( bk2204)

rebase--merge: perbaiki --skipdengan dua konflik berturut-turut

Jika git rebase --mergemenemui konflik, --skiptidak akan berhasil jika komit berikutnya juga bertentangan .
The msgnumfile yang tidak akan pernah diperbarui dengan jumlah patch yang baru, sehingga tidak ada patch akan benar-benar dilewati, sehingga loop tak terhindarkan.

Perbarui nilai msgnumfile sebagai hal pertama di call_merge.
Ini juga " Already applied" menghindari pesan ketika melewatkan komit.
Tidak ada perubahan yang terlihat untuk konteks lain di mana call_merge dipanggil, karena nilai file msgn tetap tidak berubah dalam situasi tersebut.

VONC
sumber
3
$ vi src/com....      { verified, no >>> or <<< left, no merge markers } 
$ git rebase --continue 

Sepertinya Anda lupa dengan git addperubahan Anda ...

John Brodie
sumber
Itu hanya "verifikasi" tidak ada perubahan yang diperlukan untuk kedua kalinya ... git add tepat di atasnya.
awm
Benar, Anda menggunakan git adddan kemudian melanjutkan penggabungan, dan berhenti karena file lain mengalami konflik, jadi Anda harus memperbaikinya juga. Apakah saya melewatkan sesuatu di sini?
John Brodie
1
Ini adalah file yang sama yang melaporkan penggabungan kebutuhan. ok hanya untuk Anda, saya akan melakukan "git add" yang lain, tetapi hasilnya sama.
awm
Terima kasih! Itulah situasi saya: Saya menyelesaikan konflik tetapi tidak melakukan perubahan.
Kirill