O conflito de mesclagem do Git rebase não pode continuar


131

Estou tentando rebase 'dev' para alcançar o ramo '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".

Alguma ideia?


Nota: há casos em que um git rebase --skipainda não pode funcionar corretamente. Até o Git 2.0.2 (julho de 2014). Veja minha resposta abaixo
VonC

Respostas:


223

Existem algumas situações em que eu vi rebaseficar preso. Uma é se as alterações se tornarem nulas (uma confirmação possui alterações que já foram feitas anteriormente na rebase). Nesse caso, você pode precisar usar git rebase --skip.

É bem fácil de dizer. Se você o fizer, git statusnão deverá mostrar alterações. Se sim, pule. Se não for esse o caso, envie uma cópia git statuse posso tentar ajudar mais.


Não foi isso, não houve "mudanças" devidas. Eu pulei e comparei o arquivo depois que era o que deveria ter sido.
AWM

Isso me ajudou quando meu 'git pull mestre origem --rebase" apareceu a ficar preso em um loop entre a necessidade de resolver conflitos e ignorar Depois de um pouco mais de paciência, estou fixo, ty.!
AnneTheAgile

3
O status do git retorna: "rebase em andamento; no <commitnumber> Você está refazendo a ramificação '<branchname>' em '<commitnumber>'. (todos os conflitos corrigidos: execute" git rebase --continue ")". O git rebase --continue não retorna alterações, enquanto o git rebase --skip do mas, no meu caso, estou recebendo essa situação repetidamente. Isso está certo ou há algo errado?
adi

Obrigado. Eu estava preocupado --skipque faria pior do que apenas seguir em frente com as alterações que fiz.
jchook

No meu caso, a Intellij Idea GUI e o SourceTree estavam mostrando que cada arquivo foi adicionado ao commit, enquanto git statusmostrou que havia um arquivo que foi modificado, mas não foi adicionado ao commit. A execução add somefile.txtpermitiu continuar com o rebasing.
azizbekian

16

Uma das vezes que encontrei esse problema foi ao fazer um git commitdepois de um git add. Portanto, a seguinte sequência produzirá o erro de rebase mencionado:

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

Enquanto isso, a sequência abaixo é executada sem erros e continua a rebase:
git add <file with conflict>
git rebase --continue

Pode ser possível que, git add -Acom a opção "Todos", esteja criando uma situação semelhante. (Observe que eu sou muito inexperiente no git, portanto, essa resposta pode não estar correta.) Para ser seguro, git rebase --skipparece que também funciona bem nessa situação.


6

Nota: O Git 2.0.2 (julho de 2014) corrigiu um caso em que um git rebase --skipficaria travado e não seria capaz de continuar com a nova atualização atual.
Veja commit 95104c7 de brian m. carlson ( bk2204)

rebase--merge: corrigir --skipcom dois conflitos consecutivos

Se git rebase --mergeencontrasse um conflito, --skipnão funcionaria se o próximo commit também estivesse em conflito .
O msgnumarquivo nunca seria atualizado com o novo número do patch, portanto, nenhum patch seria realmente ignorado, resultando em um loop inevitável.

Atualize o msgnumvalor do arquivo como a primeira coisa em call_merge.
Isso também evita uma " Already applied" mensagem ao pular uma confirmação.
Não há alterações visíveis para os outros contextos nos quais call_merge é chamado, pois o valor do arquivo msgnum permanece inalterado nessas situações.


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

Parece que você esqueceu git addsuas alterações ...


Foi apenas uma "verificação" de que nenhuma alteração foi necessária na segunda vez ... o git add estava logo acima dele.
AWM

Certo, você usou git adde continuou a mesclagem, e parou porque outro arquivo possui conflitos; portanto, você também precisa corrigi-lo. Estou faltando alguma coisa aqui?
precisa

1
É o mesmo arquivo que está relatando precisa ser mesclado. ok só pra você eu vou fazer outro "git add", mas é o mesmo resultado.
AWM

Obrigado! Essa era a minha situação: resolvi conflitos, mas não realizei as mudanças.
Kirill
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.