149 votes

conflit de fusion git rebase

J'ai forké un repo github et travaillé sur mon repo github.
J'ai fait des demandes de tirage et cela a été fait.

Après cela, l'amont a eu quelques commits supplémentaires et maintenant je veux rebaser, je suppose que c'est ce que je dois faire.
Mais j'ai 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 les réparer, aidez-moi s'il vous plaît.

182voto

iltempo Points 7276

Le rebasage peut être un véritable 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 en fonction de vos paramètres)

git mergetool

Ajoutez ensuite vos modifications et continuez

git rebase --continue

Bonne chance

69voto

baur Points 376

Si vous avez beaucoup de commits à rebaser, et qu'une partie d'entre eux donnent des conflits, cela fait vraiment mal. Mais je peux suggérer une approche moins connue comment "écraser tous les conflits".

D'abord, vérifiez la branche temporaire et commencez la fusion standard.

git checkout -b temp
git merge origin/master

Vous devrez résoudre des conflits, mais une seule fois et uniquement des conflits réels. Ensuite, mettez en scène tous les fichiers et terminez la fusion.

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

Puis retournez à votre branche (que ce soit alpha ) et de commencer à rebaser, mais en résolvant automatiquement tous les conflits.

git checkout alpha
git rebase origin/master -X theirs

La branche a été rebasée, mais le projet est probablement dans un état invalide. C'est bon, il nous reste une dernière étape. Nous devons juste restaurer l'état du projet, afin qu'il soit exactement comme sur la branche 'temp'. Techniquement, nous devons juste copier son arbre (état du dossier) via une 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 rebasement via une fusion cachée.

J'ai également écrit un script, de sorte que cela peut être fait d'une manière dialoguée, vous pouvez le trouver aquí .

22voto

VonC Points 414372

Remarque : avec Git 2.14.x/2.15 (Q3 2017), la fonction git rebase Le message en cas de conflit sera plus clair.

Voir commettre 5fdacc1 (16 juillet 2017) par William Duclot ( williamdclt ) .
(fusionné par Junio C Hamano -- gitster -- sur commettre 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 de git peut être améliorée en adressant les messages d'erreur à ceux qu'ils aident : les giit inexpérimentés et occasionnels. qu'ils aident : les utilisateurs inexpérimentés et occasionnels de git.
Dans ce but, 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 les problème.

En particulier, l'échec de l'application d'un patch lors d'un rebasement git est un problème courant. 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 une processus en 3 étapes, donc complexe) et les rassurer sur le fait qu'ils peuvent se sortir d'une situation qu'ils ne peuvent pas gérer avec " --abort ".
Ce commit répond à ces deux points en détaillant le processus de résolution et en évitant les linguos cryptiques de git.

11voto

chaz Points 160

Si ça ne vous dérange pas de tout écraser en une seule fois, la façon la plus simple de le faire est la suivante git reset --soft <rebase-target> de votre branche actuelle, alors git commit .

Donc, par exemple, vous êtes sur votre branche et votre cible pour rebasement sur est origin/master . En supposant que vous n'avez pas de changements non gérés/travaillés :

# Merge and fix any conflicts from master
git merge origin/master
# Push your changes in case you mess up and want to start over from remote
git push
# Move HEAD to rebase target, leaving all your work staged
git reset --soft origin/master
# Commit staged changes as giant commit
git commit -m "feat(foo): new feature"
# Confirm your changes, run tests, etc. Then force push
git push -f

Vous n'avez pas à vous soucier de refaire des conflits de fusion, car toute la différence entre votre branche et votre cible de rebasement est déplacée sur la zone de transit, prête à être validée.

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