Git rebase: les conflits bloquent les progrès

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 veux mettre en v4. Donc, dans v4, j'ai essayé de faire un rebase à partir de master, et un fichier continue de tout faire foirer: un fichier texte d'une ligne, qui contient le numéro de version. Ce fichier est app/views/common/version.txt , qui avant de rebaser contient ce texte:

v1.4-alpha-02

voilà 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

donc, je l'ai rangé et il ressemble à ceci maintenant:

v1.4-alpha-02

et puis j'ai essayé de continuer: d'abord j'essaie un commit:

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

pas de chance. 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. 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 point, après en faisant le tour avec ça, que je me tape la tête sur le bureau.

que se passe-t-il? Ce que je fais mal? Quelqu'un peut-il me droite?

MODIFIER - 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".
105
demandé sur Alex.K. 2010-10-27 16:13:16

6 réponses

j'ai rencontré un problème similaire avec un rebase. Mon problème a été causé parce qu'un de mes commit a seulement changé un fichier, et lors de la résolution, j'ai écarté le changement introduit dans ce commit. J'ai pu résoudre mon problème en ignorant la validation correspondante ( git rebase --skip ).

vous pouvez reproduire ce problème dans un référentiel de test. D'abord créer le référentiel.

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

puis commit 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éer la branche v4 et changer 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(-)

retourner à master et changer le contenu de version.txt de sorte qu'il y aura un conflit pendant le 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(-)

revenir à v4 de branche et d'essayer de rebase. 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 master de version.txt . Nous ajoutons le fichier et essayer 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 quels changements git pense qu'il y a dans notre dépôt.

$ 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 recommandé d'utiliser git rebase --skip . Il nous a dit "S'il n'y a plus rien à mettre en scène, les chances sont que quelque chose d'autre est déjà introduit les mêmes changements; vous pouvez sauter ce patch."Donc, nous sautons simplement le commit et le rebase réussir.

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

mot de mise en garde : s'il vous plaît noter que git rebase --skip sera complètement supprimer le commit que git essayé de rebaser. Dans notre cas, ça devrait aller puisque git se plaint qu'il s'agit d'un engagement vide. Si vous pensez que vous avez perdu des changements une fois le rebase est terminé, vous pouvez utiliser git reflog pour obtenir l'ID de propagation de votre dépôt avant le rebase, et utiliser git reset --hard pour récupérer votre dépôt dans cet état (c'est une autre opération destructrice).

93
répondu Sylvain Defresne 2013-02-07 18:49:54

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

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

s'avère que parce qu'il n'y est pas changement du patch suspecté par git quelque chose a mal tourné. Git attend un patch doit avoir été appliqué, mais le fichier est restée inchangée.

Le message d'erreur n'est pas très intuitif, mais il contient la réponse. On doit juste dire à rebase oublie ce patch. Il n'est également pas nécessaire pour corriger les marqueurs de conflit dans le fichier. Vous allez vous retrouver avec le version du fichier de la branche que vous êtes changement d'année de base.

$ git rebase --skip
18
répondu Bijou Trouvaille 2011-01-31 10:35:11

Changement app/views/common/version.txt

v1.4-alpha-01

à ce point dans le rebase, rappelez-vous que vous résolvez des conflits de fusion pour montrer la progression de la branche non-master .

ainsi, 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 est dans la façon de créer un* sur la branche de sujet.

donc après en faisant git rebase --abort , les commandes devraient être

git checkout topic
git rebase master
< make edits to resolve conflicts >
git add .
git rebase --continue
6
répondu unutbu 2014-05-29 12:50:20

voici quelques idées:

4
répondu Adam Monsen 2011-01-31 13:38:29

ce message d'erreur est le résultat de votre git commit -a -m "merged" . Si vous réparez juste le fichier, puis lancez git add <file> , et git rebase --continue , il devrait fonctionner très bien. git rebase --continue essaye de faire un commit, mais en trouvant qu'il n'y a pas de changements en attente à commit (parce que vous les avez déjà commis).

4
répondu twalberg 2012-05-22 15:18:24

le comportement que vous voyez n'est pas ce que j'attendrais d'un rebase typique avec juste ce conflit. Envisagez d'utiliser une branche séparée pour faire ce rebase (surtout si vous avez déjà poussé les propagations à distance que vous êtes fast-forwarding). En outre, git mergetool peut être utile pour résoudre les conflits et se rappeler d'émettre un git add .

dans cet exemple minimal, le rebase fonctionne comme prévu. Pouvez-vous donner un exemple qui montre le comportement que vous êtes voir?

#!/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
3
répondu Ben Taitelbaum 2010-10-27 13:25:30