Je suis tombé sur un conflit de fusion. Comment puis-je interrompre la fusion ?

J'ai utilisé git pull et j'ai eu un conflit de fusion :

unmerged:   _widget.html.erb

You are in the middle of a conflicted merge.

Je sais que l'autre version du fichier est bonne et que la mienne est mauvaise, donc toutes mes modifications devraient être abandonnées. Comment puis-je faire cela ?

Puisque votre pull a échoué, alors HEAD (et non HEAD^) est le dernier commit "valide" sur votre branche :

git reset --hard HEAD

L'autre élément que vous voulez est de laisser leurs changements écraser les vôtres.

Les anciennes versions de git vous permettaient d'utiliser la stratégie de fusion "theirs" :

git pull --strategy=theirs remote_branch

Mais cela a été supprimé depuis, comme expliqué dans ce message de Junio Hamano (le mainteneur de Git). Comme indiqué dans le lien, vous devriez plutôt faire ceci :

git fetch origin
git reset --hard origin
Commentaires (11)

Je pense que c'est de git reset dont vous avez besoin.

Faites attention au fait que git revert signifie quelque chose de très différent de, disons, svn revert - dans Subversion, le revert va supprimer vos modifications (non validées), renvoyant le fichier à la version actuelle du dépôt, alors que git revert "défait" une validation.

git reset devrait faire l'équivalent de svn revert, c'est-à-dire, supprimer vos changements non désirés.

Commentaires (0)

Dans ce cas d'utilisation particulier, vous ne souhaitez pas vraiment interrompre la fusion, mais simplement résoudre le conflit d'une manière particulière.

Il n'y a pas non plus de besoin particulier de réinitialiser et d'effectuer une fusion avec une stratégie différente. Les conflits ont été correctement mis en évidence par git et l'obligation d'accepter les modifications de l'autre partie ne concerne que ce seul fichier.

Pour un fichier non fusionné dans un conflit, git rend disponible la base commune, les versions locales et distantes du fichier dans l'index. (C'est de là qu'elles sont lues pour être utilisées dans un outil de comparaison à trois voies par git mergetool). Vous pouvez utiliser git show pour les visualiser.

# common base:
git show :1:_widget.html.erb

# 'ours'
git show :2:_widget.html.erb

# 'theirs'
git show :3:_widget.html.erb

La façon la plus simple de résoudre le conflit pour utiliser la version distante mot pour mot est :

git show :3:_widget.html.erb >_widget.html.erb
git add _widget.html.erb

Ou, avec git >= 1.6.1 :

git checkout --theirs _widget.html.erb
Commentaires (3)