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.