conflit de fusion git rebase

91

J'ai forké un repo github et travaillé sur mon repo github.
J'ai fait des pull-requests et c'était terminé.

Après cela, l'amont a eu d'autres commits alors maintenant je veux rebaser, je suppose que c'est ce que je dois faire.
Mais j'obtiens ces conflits de fusion:

First, rewinding head to replay your work on top of it...
Applying: Issue 135 homepage refresh
Using index info to reconstruct a base tree...
<stdin>:17: trailing whitespace.
      %h4 
warning: 1 line adds whitespace errors.
Falling back to patching base and 3-way merge...
Auto-merging app/views/layouts/application.html.haml
CONFLICT (content): Merge conflict in app/views/layouts/application.html.haml
Auto-merging app/views/home/index.html.haml
CONFLICT (content): Merge conflict in app/views/home/index.html.haml
Auto-merging app/views/home/_group_projects.html.haml
CONFLICT (content): Merge conflict in app/views/home/_group_projects.html.haml
Failed to merge in the changes.
Patch failed at 0001 Issue 135 homepage refresh

When you have resolved this problem run "git rebase --continue".
If you would prefer to skip this patch, instead run "git rebase --skip".
To check out the original branch and stop rebasing run "git rebase --abort".

Je ne sais pas comment résoudre ces problèmes, veuillez aider.

Pahnin
la source
Jetez un œil à ma réponse dans cet article: stackoverflow.com/questions/48307297/…
Abhishek

Réponses:

121

Rebasing peut être un vrai casse-tête. Vous devez résoudre les conflits de fusion et continuer le rebasage. Par exemple, vous pouvez utiliser l'outil de fusion (qui diffère selon vos paramètres)

git mergetool

Ensuite, ajoutez vos modifications et continuez

git rebase --continue

Bonne chance

iltempo
la source
2
oui le rebasage est un casse-tête, puis-je utiliser git pull upstream master?
pahnin le
2
Oui, vous pouvez essayer ça. La différence est que vos commits ne sont pas placés au-dessus de ceux de l'amont. Il y a potentiellement moins de conflits de fusion.
iltempo
7
@iitempo Vous n'avez pas besoin de faire un commit. Un simple git add suffit pour permettre au rebase de continuer.
énigmaticPhysicist
45

En cas de conflit lors du rebase, vous avez trois options:

  • Vous pouvez exécuter git rebase --abortpour annuler complètement le rebase. Git vous ramènera à l'état de votre branche tel qu'il était avant l'appel de git rebase.

  • Vous pouvez exécuter git rebase --skippour ignorer complètement le commit. Cela signifie qu'aucune des modifications introduites par le commit problématique ne sera incluse. Il est très rare que vous choisissiez cette option.

  • Vous pouvez résoudre le conflit comme l'a dit iltempo. Lorsque vous avez terminé, vous devrez appeler git rebase --continue. Mon outil de fusion est kdiff3 mais il y en a beaucoup d'autres que vous pouvez utiliser pour résoudre les conflits. Il vous suffit de définir votre outil de fusion dans les paramètres de git afin qu'il puisse être appelé lorsque vous appelez git mergetool https://git-scm.com/docs/git-mergetool

Si aucune des solutions ci-dessus ne vous convient, allez vous promener et réessayez :)

Uga Buga
la source
2
Oui, mais comment réparer le conflic?
Telle
@KansaiRobot Une option pour accomplir la correction manuelle: ouvrez le fichier en conflit dans un éditeur de texte et recherchez<<<<<
spinup
16

Si vous avez beaucoup de commits à rebaser, et que certains d'entre eux donnent des conflits, cela fait vraiment mal. Mais je peux suggérer une approche moins connue pour «écraser tous les conflits».

Tout d'abord, vérifiez la branche temporaire et lancez la fusion standard

git checkout -b temp
git merge origin/master

Vous devrez résoudre les conflits, mais une seule fois et seulement les vrais. Ensuite, organisez tous les fichiers et terminez la fusion.

git commit -m "Merge branch 'origin/master' into 'temp'"

Revenez ensuite à votre branche (que ce soit alpha ) et lancez le rebase, mais avec la résolution automatique des conflits.

git checkout alpha
git rebase origin/master -X theirs

La branche a été rebasée, mais le projet est probablement dans un état non valide. C'est OK, nous avons une dernière étape. Nous avons juste besoin de restaurer l'état du projet, donc il sera exact comme sur la branche «temp». Techniquement, nous avons juste besoin de copier son arborescence (état du dossier) via la commande de bas niveau git commit-tree . De plus, la fusion dans la branche actuelle vient de créer un commit.

git merge --ff $(git commit-tree temp^{tree} -m "Fix after rebase" -p HEAD)

Et supprimer la branche temporaire

git branch -D temp

C'est tout. Nous avons fait un rebase via une fusion masquée.

J'ai également écrit un script, pour que cela puisse être fait de manière dialogique, vous pouvez le trouver ici .

baur
la source
13

Remarque: avec Git 2.14.x / 2.15 (T3 2017), le git rebasemessage en cas de conflit sera plus clair.

Voir commit 5fdacc1 (16 juillet 2017) par William Duclot ( williamdclt) .
(Fusionné par Junio ​​C Hamano - gitster- in commit 076eeec , 11 août 2017)

rebase: rendre le message de résolution plus clair pour les utilisateurs inexpérimentés

Avant:

When you have resolved this problem, run "git rebase --continue".
If you prefer to skip this patch, run "git rebase --skip" instead.
To check out the original branch and stop rebasing, run "git rebase --abort"

Après:

Resolve all conflicts manually, 
mark them as resolved with git add/rm <conflicted_files>
then run "git rebase --continue".

You can instead skip this commit: run "git rebase --skip".
To abort and get back to the state before "git rebase", run "git rebase --abort".')

L'interface utilisateur git peut être améliorée en adressant les messages d'erreur à ceux qu'ils aident: utilisateurs git inexpérimentés et occasionnels.
À cette fin, il est utile de s'assurer que les termes utilisés dans ces messages peuvent être compris par ce segment d'utilisateurs et qu'ils les guident pour résoudre le problème.

En particulier, l'échec de l'application d'un correctif lors d'un rebase git est un problème courant qui peut être très déstabilisant pour l'utilisateur inexpérimenté.
Il est important de les conduire vers la résolution du conflit (qui est un processus en 3 étapes, donc complexe) et de les rassurer qu'ils peuvent échapper à une situation avec laquelle ils ne peuvent pas gérer " --abort".
Ce commit répond à ces deux points en détaillant le processus de résolution et en évitant le cryptique git linguo.

VonC
la source
1
Agréable! La page d'aide dit de résoudre le conflit en validant le changement, mais non! Ici, nous devons ignorer le commit et continuer la fusion à la place! (page d'aide: help.github.com/articles/… )
Jerther