Git rebase – continue à se plaindre 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 rebase contre maître de ma twig:

git rebase master 

et a 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. 

Donc, je suis allé à mon éditeur préféré, corrigé le conflit de 1 ligne, enregistré le fichier et fait un statut git et obtenu la sortie suivante:

  # Not currently on any branch. # Changes to be committed: # (use "git reset HEAD ..." to unstage) # # modified: PassengerContactHandler.java # # Unmerged paths: # (use "git reset HEAD ..." to unstage) # (use "git add/rm ..." as appropriate to mark resolution) # # both modified: AssetsLoader.java # 

J’ai fait un git add AssetsLoader.java et un statut git et obtenu ce qui suit:

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

et quand j’ai fait rebit – continue je reçois:

 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 poursuivre le rebase, mais je ne suis pas certain que les modifications apscopes à PassengerContactHandler.java seront intégrées à ma twig ou non.

alors 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:

Cela m’est arrivé à nouveau,

 (307ac0d...)|REBASE)$ git status # Not currently on any branch. # Changes to be committed: # (use "git reset HEAD ..." to unstage) # # modified: assets/world/level1/Level-1.xml # modified: George.java # modified: DefaultPassenger.java # # Untracked files: # (use "git add ..." to include in what will be committed) # # mb-art/originalAssets/27dec/ 

((307ac0d …) | REBASE) $ git rebase –continuer

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

git –version

 git version 1.7.1 

Cela se produit car lorsque vous corrigez un conflit, vous avez supprimé tout le code dans le correctif appliqué à la twig sur laquelle vous effectuez un changement de base. Utilisez git rebase --skip pour continuer.

Un peu plus de détails:

Normalement, lorsque vous corrigez un conflit pendant le rebasage, vous éditez le fichier en conflit, en conservant une partie ou la totalité du code dans le correctif actuellement appliqué à la twig sur laquelle vous effectuez le rebase. 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 / conflit / fichier

git rebase –continuer fonctionnera correctement dans cette situation.

Parfois, cependant, lors de la résolution du conflit, vous supprimez tout dans votre nouveau correctif, en conservant uniquement le code de la twig sur laquelle vous avez effectué le rebasage. Maintenant, lorsque vous ajoutez le fichier, ce sera exactement comme celui sur lequel vous avez essayé de vous rebaser. git status n’affiche aucune ligne verte affichant les fichiers modifiés. Maintenant si vous le faites

 git rebase --continue 

Git va se plaindre avec

Aucun changement – avez-vous oublié d’utiliser ‘git add’?

Ce que git veut réellement que vous fassiez dans cette situation est d’utiliser

 git rebase --skip 

pour sauter le patch. Auparavant, je n’avais jamais fait cela, car je ne savais pas toujours ce qui serait réellement ignoré, mais je ne savais pas ce que cela signifiait vraiment. Mais si vous n’obtenez pas de ligne verte avec

modifié: votre / conflit / fichier

après avoir édité le fichier en conflit, l’ajouté et fait l’état de git, alors vous pouvez être sûr que vous avez supprimé tout le patch, et que vous pouvez à la place utiliser

 git rebase --skip 

continuer.

Le post original disait que cela fonctionne parfois:

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

… mais ne comptez pas sur cela (et veillez à ne pas append de fichiers restants dans vos dossiers de référentiel)

Semble être un bug dans Git 1.7

Voici un bon article sur la façon de résoudre ce problème .

Fondamentalement, cela devrait fonctionner, si vous faites un

 git diff 

après avoir résolu vos conflits et ensuite

 git rebase --continue 

devrait marcher.

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

 $ git mergetool 

Devrait afficher un éditeur interactif vous permettant de résoudre les conflits. Plus facile que d’essayer de le faire manuellement, et git reconnaîtra également la fusion. Évitera également les situations où vous ne fusionnez pas complètement par accident, ce qui peut se produire lorsque vous essayez de le faire manuellement.

J’ai juste eu ce problème, et bien que je pense qu’il pourrait y avoir quelques causes, voici le mien …

J’ai eu un hook pre-commit de git qui a refusé de commettre sous certaines conditions. Ceci est correct lors de la validation manuelle, car il affichera la sortie du hook, et je peux soit le réparer, 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 (pour commettre la dernière période de changements). Mais rebase n’affichera pas la sortie du hook, il verra juste qu’il a échoué, puis a craché une erreur moins spécifique en disant: “Vous devez éditer tous les conflits de fusion et les marquer comme résolus en utilisant git add”

Pour résoudre ce problème, mettez en place toutes vos modifications et, au lieu de faire “git rebase – continuez”, essayez un “git commit”. Si vous souffrez du même problème de crochet, 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.

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

Après avoir corrigé 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.