Dans mes expériences, je n'ai pas pu trouver de différence fonctionnelle entre
git reset --hard
et
git reset --merge
Les instructions d'utilisation ne donnent aucune indication non plus
--hard reset HEAD, index and working tree
--merge reset HEAD, index and working tree
J'utilise régulièrement le --hard
option afin de comprendre comment cela fonctionne. Quelle est la différence entre le --merge
et le --hard
options?
À la vôtre, Olly
Peut-être qu'un exemple aiderait ici, utilisons la séquence suivante:
cd git_repo
touch file_one
git add file_one
git commit -m "commit one" # sha1 of 123abc
echo "one" >> ./file_one
git commit -a -m "commit two" # sha1 of 234bcd
echo "two" >> ./file_one
git add . # populate index with a change
echo "three" >> ./file_one # populate working area with a change
Maintenant, si j'essaye
git reset --merge 123abc
Je reçois
error: Entry 'file_one' not uptodate. Cannot merge.
fatal: Could not reset index file to revision '123abc'
la raison étant que file_one a des changements dans la zone de travail et l'index
Pour y remédier, je le fais
git add .
git reset --merge 123abc
Cette fois, cela fonctionne, mais j'obtiens le même résultat que git reset --hard
. L'index est vide, la zone de travail est vide, file_one est vide, comme c'était le cas après le premier commit.
Quelqu'un peut-il proposer les étapes qui illustrent la différence?
L'article " Git annuler, réinitialiser ou rétablir? " résume les différentes utilisations, lorsqu'il est utilisé avec ORIG_HEAD
:
# Reset the latest successful pull or merge
$ git reset --hard ORIG_HEAD
# Reset the latest pull or merge, into a dirty working tree
$ git reset --merge ORIG_HEAD
Comme mentionné par manojlds 's answer , et illustré par le blog post , ce dernier est particulièrement utile lorsque vous voyez un message d'erreur comme:
fatal: You have not concluded your merge. (`MERGE_HEAD` exists)
Le thread " [PATCH] refuse de fusionner pendant une fusion " détaille également ce point:
git reset --merge HEAD
Il remplit le cas assez différent où vous avez effectué une fusion nette avec des modifications non validées dans la zone de travail, mais que vous souhaitez ensuite annuler la fusion sans perdre les modifications non validées.
En l'absence de modifications, vous utiliseriez simplement--hard
, mais ici, vous voulez déplacer la pointe de la branche tout en les fusionnant, comme pour "git checkout -m
'fait pour déplacerHEAD
.
Cela est utile lorsque vous effectuez une extraction avec des modifications dans l'arborescence de travail et constatez que la fusion n'est pas comme prévu (vous vous attendiez peut-être à ce que les validations n'affectent pas les fichiers sur lesquels vous travailliez). À ce stade, si vous faites git reset --hard ORIG_HEAD
, vous emportez tout, y compris vos changements locaux. Si tu fais git reset --merge ORIG_HEAD
, vous conserverez vos modifications locales.
Apparemment selon:
http://www.kernel.org/pub/software/scm/git/docs/git-reset.html
- hard - Correspond à l'arborescence de travail et à l'index de celui vers lequel l'arborescence est basculée. Toute modification des fichiers suivis dans l'arborescence de travail depuis
<commit>
Sont perdus.- merge - Réinitialise l'index pour correspondre à l'arborescence enregistrée par le commit nommé et met à jour les fichiers qui sont différents entre le commit nommé et le commit actuel dans l'arbre de travail.