it-swarm-pt.tech

Git rebase --continue reclama mesmo quando todos os conflitos de mesclagem foram resolvidos

Estou enfrentando um problema que não sei ao certo como resolver.

Fiz uma rebase contra o mestre do meu ramo:

git rebase master

e obteve o seguinte erro

 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.

Então, fui ao meu editor favorito, corrigi o conflito de 1 linha, salvei o arquivo e fiz um status de git e obtive a seguinte saída:

 # 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
 #

Eu fiz um git adicionar AssetsLoader.Java e um status git e obtive o seguinte:

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

e quando git rebase --continue, recebo:

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

Sei que posso pular o patch e continuar a rebase, mas não tenho certeza se as alterações no PassengerContactHandler.Java serão rebaseadas na minha ramificação ou não.

então não tenho certeza, como devo proceder?

Editar: pode ser que o arquivo com o conflito resolvido seja exatamente igual à versão original?

Muito obrigado Lucas

Editar, aconteceu comigo novamente:

Aconteceu comigo de novo,

(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 --continuar

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

git --version

git version 1.7.1
82
Lucas

Isso acontece porque, ao corrigir um conflito, você removeu todo o código do patch aplicado à ramificação na qual está reestruturando. Use git rebase --skip para continuar.

m pouco mais detalhes:

Normalmente, ao corrigir um conflito durante a reformulação, você edita o arquivo conflitante, mantendo parte ou todo o código do patch atualmente sendo aplicado à ramificação na qual você revisa. Depois de consertar o patch e fazer

git add your/conflicted/file
git status

você receberá uma linha (geralmente verde) mostrando o arquivo modificado

modificado: seu/conflito/arquivo

git rebase --continue funcionará bem nessa situação.

Às vezes, no entanto, ao resolver o conflito, você remove tudo do seu novo patch, mantendo apenas o código da ramificação na qual você rebatizou. Agora, quando você adiciona o arquivo, ele será exatamente igual ao que você tentou refazer. O status git não mostrará nenhuma linha verde exibindo os arquivos modificados. Agora, se você fizer

git rebase --continue

git vai reclamar com

Sem alterações - você esqueceu de usar o 'git add'?

O que o git realmente quer que você faça nessa situação é usar

git rebase --skip

para pular o patch. Anteriormente, eu nunca fazia isso, pois estava sempre insegura sobre o que realmente seria ignorado se o fizesse, não era óbvio para mim o que "ignorar esse patch" realmente significava. Mas se você não receber uma linha verde com

modificado: seu/conflito/arquivo

depois de editar o arquivo em conflito, adicioná-lo e executar o status git, você pode ter certeza de que removeu todo o patch e pode usar

git rebase --skip

continuar.

O post original dizia que isso às vezes funciona:

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

... mas não confie nisso (e certifique-se de não adicionar os arquivos restantes nas pastas do repositório)

89
jonasfh

Parece ser um bug no Git 1.7

Aqui está um bom artigo sobre como resolver isso .

Basicamente, deve funcionar, se você fizer um

git diff

depois de resolver seus conflitos e depois

git rebase --continue

deveria trabalhar.

19
acme

Tente executar isso na sua linha de comando:

$ git mergetool

Deve abrir um editor interativo, permitindo que você resolva os conflitos. Mais fácil do que tentar fazer isso manualmente, e o git também reconhecerá quando você fizer a mesclagem. Também evitará situações nas quais você não se une totalmente por acidente, que pode acontecer quando você tenta fazer isso manualmente.

4
Batkins

Acabei de ter esse problema e, embora eu ache que possa haver algumas causas, aqui está a minha ...

Eu tinha um gancho de pré-confirmação do git que rejeitava confirmações sob certas condições. Isso é bom ao confirmar manualmente, pois ele exibirá a saída do gancho, e eu posso corrigi-lo ou optar por ignorá-lo usando o commit --no-verifique.

O problema parece ser que, ao rebasear, rebase --continue também chamará o gancho (a fim de confirmar o último ataque de mudanças). Mas o rebase não exibirá a saída do gancho, apenas verá que falhou e, em seguida, emitiu um erro menos específico dizendo 'Você deve editar todos os conflitos de mesclagem e marcá-los como resolvidos usando git add'.

Para corrigi-lo, prepare todas as suas alterações e, em vez de fazer 'git rebase --continue', tente um 'git commit'. Se você está sofrendo do mesmo problema de gancho, deve ver as razões pelas quais está falhando.

Curiosamente, embora o git rebase não exiba a saída do git hook, ele aceita um --no-verifique para ignorar os ganchos.

4
carpii

Você perdeu um conflito de mesclagem no AssetsLoader.Java. Abra-o e procure marcadores de conflito (">>>>", "====", "<<<<<") e git add novamente. Faça um 'git diff - stage' se estiver tendo dificuldades para encontrá-lo.

3
Ether

Após corrigir o conflito, verifique se os arquivos alterados foram adicionados aos seus arquivos temporários. Isso resolveu o problema para mim.

2
primulaveris