web-dev-qa-db-fra.com

Quelle est la différence entre git reset --hard et git reset --merge

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?

38
opsb

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éplacer HEAD.

12
VonC

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.

8
manojlds

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.

3
Jon