499 votes

Quelle est la différence entre "git reset" et "git checkout" ?

J'ai toujours pensé que git reset y git checkout sont identiques, dans le sens où ils ramènent tous deux le projet à un commit spécifique. Cependant, je pense qu'ils ne peuvent pas être exactement les mêmes, car cela serait redondant. Quelle est la différence réelle entre les deux ? Je suis un peu confus, car le svn a seulement svn co pour annuler la livraison.

AJOUTÉ

VonC et Charles ont expliqué les différences entre git reset y git checkout vraiment bien. D'après ce que j'ai compris, il s'agit de git reset rétablit toutes les modifications par rapport à un commit spécifique, tandis que git checkout se prépare plus ou moins à la création d'une branche. Les deux diagrammes suivants m'ont été très utiles pour parvenir à cette compréhension :

http://a.imageshack.us/img651/1559/86421927.pnghttp://a.imageshack.us/img801/1986/resetr.png

AJOUTÉ 3

En http://think-like-a-git.net/sections/rebase-from-the-ground-up/using-git-cherry-pick-to-simulate-git-rebase.html L'extraction et la réinitialisation peuvent émuler le rebasement.

enter image description here

git checkout bar 
git reset --hard newbar 
git branch -d newbar 

enter image description here

0 votes

Jeter un coup d'œil sur git-scm.com/blog/2011/07/11/reset.html

1 votes

Re : "Est-ce une erreur ou une simplification excessive ?" Oui, le premier diagramme est trompeur en ce qui concerne la différence entre l'extraction et la réinitialisation. (Il peut être correct en ce qui concerne la -- files variantes ; je n'en suis pas sûr). Ce diagramme donne l'impression que la principale différence réside dans le fait qu'ils affectent l'indice ou le DT. Voir ma réponse à ce sujet. Les deuxième et troisième diagrammes sont très utiles pour voir la différence réelle. Les 4ème et 5ème diagrammes sont utiles pour vérifier si vous comprenez ce que font ces commandes, mais ne vous aideront pas vraiment à y parvenir.

0 votes

J'ai trouvé la section "Vérifier" du "Git Tools Reset Demystified" pour donner le résumé le plus utile.

2voto

wiki1000 Points 91

Les deux commandes (reset et checkout) sont complètement différentes.

checkout X N'EST PAS reset --hard X

Si X est un nom de branche, checkout X modifiera la branche actuelle alors que reset --hard X ne le fera pas.

1voto

aderchox Points 158

Voici une clarification de l'ambiguïté :

  • git checkout déplacera le HEAD vers un autre commit( pourrait être un changement utilisant également un nom de marque), mais :

    1. quelle que soit la branche sur laquelle vous vous trouvez, le pointeur sur l'extrémité de cette branche (par exemple, "main") restera inchangé (vous pourriez donc vous retrouver dans une branche tête détachée ).

    2. De plus, la zone de préparation et le répertoire de travail resteront inchangés (dans le même état qu'avant l'extraction).

Exemples :

git checkout 3ad2bcf <--- checkout to another commit
git checkout another-branch <--- checkout to another commit using a branchname
  • git reset déplace également le HEAD Cependant, une fois de plus, avec deux différences :

    1. Il déplace également le pointeur qui pointe sur le commit à l'extrémité de la branche courante. Par exemple, disons que le pointeur de la branche courante est nommé "main", puis vous effectuez un git-reset, maintenant, le pointeur main pointera vers un autre commit, et le HEAD pointera également vers ce commit (en fait, HEAD pointe vers ce commit). indirectement en pointant sur le pointeur principal, il s'agit toujours d'une tête attachée ( !) mais cela ne fait aucune différence ici).

    2. Git-reset ne laisse pas nécessairement la zone de préparation et le répertoire de travail dans le même état que celui dans lequel ils se trouvaient avant la réinitialisation. Comme vous le savez, il existe trois types de réinitialisation : douce, mixte (par défaut) et dure :

      • Avec la réinitialisation douce, la zone de transit et le répertoire de travail restent tous deux dans l'état où ils se trouvaient avant la réinitialisation (similaire à l'extraction à cet égard, mais n'oubliez pas la différence #1).
      • Avec la réinitialisation mixte, qui est le type de réinitialisation par défaut, en plus de la différence n° 1, la zone de transit de l'aire de transit peut être réinitialisée. Proposition d'engagement suivant (ce que vous avez ajouté dans git), sera également mis à la place du nouveau commit pointé par HEAD. MAIS dans le répertoire de travail, tous les fichiers auront toujours vos dernières modifications (c'est pourquoi ce type de réinitialisation est celui par défaut, afin que vous ne perdiez pas votre travail).
      • Avec la réinitialisation, en plus de la différence #1, les trois arbres HEAD, staging-area et AUSSI le working-directory changeront pour le nouveau commit pointé par HEAD.

Exemples :

git reset --soft 3ad2bcf
git reset da3b47

1voto

kob003 Points 175

git reset -> supprime tous les fichiers de la base de données zone de transit c'est-à-dire qu'il annule git add <files>

git reset <commit_ID> -> annule les livraisons et la mise en scène de tous les fichiers après la livraison spécifiée.

en cas d'ajout --hard avec la commande de réinitialisation, puis il supprime les fichiers de l'aire de transit ainsi que supprime de votre répertoire.

git checkout <commit_ID> -> vous êtes ramené à l'état de livraison spécifié, mais vous n'êtes dans aucune branche.

si vous tapez git branch -a vous verrez que vous êtes dans

(HEAD détaché à <commit_ID>)

.

selon la console :

Vous êtes en état de "tête détachée". Vous pouvez regarder autour de vous, faire des expérimentales et les valider, et vous pouvez rejeter toutes les validations que vous faites dans cet état. dans cet état sans impacter aucune branche en revenant sur une branche. à une branche.

et deux options s'offrent à vous :

  1. git switch -c <new-branch-name> une nouvelle branche sera créée à partir de ce commit et deviendra votre branche actuelle.
  2. git switch -c -> il s'agit en fait d'annuler la commande checkout qui vous ramène à votre ancienne branche.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X