119 votes

Git rebase: les conflits de maintenir le blocage des progrès

J'ai une branche git (appelé v4), qui a été faite par le maître d'hier seulement. Il y avait un couple de modifications de maître, que je veux entrer dans la v4. Ainsi, dans la v4, j'ai essayé de faire un rebase de maître, et un fichier empêche l'bousiller les choses: une ligne de fichier texte, qui contient le numéro de version. Ce fichier est - app/views/common/version.txt, qui, avant le changement d'année de base contient ce texte:

v1.4-alpha-02

Voici ce que j'ai 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".

L' 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, j'ai bien rangé et il ressemble à ceci maintenant:

v1.4-alpha-02

et puis j'ai essayé de porter sur: j'ai d'abord essayer un commit:

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

Pas de chance là-bas. Alors, j'ai essayé d'ajouter le fichier:

git add app/views/common/version.txt

Pas de réponse. Pas de nouvelles, bonnes nouvelles, 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 moment, après va rond et rond avec ce que je suis cogner ma tête hors du bureau.

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

MODIFIER - pour unutbu

J'ai modifié le fichier comme vous l'avez suggéré et obtenir 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".

102voto

Sylvain Defresne Points 15231

J'ai rencontré un problème similaire avec un rebase. Mon problème a été causé parce que l'un de mes commettre seulement changé un fichier, et lors de la résolution, j'ai jeté 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 dépôt 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 valider le contenu d'origine de l' version.txt en 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éer l' v4 de la branche et de modifier 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 à l' master et de modifier le contenu de version.txt , de sorte qu'il y aura un conflit au cours de 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(-)

Revenir à l' v4 de branche et d'essayer de rebase. Il échoue avec un conflit en 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 de résoudre le conflit par la sélection de l' master contenu 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 ne ! Nous allons voir ce qui change 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 de nous informer de cela et ont recommandé d'utiliser git rebase --skip. Il nous a dit "Si il n'y a rien à gauche de la 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, sautez simplement la validation et le rebase réussir.

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

Mot d'avertissement: Veuillez noter que l' git rebase --skip vont abandonner la validation qu' git a essayé de rebase. Dans notre cas, cela devrait être ok depuis git est de se plaindre c'est un vide s'engager. Si vous pensez que vous avez perdu des changements une fois que cela est terminé, vous pouvez utiliser git reflog pour obtenir la validation de l'id de votre dépôt avant le rebase, et utiliser git reset --hard pour obtenir votre depot de retour dans cet état (c'est une autre opération destructrice).

22voto

Bijou Trouvaille Points 1067

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

Hein?!? Non, je n'ai pas oublié à l'utilisation de 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 git suspects quelque chose a mal tourné. Git attend un patch a été appliqué, mais l' fichier est restée inchangée.

Le message d'erreur n'est pas très intuitif, mais il contient la réponse. Nous avons juste besoin de dire rebase pour ignorer ce patch. Il n'est également pas nécessaire de fixer les marqueurs de conflit dans le fichier. Vous allez vous retrouver avec le version de fichier de la direction générale, vous êtes changement d'année de base.

$ git rebase --skip

6voto

unutbu Points 222216

Changement app/views/common/version.txt pour

v1.4-alpha-01

À ce point dans le rebase, n'oubliez pas que vous êtes en train de résoudre les conflits de fusion pour montrer la progression de la non-maîtrise de la branche.

Ainsi, dans la relocalisation de

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

pour

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

le conflit de la résolution est dans la façon de créer Un* sur le thème de la branche.

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

6voto

twalberg Points 19804

Ce message d'erreur est le résultat de votre git commit -a -m "merged". Si vous venez de réparer le fichier, puis exécutez git add <file>, et git rebase --continue, il devrait fonctionner correctement. git rebase --continue est en train de faire un commit, mais constatant qu'il n'existe pas de modifications en attente pour commettre (parce que vous avez commis déjà).

4voto

Ben Taitelbaum Points 5119

Le comportement que vous voyez n'est pas ce que je m'attends à partir d'un type de rebase avec juste ce conflit. Envisagez l'utilisation d'une branche distincte pour ce faire rebase (surtout si vous avez déjà poussé la commet à distance que vous êtes en avance-rapide). Aussi, git mergetool peut être utile pour résoudre les conflits et à se souvenir de délivrer un git add.

Dans cet exemple minimal, cela fonctionne comme prévu. Pouvez-vous donner un exemple qui montre le comportement que vous 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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X