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
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.
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