178 votes

Git rebase --continue se plaint même lorsque tous les conflits de fusion ont été résolus.

Je suis confronté à un problème que je ne sais pas comment résoudre.

J'ai fait un rebasement sur master à partir de ma branche :

git rebase master

et j'ai obtenu l'erreur suivante

 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.

J'ai donc utilisé mon éditeur favori, corrigé le conflit d'une ligne, sauvegardé le fichier et fait un statut git pour obtenir le résultat suivant :

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

J'ai fait un git add AssetsLoader.java et un git status et j'ai obtenu ce qui suit :

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

et quand j'ai fait git rebase --continue j'ai obtenu :

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

Je sais que je peux sauter le patch et continuer le rebasement, mais je ne suis pas sûr que les changements dans PassengerContactHandler.java seront rebasés dans ma branche ou pas.

Je ne suis donc pas sûr, comment dois-je procéder ?

Edit : Se pourrait-il que le fichier avec le conflit résolu soit exactement comme la version originale ?

Merci beaucoup, Lucas

Edit, ça vient de m'arriver à nouveau :

Ça vient de m'arriver à nouveau,

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

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

git --version

git version 1.7.1

4voto

Batkins Points 2482

Essayez d'exécuter ceci dans votre ligne de commande :

$ git mergetool

Cela devrait faire apparaître un éditeur interactif vous permettant de résoudre les conflits. C'est plus facile que d'essayer de le faire manuellement, et en plus git reconnaîtra quand vous faites la fusion. Cela évitera également les situations où vous ne fusionnez pas complètement par accident, ce qui peut arriver lorsque vous essayez de le faire manuellement.

4voto

carpii Points 851

Je viens d'avoir ce problème, et même si je pense qu'il peut y avoir plusieurs causes, voici la mienne...

J'avais un hook git pre-commit qui rejetait les commits sous certaines conditions. Cela ne pose pas de problème lors d'un commit manuel, puisque le résultat du hook est affiché, et je peux soit le corriger, soit choisir de l'ignorer en utilisant commit --no-verify.

Le problème semble être que lors d'un rebasement, rebase --continue appelle également le hook (afin de valider la dernière série de modifications). Mais rebase n'affichera pas la sortie du hook, il verra juste qu'il a échoué, et sortira une erreur moins spécifique disant 'Vous devez éditer tous les conflits de fusion et ensuite les marquer comme résolus en utilisant git add'.

Pour le corriger, mettez en scène tous vos changements, et au lieu de faire 'git rebase --continue', essayez un 'git commit'. Si vous souffrez du même problème de hook, vous devriez alors voir les raisons de son échec.

Il est intéressant de noter que si git rebase n'affiche pas la sortie de git hook, il accepte un --no-verify pour contourner les hooks.

3voto

Ether Points 34103

Vous avez manqué un conflit de fusion dans AssetsLoader.java. Ouvrez-le et recherchez les marqueurs de conflit (">>>>", "====", "<<<<<"), puis refaites git add. Faites un 'git diff --staged' si vous avez des difficultés à le trouver.

1voto

Ghislain Points 61

Je viens de tomber sur le problème. Je ne voudrais pas git rebase --skip parce que git status montrent clairement des modifications du cerf, que je voulais garder. Cependant, j'ai eu quelques fichiers supplémentaires qui sont arrivés de manière inattendue. Je les ai résolus avec

git checkout .

pour supprimer les modifications non marquées, puis git rebase --continue réussi.

1voto

Robin Green Points 12926

Si vous utilisez magit (un frontal emacs populaire pour git), ce message d'erreur peut être affiché en raison d'un bogue obscur dans magit. Je ne suis pas exactement sûr de ce qui déclenche ce bogue, mais pour moi, c'est que seules les fins de lignes ont été modifiées pour un fichier, et donc magit n'a pas affiché le fichier comme un conflit. Je pensais donc qu'il n'y avait plus de conflits, mais c'était le cas. Exécution de git status en ligne de commande m'a permis de voir le fichier en conflit, et j'ai pu alors exécuter git add nom de fichier y luego git rebase --continue .

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X