Comment terminer la fusion après avoir résolu mes conflits de fusion?

282

J'ai lu la section Bases de branchement et de fusion du Git Community Book.

Donc , je suis et créer une branche: experimental.

Alors je:

  1. passer à la branche expérimentale (git checkout experimental)
  2. faire un tas de changements
  3. le valider (git commit -a)
  4. passer à la branche principale (git checkout master)
  5. apporter des modifications et s'y engager
  6. revenir à expérimental (git checkout experimental)
  7. fusionner le master en expérimental (git merge master)
  8. il y a des conflits mais après les avoir résolus, j'ai `` ajouté mon fichier ''

  9. Et maintenant je suis coincé, je ne peux pas retourner au maître

quand je fais

 $ git checkout master
error: Entry 'res/layout/my_item.xml' would be overwritten by merge. Cannot merge.

et j'ai fait:

$ git rebase --abort

Pas de rebase en cours?

et j'ai fait :

$  git add res/layout/socialhub_list_item.xml
$ git checkout master
error: Entry 'res/layout/my_item.xml' would be overwritten by merge. Cannot merge.

Que puis-je faire pour revenir à ma branche principale?

Michael
la source
Après avoir résolu le conflit, effectué l'ajout, puis tenté d'effectuer la validation avec git commit gf2n.cpp -m "Hand merge gf2n.cpp due to conflicts", il en résulte fatal: cannot do a partial commit during a merge.. Et bien sûr, les "validations partielles" ne semblent pas être documentées ou discutées nulle part dans les pages de manuel de git. Effectuer un git mergeaprès le correctif se traduit par Please, commit your changes before you can merge.un outil de cul cassé ...
jww
2
git commit avec des chemins explicites est documenté dans la page de manuel dans la DESCRIPTION "as" 3. en listant les fichiers comme arguments de la commande commit, auquel cas le commit ignorera les modifications mises en scène dans l'index, et enregistrera à la place le contenu actuel des fichiers listés (qui doit déjà être connu de Git); "et aussi sous le '- -only 'option. Je suis presque sûr que le message de fusion a été écrit par quelqu'un qui a supposé que vous aviez lu le fonctionnement de la commande commit et pourrait reconnaître la signification du mot "partial" dans cette description, si ce n'est pas déjà le cas au moins encore et plus attentivement. @jww
jthill
1
Alors, pourquoi cette étude de cas mérite-t-elle une lecture attentive pour la compréhension, alors que les pages de manuel ne le font pas? @jww
jthill
1
Eh bien, utiliser git nécessite clairement une meilleure compréhension de la lecture que ce que vous êtes prêt à acquérir. Je suis peut-être encore plus incertain que ce soit un défaut de git que vous en êtes sûr.
2016 à 6h02
1
Avec Git 2.12 (Q1 2017), vous ferez bientôt simplement un git merge --continue. Voir ma réponse ci
VonC

Réponses:

267

En cas de conflit lors d'une fusion, vous devez terminer la validation de la fusion manuellement. Il semble que vous ayez effectué les deux premières étapes, pour modifier les fichiers en conflit puis les exécuter git addpour les marquer comme résolus. Enfin, vous devez réellement valider la fusion avec git commit. À ce stade, vous pourrez à nouveau changer de branche.

Jimmy Cuadra
la source
Si vous utilisez "git gui &" pour effectuer la validation - vous ne réaliserez peut-être pas que votre état de branche ne "fusionne" plus. Le suivi avec un «statut git» est utile pour vous assurer que le statut de votre branche est correct.
Tony Ashworth
4
Essayez git commit -am "your commit message"d'effectuer simultanément l'ajout et la validation.
vaheeds
3
git commitfonctionne. Et il est préférable de l'utiliser pour obtenir le message de validation de fusion par défaut renseigné pour vous. J'évite `git commit -am" car il remplacera le message
Arijoon
1
Essayez git push.
alper
J'ai eu cette situation dans le scénario ci-dessous -> J'ai fusionné la branche X avec la branche Y. Ensuite, je me suis rendu compte que j'avais fait quelque chose de mal dans la branche Y, alors j'ai corrigé cela et ensuite je "modifie" mes changements dans la branche Y. En raison de la modification, git n'a pas créé de nouveau commit. Donc, lorsque j'ai fusionné la branche X avec la branche Y mise à jour, cela a donné lieu à un conflit. BTW merci pour cette réponse.
doga
157

Comment terminer la fusion après avoir résolu mes conflits de fusion?

Avec Git 2.12 (Q1 2017), vous aurez la commande la plus naturelle:

git merge --continue

Voir commit c7d227d (15 décembre 2016) par Jeff King ( peff) .
Voir commit 042e290 , commit c261a87 , commit 367ff69 (14 décembre 2016) par Chris Packham ( cpackham) .
(Fusionné par Junio ​​C Hamano - gitster- en commit 05f6e1b , 27 déc.2016 )

Voir les notes de version 2.12 .

merge: ajouter l' --continueoption ' ' comme synonyme de ' git commit'

Enseignez ' git merge' l' --continueoption qui permet de `` poursuivre '' une fusion en la complétant.
La manière traditionnelle de réaliser une fusion après avoir résolu des conflits est d'utiliser ' git commit'.
Maintenant, avec des commandes comme ' git rebase' et ' git cherry-pick' ayant une --continueoption ' ', ajouter une telle option à ' git merge' présente une interface utilisateur cohérente.

VonC
la source
Je me préparais à poster un commentaire sur la façon dont cela a été récemment ajouté en 2.12 au T1 2017, mais j'ai relu la première ligne de votre réponse. Pas étonnant que l'option n'ait pas été trouvée pour moi sur la version 2.10!
cjsimon
1
J'ai essayé git merge --continue et Git Bash n'a pas pu reconnaître cela comme une commande. Mais ce qui a fonctionné était git commit -m "Message de validation"
Mimi
2
@Mimi OK, mais utilisez-vous un Git 2.12 ou plus?
VonC
@VonC vous avez raison, j'utilise une ancienne version de Git!
Mimi
23

Si vous vous retrouvez coincé lors d'une fusion / rebase, vous pouvez toujours

git reset --hard

pour restaurer votre travail à l'état du dernier commit. Cela perdra vos modifications de l'arborescence de travail, donc si vous aviez des modifications locales avant la fusion, elles disparaîtront après cela - c'est pourquoi il est conseillé de ne pas démarrer une fusion lorsque vous avez des modifications locales. :)

Bombe
la source
16
avertissement obligatoire: git reset --hardannule les modifications non engagées
Geoffrey Hale
2
Pourquoi pas juste git merge --abort, qui n'a aucun risque de perdre quoi que ce soit?
Alexander George
11

Just git commitit.

Facultativement git abort:
j'ai rencontré un conflit de fusion. Comment annuler la fusion?

Pour vous simplifier la vie avec les fusions, installez kdiff3 et configurez-le comme un outil de fusion. Instructions: http://doodkin.com/2016/05/29/git-merge-easy-github-this-branch-has-conflicts-that-must-be-resolved-use-the-command-line/

Cette page contient cette vidéo: https://www.youtube.com/watch?v=Cc4xPp7Iuzo

Shimon Doodkin
la source
11

Chaque fois que vous fusionnez deux branches à l'aide de la commande git merge brancha branchb, il existe deux possibilités:

  1. Une branche (disons brancha) peut être atteinte par l'autre branche (disons brancheb) en suivant son historique de commits.Dans ce cas, git avance simplement la tête pour pointer vers la branche récente (dans ce cas, branchb).

    2.Mais si les deux branches ont divergé à un point plus ancien, alors git crée un nouveau snapshot et ajoute un nouveau commit qui pointe dessus. Donc, s'il n'y a pas de conflit entre les branches que vous fusionnez, git crée un nouveau commit en douceur.

Exécutez git logpour voir la validation après avoir fusionné deux branches non conflictuelles.

Revenons maintenant au cas intéressant où il y a des conflits de fusion entre les branches qui fusionnent. Je cite ceci sur la page https://git-scm.com/book/en/v2/Git-Branching-Basic-Branching-and-Merging

Git n'a pas automatiquement créé de nouveau commit de fusion. Il a suspendu le processus pendant que vous résolvez le conflit. Si vous souhaitez voir quels fichiers sont fusionnés à tout moment après un conflit de fusion, vous pouvez exécutergit status


Donc, en cas de conflits de fusion, vous devez résoudre le conflit, puis ajouter les modifications que vous avez apportées à la zone de transit à l'aide git add filename, puis valider les modifications à l'aide de la commande git commit qui a été interrompue par git en raison du conflit. J'espère que cela explique votre requete. Visitez également le lien ci-dessus pour une compréhension détaillée. En cas de question, veuillez commenter ci-dessous, je serai heureux de vous aider.

Sourav Prem
la source
7

Les étapes suivantes après la résolution manuelle des conflits sont les suivantes: -

  1. git add.
  2. git status (cela vous montrera quelles commandes sont nécessaires pour continuer la procédure de fusion automatique)
  3. [suggère git de commande, par exemple git merge --continue, git cherry-pick --continue, git rebase --continue]
Timide
la source
16
Il n'y a pas de fusion Git
Hola Soy Edu Feliz Navidad
@HolaSoyEduFelizNavidad C'est incorrect. Sortie de Zie Git ci-dessous après le conflit: - error: Failed to merge in the changes. Patch failed at 0001 ADD: _type to styleguide The copy of the patch that failed is found in: .git/rebase-apply/patch 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".
Timidfriendly
5
Il y a rebase --continuer, pas fusionner --continuer
Hola Soy Edu Feliz Navidad
git merge --continue, ce que j'essaie de faire, se traduit par error: unknown option 'continue'. Je suis certain que votre réponse est fausse, car la git-mergepage de manuel ne la répertorie pas. Quelle version de Git utilisez-vous? J'utilise git version 1.8.5.2 (Apple Git-48). J'ai également essayé avec MacPorts git version 2.9.3.
jww
1
Avec git 2.10 pour une fusion simple, la commande est très anciennegit commit
Chris Charabaruk
2

Un conflit de fusion se produit lorsque deux branches que vous essayez de fusionner ont toutes deux modifié la même partie du même fichier. Vous pouvez générer une liste de conflits avec git status.

Lorsque la ligne en conflit est rencontrée, Git édite le contenu des fichiers affectés avec des indicateurs visuels qui marquent les deux côtés du contenu en conflit.

<<<<<<< HEAD
conflicted text from HEAD
=======
conflicted text from merging_branch
>>>>>>> merging_branch

Lorsque vous corrigez vos fichiers en conflit et que vous êtes prêt à fusionner, il vous suffit d'exécuter git addet git commitde générer la validation de fusion. Une fois la validation effectuée, git pushles modifications apportées à la branche.

Article de référence: Git merge .

Nesha Zoric
la source
2

Une fois tous les fichiers ajoutés, l'étape suivante est un " git commit ".

"git status" suggérera quoi faire: les fichiers à ajouter sont listés en bas, et une fois qu'ils sont tous terminés, il suggérera un commit en haut, où il explique le statut de fusion de la branche actuelle.

lutin
la source
1

La première chose que je veux clarifier est que les noms de branche ne sont qu'un alias d'un commit spécifique. un commit est ce que git fonctionne, lorsque vous tirez, poussez la fusion et ainsi de suite. Chaque commit a un identifiant unique.

Lorsque vous effectuez une fusion de $ git, ce qui se passe réellement est que git essaie d'avancer rapidement votre branche actuelle vers la validation sur laquelle la branche référencée est activée (en d'autres termes, les deux noms de branches pointent vers la même validation.) Ce scénario est le plus simple pour git. à traiter, car il n'y a pas de nouveau commit. Pensez au maître qui saute sur le lilipad sur lequel votre branche se refroidit. Il est possible de définir l'indicateur --no-ff, auquel cas git créera un nouveau commit, qu'il y ait ou non des conflits de code.

Dans une situation où il y a des conflits de code entre les deux branches que vous essayez de fusionner (généralement deux branches dont l'historique de validation partage une validation commune dans le passé), l'avance rapide ne fonctionnera pas. git peut toujours être capable de fusionner automatiquement les fichiers, tant que la même ligne n'a pas été modifiée par les deux branches dans un fichier en conflit. dans ce cas, git fusionnera les fichiers en conflit pour vous ET les validera automatiquement. Vous pouvez prévisualiser comment git a fait en faisant $ git diff --cached. Ou vous pouvez passer l'indicateur --no-commit à la commande merge, qui laissera les fichiers modifiés dans votre index que vous devrez ajouter et valider. Mais vous pouvez $ git diff ces fichiers pour voir ce que la fusion va changer.

Le troisième scénario est quand il y a des conflits que git ne peut pas résoudre automatiquement. Dans ce cas, vous devrez les fusionner manuellement. À mon avis, c'est plus facile à faire avec une fusion, comme la fusion araxis ou p4merge (gratuit). De toute façon, vous devez faire chaque fichier un par un. Si la fusion semble être bloquée, utilisez $ git merge --continue, pour la pousser. Git devrait vous dire si cela ne peut pas continuer, et si oui, pourquoi pas. Si vous sentez que vous avez raté la fusion à un moment donné, vous pouvez faire $ git merge --abort, et toute fusion sera annulée et vous pourrez recommencer. Lorsque vous avez terminé, chaque fichier que vous avez fusionné sera un fichier modifié qui doit être ajouté et validé. Vous pouvez vérifier où se trouvent les fichiers avec le statut $ git. Si vous n'avez pas encore validé les fichiers fusionnés. Vous devez le faire pour terminer la fusion.

Harry Robbins
la source
0

Il peut être tard. C'est arrivé parce que votre git HEAD n'est pas mis à jour. cette recommandation résoudrait cela git reset HEAD.

s.morteza malekabadi
la source