web-dev-qa-db-fra.com

Git rebase: les conflits bloquent la progression

J'ai une branche git (appelée v4), qui a été faite à partir de master hier. Il y a eu quelques changements à maîtriser, que je souhaite intégrer à la v4. Donc, dans la v4, j'ai essayé de créer une base de rebase à partir de master, et un fichier continue de tout gâcher: 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 le changement de base:

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".

Le version.txt ressemble maintenant à ceci:

<<<<<<< HEAD:app/views/common/version.txt
v1.4-alpha-02
=======
v1.4-alpha-01
>>>>>>> new version, new branch:app/views/common/version.txt

Alors, 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 commit:

> 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'ajouter le fichier:

git add app/views/common/version.txt

Pas de réponse. Aucune nouvelle n'est une bonne nouvelle, je suppose. Alors, 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 stade, après avoir tourné en rond avec ceci, que je me cogne la tête du bureau.

Que se passe t-il ici? Qu'est-ce que je fais mal? Est-ce que quelqu'un peut me remettre en ordre?

EDIT - pour unutbu

J'ai changé le fichier comme vous l'avez suggéré et j'obtiens 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".
115
Max Williams

J'ai rencontré un problème similaire avec un rebase. Mon problème était dû au fait que l'un de mes validations ne modifiait qu'un fichier, et lors de la résolution du problème, j'ai ignoré la modification introduite dans cette validation. J'ai pu résoudre mon problème en sautant 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/

Puis validez le contenu original de version.txt en maître.

$ 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 le v4 branche et modifie 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(-)

Retournez à master et changez le contenu de version.txt afin qu'il y ait un conflit pendant la 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 à v4 branchez 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 de master de version.txt. Nous ajoutons le fichier et essayons de continuer notre base.

$ 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 quels changements 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 avez lu en détail le message d'erreur précédent, git nous en a informé et vous a recommandé d'utiliser git rebase --skip. Il nous a dit "S'il ne reste 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 voudrez peut-être ignorer ce patch." Donc nous sautons juste le commit et la base est réussie.

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

Mot d'avertissement: Veuillez noter que git rebase --skip va complètement supprimer le commit que git a essayé de rebaser. Dans notre cas, cela devrait aller puisque git se plaint que c'est un commit vide. Si vous pensez avoir perdu les modifications une fois la base terminée, vous pouvez utiliser git reflog pour obtenir l'ID de validation de votre référentiel avant la base, puis utilisez git reset --hard pour remettre votre dépôt dans cet état (il s’agit d’une autre opération destructive).

101
Sylvain Defresne

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

Hein?!? Non, je n'ai pas oublié d'utiliser git add, je l'ai fait ... comme ... il y a 2 secondes!

Il s'avère que parce qu'il n'y a pas de changement dans le patch, Git pense que quelque chose a mal tourné. Git s'attend à ce qu'un correctif 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 réparer les marqueurs de conflit dans le fichier. Vous obtiendrez la version du fichier de la branche sur laquelle vous vous rebassez.

$ git rebase --skip
21
Bijou Trouvaille

Changez app/views/common/version.txt en

v1.4-alpha-01

À ce stade de la base, rappelez-vous que vous résolvez les conflits de fusion pour afficher la progression de la branche non-maître.

Donc, en rebasant 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 réside dans la création de A * sur la branche de sujet.

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

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

Ce message d'erreur est le résultat de votre git commit -a -m "merged". Si vous corrigez le fichier, lancez git add <file>, et git rebase --continue, ça devrait marcher. git rebase --continue essaie de valider, mais constate qu'il n'y a aucune modification en attente à valider (car vous les avez déjà validées).

6
twalberg

Voici quelques idées:

4
Adam Monsen

Le comportement que vous observez n'est pas ce que j'attendrais d'un rebasement typique avec juste ce conflit. Pensez à utiliser une branche distincte pour faire cette base (surtout si vous avez déjà poussé les commits à distance et que vous effectuez un transfert rapide). Également, git mergetool peut être utile pour résoudre des conflits et se souvenir d’émettre un git add.

Dans cet exemple minimal, la base repose comme prévu. Pouvez-vous donner un exemple montrant le comportement que vous observez?

#!/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
4
Ben Taitelbaum