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

115

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

J'ai fait un rebase contre master de ma branche:

git rebase master

et j'ai 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.

Je suis donc allé dans mon éditeur préféré, j'ai corrigé le conflit d'une ligne, j'ai enregistré le fichier et j'ai fait un état git et j'ai obtenu la sortie suivante:

 # 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 statut git 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 - continuez, j'obtiens:

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

Je sais que je peux ignorer le correctif et continuer le rebase, mais je ne suis pas sûr si les modifications de PassengerContactHandler.java seront rebasées dans ma branche ou non.

donc je ne suis 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 m'est arrivé à nouveau:

Ça m'est arrivé de 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
Lucas
la source
C'est la sortie complète de git status, non? Aucune section manquante en dessous?
Cascabel
git-rebasene devrait jamais signaler qu'il y a des conflits non résolus s'il n'y en a pas. Si vous parvenez à reproduire le problème dans un cas de test plus simple, ce serait beaucoup plus facile à déboguer, mais quand même, si vous ne git statussignalez aucun conflit git rebase --continueet que votre version de Git est actuelle, vous pouvez essayer d'envoyer un e-mail au développeur Git. liste de diffusion à [email protected] avec autant d'informations de diagnostic que possible.
Cascabel
1
Cela m'est arrivé de nouveau, (307ac0d ...) | REBASE) $ git status # Pas actuellement sur aucune branche. # Modifications à valider: # (utilisez "git reset HEAD <file> ..." pour désinstaller) # # modifié: assets / world / level1 / Level-1.xml # modified: George.java # modified: DefaultPassenger.java # # Fichiers non suivis: # (utilisez "git add <file> ..." pour inclure dans ce qui sera validé) # # mb-art / originalAssets / 27dec /
Lucas
Je pense que vous devriez utiliser GITKRAKEN, cela vous aidera à résoudre vos conflits
Nikhil Bhardwaj

Réponses:

115

Cela se produit car lors de la résolution d'un conflit, vous avez supprimé tout le code du correctif appliqué à la branche sur laquelle vous rebasez. Utilisez git rebase --skippour continuer.

Un peu plus de détails:

Normalement, lors de la résolution d'un conflit pendant le rebasage, vous éditerez le fichier en conflit, en conservant tout ou partie du code du correctif actuellement appliqué à la branche sur laquelle vous rebasez. Après avoir réparé le patch et fait

git add your/conflicted/file
git status

vous obtiendrez une ligne (généralement verte) montrant le fichier modifié

modifié: votre / fichier / en conflit

git rebase --continue fonctionnera correctement dans cette situation.

Parfois, cependant, lors de la résolution du conflit, vous supprimez tout dans votre nouveau correctif, ne gardant que le code de la branche sur laquelle vous avez rebasé. Maintenant, lorsque vous ajoutez le fichier, il sera exactement comme celui sur lequel vous avez essayé de rebaser. git status n'affichera aucune ligne verte affichant les fichiers modifiés. Maintenant, si tu fais

git rebase --continue

git se plaindra avec

Aucun changement - avez-vous oublié d'utiliser 'git add'?

Ce que git veut réellement que vous fassiez dans cette situation, c'est d'utiliser

git rebase --skip

pour sauter le patch. Auparavant, je ne faisais jamais cela, comme je n'étais toujours pas sûr de ce qui serait réellement ignoré si je le faisais, ce n'était pas évident pour moi ce que signifiait vraiment «sauter ce patch». Mais si vous n'obtenez pas de ligne verte avec

modifié: votre / fichier / en conflit

après avoir modifié le fichier en conflit, l'ajouter et avoir effectué l'état de git, vous pouvez être à peu près sûr d'avoir supprimé tout le correctif, et vous pouvez à la place utiliser

git rebase --skip

continuer.

Le message original disait que cela fonctionne parfois:

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

... mais ne vous fiez pas à cela (et assurez-vous de ne pas ajouter de fichiers restants dans vos dossiers de référentiel)

Jonasfh
la source
1
Je semblais avoir le même problème et la même solution, cela me semblait aussi magique!
bspink
J'ai eu le même problème, il semble que si vous avez refactoré dans la branche rebasée et ajouté de nouveaux fichiers, puis que le processus de résolution de fusion a apporté des modifications à ces nouveaux fichiers, vous devez explicitement les ajouter à nouveau.
Ibrahim
Ne faites pas cela sauf si vous souhaitez suivre tous les fichiers indésirables dans votre dépôt.
Jed Lynch
git add ...devient vraiment ennuyeux à taper après avoir changé un tas de fichiers avec de longs chemins. Y a-t-il un git add --all-the-files-i-changedje peux courir avant git rebase continue?
jozxyqk
3
Pour être prudent lorsque vous utilisez la commande git rebase --skip, vous risquez de perdre votre travail (fichiers modifiés)
Youness Marhrani
8

J'ai reçu cet avertissement lorsque j'avais des fichiers non mis en scène. Assurez-vous que vous ne disposez d'aucun fichier non organisé. Si vous ne souhaitez pas que les fichiers non créés soient modifiés, supprimez les

git rm <filename>  
ScottyBlades
la source
2
Si simple que cela pourrait être un commentaire; si utile que cela devrait être une réponse. Merci!
Lucas Lima
4

Essayez de l'exécuter dans votre ligne de commande:

$ git mergetool

Devrait faire apparaître un éditeur interactif vous permettant de résoudre les conflits. Plus facile que d'essayer de le faire manuellement, et git reconnaîtra également lorsque vous effectuez la fusion. Évitera également les situations dans lesquelles vous ne fusionnez pas complètement par accident, ce qui peut arriver lorsque vous essayez de le faire manuellement.

Batkins
la source
Je viens de penser que cela pourrait être plus facile et vous permettrait également d'éviter des situations comme celle-ci à l'avenir.
Batkins
1
Vous avez sauvé ma soirée. Bien que ce soit un outil simple, mais je ne pourrais jamais trouver comment résoudre mes conflits sans cet outil.
eonil
4

Après avoir résolu le conflit, assurez-vous que les fichiers modifiés sont ajoutés à vos fichiers intermédiaires. Cela a résolu le problème pour moi.

primulaveris
la source
Cela a fait l'affaire pour moi. J'ai vérifié Sourcetree après avoir reçu le message décrit dans l'OP, et j'ai immédiatement vu les deux fichiers mentionnés dans la fenêtre de commande comme non mis en scène. Mise en scène des fichiers, exécution de "git rebase --continue" et j'étais de retour sur les rails.
Mass Dot Net
3

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

Éther
la source
3
J'ai fait un grep sur tous les fichiers suivis et il n'y avait pas de marqueurs de conflit.
Lucas
Révèle-t-il git diff --stagedquelque chose d'utile? Cela indique les modifications que vous êtes sur le point de valider pour résoudre le (s) conflit (s) de fusion à ce stade du rebase. Il devrait y avoir un "oups, ce n'est pas ce que j'avais l'intention de faire pour résoudre ce" bit dans l'un des fichiers.
Ether
4
Git ne recherche pas de marqueurs de conflit de fusion lorsque vous essayez de passer à autre chose. Il vérifie simplement que l'index est dans un état propre. Si vous avez préparé un fichier qui contient encore des marqueurs de conflit, vous indiquez que vous souhaitez le valider avec eux. C'est probablement toujours une erreur, mais cela vous laissera faire.
Cascabel
@Ether ce n'est pas du tout la raison. Vous pouvez même git addun fichier contenant des marqueurs de conflit. Après tout, ces fichiers peuvent être parfaitement légaux!
fge
@Jefromi: a ha, bon à savoir! J'ai toujours supposé que les marqueurs étaient vérifiés et qu'il faudrait forcer le dépassement si c'était intentionnel.
Éther
3

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

J'avais un hook git pre-commit qui rejetait les commits sous certaines conditions. C'est bien lors de la validation manuelle, car cela affichera la sortie du hook, et je peux soit le corriger, soit choisir de l'ignorer en utilisant commit --no-verify.

Le problème semble être que lors du rebasage, rebase --continue appellera également le hook (afin de valider le dernier épisode de modifications). Mais rebase n'affichera pas la sortie du hook, il verra simplement qu'il a échoué, puis crachera une erreur moins spécifique en disant `` Vous devez éditer tous les conflits de fusion, puis les marquer comme résolus à l'aide de git add ''

Pour résoudre ce problème, mettez en scène toutes vos modifications, 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.

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

carpii
la source
1
J'avais un problème similaire. Rien d'autre ici n'a fonctionné pour moi, mais le simple fait de faire 'git commit' puis d'abandonner a semblé résoudre par magie quel que soit l'écart qui existait, puis j'ai pu 'git rebase --continue' avec succès.
patrickvacek
Pour mémoire, comme j'ai récemment été aux prises avec un problème similaire, git rebaseaccepte l' --no-verifyoption. Cependant, il omet uniquement le pre-rebasehook, mais cette option n'est pas appliquée aux appels suivants à git commit.
pkrysiak
Contient un point valide (commit des modifications) mais trop verbeux pour une bonne réponse.
Jack Miller
2

Une fois que vous avez corrigé vos modifications, vous pourriez oublier d'exécuter 'git add -A'

git add -A
git rebase --continue
gsalgadotoledo
la source
1

Je viens de tomber sur le problème. Je ne voudrais pas git rebase --skip car git statusmontrer clairement les modifications échelonnées, ce que je souhaitais conserver. Bien que j'aie eu quelques fichiers supplémentaires qui sont venus de manière inattendue. J'ai résolu avec

git checkout .

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

Ghislain
la source