web-dev-qa-db-fra.com

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

J'ai lu la section Branchement et fusion de base du manuel de la communauté Git.

Alors je le suis et crée une branche: experimental.

Alors je:

  1. passer à la branche expérimentale (git checkout experimental)
  2. faire un tas de changements
  3. commettez-le (git commit -a)
  4. passer à la branche master (git checkout master)
  5. faire des changements et commettre là
  6. revenez à experimental (expérimental git checkout)
  7. fusion master change à experimental (git merge master)
  8. il y a des conflits mais après les avoir résolus, j'ai "git add myfile"

  9. Et maintenant je suis coincé, je ne peux pas revenir 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 pouvoir retourner dans ma branche principale?

249
michael

En cas de conflit lors d'une fusion, vous devez terminer la validation de la fusion manuellement. On dirait que vous avez effectué les deux premières étapes: éditez les fichiers en conflit, puis exécutez git add sur eux pour les marquer comme résolus. Enfin, vous devez réellement valider la fusion avec git commit. À ce stade, vous pourrez à nouveau changer de branche.

233
Jimmy Cuadra

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 042e29 , commit c261a87 , commit 367ff69 (14 déc 2016) par Chris Packham (cpackham) .
(Fusionnée par Junio ​​C Hamano - gitster - dans commit 05f6e1b , 27 décembre 2016)

Voir notes de version 2.12 .

merge: ajoute l'option '--continue' comme synonyme de 'git commit'

Enseignez à git merge 'l'option --continue qui permet de "poursuivre" une fusion en la complétant.
La manière traditionnelle de réaliser une fusion après la résolution de conflits consiste à utiliser 'git commit'.
Maintenant, avec des commandes telles que 'git rebase' et 'git cherry-pick' ayant une option '--continue' ', l'ajout d'une telle option à' git merge 'présente une interface utilisateur cohérente. .

117
VonC

Au cas où vous seriez coincé lors d’une fusion/rebase, vous pouvez toujours

git reset --hard

pour restaurer votre travail à l'état du dernier commit. Vos modifications de l’arborescence de travail seront perdues. Par conséquent, si vous aviez des modifications locales avant la fusion, elles disparaîtront. C’est pourquoi il est conseillé de ne pas démarrer une fusion lorsque vous avez des modifications locales. :)

22
Bombe

Juste git commit le.

Eventuellement git abort it:
J'ai rencontré un conflit de fusion. Comment puis-je annuler la fusion?

Pour vous simplifier la vie, installez kdiff3 et configurez-le comme un outil mergetool. 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

10
Shimon Doodkin

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 branchb) en suivant son historique de validation.

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

Exécutez git log pour 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 de 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 voulez voir quels fichiers ne sont pas fusionnés à tout moment après un conflit de fusion, vous pouvez exécuter git status


Ainsi, en cas de conflit de fusion, vous devez résoudre le conflit, puis ajouter les modifications apportées à la zone de stockage intermédiaire à l'aide de git add filename, puis les valider à l'aide de la commande git commit suspendue par git. J'espère que cela explique votre requête. Visitez également le lien ci-dessus pour une compréhension détaillée. En cas de question, veuillez commenter ci-dessous, je serai ravi de vous aider.

10
Sourav Prem

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. [commande git suggère, par exemple git merge --continue, git cherry-pick --continue, git rebase --continue]
6
Timidfriendly

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

"git status" suggérera ce qu'il faut faire: les fichiers qui n'ont pas encore été ajoutés sont listés en bas, et une fois qu'ils sont tous terminés, cela suggère un commit en haut, qui explique le statut de fusion de la branche en cours.

2
hobgoblin

Un conflit de fusion se produit lorsque deux branches que vous essayez de fusionner ont 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 éditera le contenu des fichiers affectés avec des indicateurs visuels indiquant 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, tout ce que vous avez à faire est d’exécuter git add et git commit pour générer la validation de fusion. Une fois la validation effectuée, git Push les modifications apportées à la branche.

Article de référence: Git merge .

2
Nesha Zoric

La première chose que je veux préciser est que les noms de branche ne sont qu'un alias pour un commit spécifique. un commit est ce que git fonctionne, quand vous tirez, Push fusionnez et ainsi de suite. Chaque commit a un identifiant unique.

Lorsque vous fusionnez $ git, ce qui se passe réellement, c’est que git essaie d’avancer rapidement votre branche actuelle vers le commit sur lequel se trouve la branche référencée (en d’autres termes, les deux noms de branche pointent sur le même commit.) 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 repose. Il est possible de définir le drapeau --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 existe 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 d'un fichier en conflit. dans ce cas, git fusionnera pour vous les fichiers en conflit ET les validera automatiquement. Vous pouvez avoir un aperçu de ce que git a fait en faisant $ git diff --cached. Vous pouvez également passer l'indicateur --no-commit à la commande de fusion, ce qui laissera dans votre index les fichiers modifiés que vous devrez ajouter et valider. Mais vous pouvez $ git diff ces fichiers pour vérifier ce que la fusion va changer.

Le troisième scénario est celui où il y a des conflits git ne peut pas résoudre automatiquement. Dans ce cas, vous devrez les fusionner manuellement. À mon avis, cela est plus facile à faire avec une fusion prise, comme araxis merge ou p4merge (gratuit). De toute façon, vous devez créer chaque fichier un par un. Si la fusion semble être bloquée, utilisez $ git merge --continue, pour la déplacer. Git devrait vous dire si ça ne peut pas continuer, et si oui pourquoi pas. Si vous pensez que vous avez interrompu la fusion à un moment donné, vous pouvez faire $ git merge --abort, et toute fusion sera annulée et vous pourrez recommencer. Une fois que 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 faire cela pour terminer la fusion. Vous devez terminer ou annuler la fusion avant de pouvoir changer de branche.

1
Harry Robbins

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

0