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".
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).
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
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
voici quelques idées:
- avant de lancer le rebase, assurez-vous que vous n'êtes pas au milieu d'un rebase ou am. Do:
rm -rf .git/rebase-apply
- un peu vous avez mentionné que je ne comprenais pas: "et puis essayer de continuer: d'abord j'essaie un commit:"... pourquoi s'engager? Dans le je pense que vous ne devriez ajouter "git" qu'après avoir rangé ou" git rm " pour lancer des modifications ou confirmer une suppression de fichier. Peut-être loupé quelque chose?
- essayer fusionner au lieu d'un rebase
- essayer certains de Ethan Rowe " idées
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).
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