Git rebase: les conflits bloquent la progression

J’ai une twig git (appelée v4), qui a été fabriquée à partir de master hier. Il y a eu quelques modifications à maîsortingser, que je veux mettre en v4. Donc, en v4, j’ai essayé de faire un rebase à partir de master, et un fichier continue à visser: un fichier texte d’une ligne, qui contient le numéro de version. Ce fichier est app/views/common/version.txt , qui contient ce texte avant de procéder au rebasage:

 v1.4-alpha-02 

Voici ce que je fais:

 > git rebase master First, rewinding head to replay your work on top of it... Applying: new version, new branch error: patch failed: app/views/common/version.txt:1 error: app/views/common/version.txt: patch does not apply Using index info to reconstruct a base tree... Falling back to patching base and 3-way merge... Auto-merging app/views/common/version.txt CONFLICT (content): Merge conflict in app/views/common/version.txt Failed to merge in the changes. Patch failed at 0001 new version, new branch When you have resolved this problem run "git rebase --continue". If you would prefer to skip this patch, instead run "git rebase --skip". To restore the original branch and stop rebasing run "git rebase --abort". 

La version.txt ressemble maintenant à ceci:

 <<<<<<>>>>>> new version, new branch:app/views/common/version.txt 

Donc, je le range et ça ressemble à ça maintenant:

 v1.4-alpha-02 

et puis j’ai essayé de continuer: au début, j’ai essayé un engagement:

 > git commit -a -m "merged" # Not currently on any branch. nothing to commit (working directory clean) 

Pas de chance là-bas. Donc, j’essayais d’append le fichier:

 git add app/views/common/version.txt 

Pas de réponse. Aucune nouvelle n’est une bonne nouvelle, je suppose. Donc, j’essaie de continuer:

 > git rebase --continue Applying: new version, new branch No changes - did you forget to use 'git add'? When you have resolved this problem run "git rebase --continue". If you would prefer to skip this patch, instead run "git rebase --skip". To restore the original branch and stop rebasing run "git rebase --abort". 

C’est à ce moment, après avoir fait le tour de la question, que je me casse la tête sur le bureau.

Que se passe t-il ici? Qu’est-ce que je fais mal? Quelqu’un peut-il me mettre au clair?

EDIT – pour unutbu

J’ai changé le fichier comme vous l’avez suggéré et j’ai la même erreur:

 > git rebase master First, rewinding head to replay your work on top of it... Applying: new version, new branch error: patch failed: app/views/common/version.txt:1 error: app/views/common/version.txt: patch does not apply Using index info to reconstruct a base tree... Falling back to patching base and 3-way merge... Auto-merging app/views/common/version.txt CONFLICT (content): Merge conflict in app/views/common/version.txt Failed to merge in the changes. Patch failed at 0001 new version, new branch When you have resolved this problem run "git rebase --continue". If you would prefer to skip this patch, instead run "git rebase --skip". To restore the original branch and stop rebasing run "git rebase --abort". 

J’ai rencontré un problème similaire avec un rebase. Mon problème a été causé par le fait que l’un de mes commits a seulement modifié un fichier et, lors de la résolution, j’ai ignoré la modification introduite dans ce commit. J’ai pu résoudre mon problème en ignorant le commit correspondant ( git rebase --skip ).

Vous pouvez reproduire ce problème dans un référentiel de test. Commencez par créer le référentiel.

 $ mkdir failing-merge $ cd failing-merge $ git init Initialized empty Git repository in $HOME/failing-merge/.git/ 

Ensuite, validez le contenu original de version.txt dans master.

 $ echo v1.4-alpha-02 > version.txt $ git add version.txt $ git commit -m initial [master (root-commit) 2eef0a5] initial 1 files changed, 1 insertions(+), 0 deletions(-) create mode 100644 version.txt 

Créez la twig v4 et modifiez le contenu de version.txt .

 $ git checkout -b v4 Switched to a new branch 'v4' $ echo v1.4-alpha-03 > version.txt $ git add version.txt $ git commit -m v4 [v4 1ef8c9b] v4 1 files changed, 1 insertions(+), 1 deletions(-) 

Revenez sur master et changez le contenu de version.txt pour qu’il y ait un conflit lors du rebase.

 $ git checkout master Switched to branch 'master' $ echo v1.4-alpha-04 > version.txt $ git add version.txt $ git commit -m master [master 7313eb3] master 1 files changed, 1 insertions(+), 1 deletions(-) 

Revenez à la twig v4 et essayez de rebaser. Il échoue avec un conflit dans version.txt comme prévu.

 $ git checkout v4 Switched to branch 'v4' $ git rebase master First, rewinding head to replay your work on top of it... Applying: v4 Using index info to reconstruct a base tree... Falling back to patching base and 3-way merge... Auto-merging version.txt CONFLICT (content): Merge conflict in version.txt Recorded preimage for 'version.txt' Failed to merge in the changes. Patch failed at 0001 v4 When you have resolved this problem run "git rebase --continue". If you would prefer to skip this patch, instead run "git rebase --skip". To restore the original branch and stop rebasing run "git rebase --abort". $ cat version.txt <<<<<<< HEAD v1.4-alpha-04 ======= v1.4-alpha-03 >>>>>>> v4 

Nous résolvons le conflit en sélectionnant le contenu principal de version.txt . Nous ajoutons le fichier et essayons de continuer notre rebase.

 $ echo v1.4-alpha-04 > version.txt $ git add version.txt $ git rebase --continue Applying: v4 No changes - did you forget to use 'git add'? If there is nothing left to stage, chances are that something else already introduced the same changes; you might want to skip this patch. When you have resolved this problem run "git rebase --continue". If you would prefer to skip this patch, instead run "git rebase --skip". To restore the original branch and stop rebasing run "git rebase --abort". 

Il échoue ! Voyons ce que git pense qu’il y a dans notre référentiel.

 $ git status # Not currently on any branch. nothing to commit (working directory clean) 

Ah ah, il n’y a pas de changement. Si vous lisez en détail le message d’erreur précédent, git nous en a informé et a recommandé d’utiliser git rebase --skip . Il nous a dit: “S’il n’y a plus rien à mettre en scène, il y a des chances que quelque chose d’autre ait déjà introduit les mêmes changements, vous pouvez sauter ce patch.” Donc, nous ne faisons que sauter le commit et la rebase réussit.

 $ git rebase --skip HEAD is now at 7313eb3 master 

Attention: notez que git rebase --skip supprime complètement le commit que git essayé de rebaser. Dans notre cas, cela devrait être correct puisque git se plaint qu’il s’agit d’un commit vide. Si vous pensez avoir perdu des modifications une fois la réinitialisation terminée, vous pouvez utiliser git reflog pour obtenir l’ID de validation de votre référentiel avant le rebase, et utiliser git reset --hard pour récupérer votre repository dans cet état (ceci est un autre). opération destructive).

Citant ici: http://wholemeal.co.nz/node/9

Huh?!? Non, je n’ai pas oublié d’utiliser git add, je l’ai fait … comme il y a 2 secondes!

Il se trouve que parce qu’il n’y a pas de changement par rapport au patch, git pense que quelque chose ne va pas. Git s’attend à ce qu’un patch ait été appliqué, mais le fichier est resté inchangé.

Le message d’erreur n’est pas très intuitif, mais il contient la réponse. Nous avons juste besoin de dire à rebase de sauter ce patch. Il n’est également pas nécessaire de corriger les marqueurs de conflit dans le fichier. Vous allez vous retrouver avec la version du fichier de la twig sur laquelle vous vous référez.

 $ git rebase --skip 

Changez app / views / common / version.txt en

 v1.4-alpha-01 

À ce stade de la réinitialisation, rappelez-vous que vous résolvez les conflits de fusion pour afficher la progression de la twig non maîtresse .

Donc, en repassant de

  A---B---C topic / D---E---F---G master 

à

  A*--B*--C* topic / D---E---F---G master 

le conflit que vous résolvez est dans la façon de créer A * sur la twig du sujet.

Donc, après avoir fait git rebase --abort , les commandes devraient être

 git checkout topic git rebase master < make edits to resolve conflicts > git add . git rebase --continue 

Voici quelques idées:

  • Avant de lancer le rebase, assurez-vous de ne pas être au milieu d’une rebase ou d’un am. Do: rm -rf .git/rebase-apply
    • Si vous utilisez Bash, améliorez votre invite afin qu’il présente toujours ces informations automatiquement
  • Un peu que vous avez mentionné, je n’ai pas compris: “et ensuite essayer de continuer: au début, j’essaie un commit:” … pourquoi commettre? Au milieu d’une rebase, je pense que vous devriez seulement “append git” après avoir rangé ou “git rm” pour lancer des modifications ou confirmer une suppression de fichier. Peut-être que ça a gâché quelque chose?
  • essayer une fusion au lieu d’une rebase
  • essayez quelques idées d’Ethan Rowe

Ce message d’erreur est le résultat de votre git commit -a -m "merged" . Si vous git rebase --continue le fichier, lancez git add et git rebase --continue , cela devrait fonctionner git rebase --continue . git rebase --continue essayer de faire une validation, mais trouve qu’il n’y a pas de modifications en attente à valider (parce que vous les avez déjà validées).

Le comportement que vous voyez n’est pas ce que j’attendrais d’une rebase typique avec juste ce conflit. Pensez à utiliser une twig distincte pour effectuer cette rebase (surtout si vous avez déjà poussé les commits à distance que vous effectuez un transfert rapide). De plus, git mergetool peut être utile pour résoudre des conflits et se souvenir de git add un git add .

Dans cet exemple minimal, le rebase fonctionne comme prévu. Pouvez-vous donner un exemple qui montre le comportement que vous voyez?

 #!/bin/bash cd /tmp mkdir rebasetest cd rebasetest git init echo 'v1.0' > version.txt git add version.txt git commit -m 'initial commit' git checkout -b v4 echo 'v1.4-alpha-01' > version.txt git add version.txt git commit -m 'created v4' git checkout master git merge v4 echo 'v1.4-alpha-01-rc1' > version.txt git add version.txt git commit -m 'upped version on master to v1.4-alpha-01-rc1' git checkout v4 echo 'v1.4-alpha-02' > version.txt git add version.txt git commit -m 'starting work on alpha-02' git rebase master echo 'v1.4-alpha-02' > version.txt git add version.txt git rebase --continue