Comment revenir à la version la plus récente de Git?

303

Je suis récemment passé de SVN à Git et je suis un peu confus à propos de quelque chose. J'avais besoin d'exécuter la version précédente d'un script via un débogueur, j'ai donc fait git checkout <previous version hash>et fait ce que je devais faire.

Maintenant, je veux revenir à la dernière version, mais je ne connais pas le hachage pour cela. Quand je tape git log, je ne le vois pas.

Comment puis-je faire ceci? De plus, y a-t-il un moyen plus facile de changer de version qu'en tapant des hachages - quelque chose comme "revenir en arrière deux versions" ou "aller à la plus récente chronologiquement"?

Nathan Long
la source

Réponses:

371

git checkout masterdevrait faire l'affaire. Pour revenir en arrière deux versions, vous pourriez dire quelque chose comme git checkout HEAD~2, mais mieux vaut créer une branche temporaire basée sur ce temps, doncgit checkout -b temp_branch HEAD~2

Ana Betts
la source
7
Cool! git checkout masterc'est exactement comme ça que je reviens d'une branche. Cela signifie-t-il que lorsque je vérifie une version précédente, je crée essentiellement une branche?
Nathan Long
4
@Nathan: Dans git, une branche est principalement un pointeur mobile vers une certaine révision. Donc, conceptuellement, vous créez une sorte de branche, mais pas dans le sens où git pense aux branches.
DLH
2
Donc, dans le cas le plus simple, où j'ai un tas de changements linéaires, lorsque je vérifie une révision précédente, je déplace le pointeur HEAD là-bas, ce qui signifie git logqu'il s'affichera par rapport à ce point? Et lorsque je passe à la caisse principale, je déplace le pointeur vers la dernière version de la branche principale?
Nathan Long
7
@Nathan: Exactement. HEAD est quelque chose appelé une référence symbolique - c'est en général un pointeur vers une autre référence (la branche actuellement extraite). git checkoutest un moyen de déplacer la tête. Lorsque vous avez détaché HEAD, vous avez indiqué directement le commit donné; lorsque vous extrayez à nouveau le masque, il renvoie au masque. (Et beaucoup de commandes comme git logprennent en fait une plage de révision, qui est par défaut HEAD.)
Cascabel
3
Oui - HEAD est le "pronom" utilisé pour faire référence à "La version du code qui se trouve dans le répertoire de travail". C'est aussi le pronom pour "Le parent de tout ce que vous commettez ensuite"
Ana Betts
54

Lorsque vous extrayez un commit spécifique, git crée une branche détachée. Donc, si vous appelez:

$ git branch 

Vous verrez quelque chose comme:

* (detached from 3i4j25)
  master
  other_branch

Pour revenir à la tête de la branche principale, il vous suffit de passer à nouveau à votre branche principale:

$ git checkout master

Cette commande supprimera automatiquement la branche détachée.

Si git checkoutcela ne fonctionne pas, vous avez probablement modifié des fichiers en conflit entre les branches. Pour vous empêcher de perdre du code, git vous oblige à gérer ces fichiers. Vous avez trois options:

  1. Cachez vos modifications (vous pouvez les faire apparaître plus tard):

    $ git stash
    
  2. Ignorez les modifications réinitialisant la branche détachée:

    $ git reset --hard
    
  3. Créez une nouvelle branche avec les modifications précédentes et validez-les:

    $ git checkout -b my_new_branch
    $ git add my_file.ext
    $ git commit -m "My cool msg"
    

Après cela, vous pouvez revenir à votre branche principale (version la plus récente):

$ git checkout master
Thomio
la source
36

Cela a fait l'affaire pour moi (j'étais toujours sur la branche master):

git reset --hard origin/master
averasko
la source
34
reset --hard est une exagération et montre que vous n'êtes pas au courant des modifications que vous avez apportées. Cela peut entraîner la perte de code.
Thomio
1
Dans mon cas, je voulais me débarrasser des changements non poussés commis accidentellement. Je sais qu'il peut y avoir d'autres méthodes pour y parvenir. Je suis d'accord si vous ne voulez pas perdre vos modifications engagées non poussées, c'est une perte de données.
Csaba Toth
8

Pour revenir à la dernière version:

git checkout <branch-name> 

Par exemple, git checkout masterougit checkout dev

Reggie Pinkham
la source
7

Vous pouvez vérifier en utilisant des noms de branche, pour une chose.

Je sais qu'il existe plusieurs façons de déplacer la tête, mais je laisse le soin à un expert git de les énumérer.

Je voulais juste suggérer gitk --all- je l'ai trouvé extrêmement utile lors du démarrage avec git.

Geai
la source
7

Je commence juste à creuser plus profondément dans git, donc je ne sais si je comprends bien, mais je pense que la bonne réponse à la question de l'OP est que vous pouvez exécuter git log --allavec une spécification de format comme ceci: git log --all --pretty=format:'%h: %s %d'. Cela marque la version en cours d'extraction (HEAD)et vous pouvez simplement saisir la suivante dans la liste.

BTW, ajoutez un alias comme celui-ci .gitconfigavec un format légèrement meilleur et vous pouvez exécuter git hist --all:

  hist = log --pretty=format:\"%h %ai | %s%d [%an]\" --graph

En ce qui concerne les versions relatives, j'ai trouvé ce post , mais il ne parle que des versions plus anciennes, il n'y a probablement rien à faire référence aux versions plus récentes.

haridsv
la source
6

Certaines des réponses ici supposent que vous êtes sur la branche principale avant de décider de retirer un ancien commit. Ce n'est pas toujours le cas.

git checkout -

Vous ramènera à la branche sur laquelle vous étiez précédemment (qu'elle soit maître ou non).

Itai Noam
la source
Pas besoin d'une branche, elle pointera HEAD là où elle pointait auparavant; si vous l'avez fait git checkout hash2après git checkout hash1, git checkout -vous ramènera à hash1.
Mikhail Vasin
3

Lorsque vous revenez à une version précédente,

$ git checkout HEAD~2
Previous HEAD position was 363a8d7... Fixed a bug #32

Vous pouvez voir votre journal des fonctionnalités (hachage) avec cette commande même dans cette situation;

$ git log master --oneline -5
4b5f9c2 Fixed a bug #34
9820632 Fixed a bug #33
...

master peut être remplacé par un autre nom de branche.

Ensuite, vérifiez-le, vous pourrez revenir à la fonctionnalité.

$ git checkout 4b5f9c2
HEAD is now at 4b5f9c2... Fixed a bug #34
kujiy
la source
1

Avec Git 2.23+ (août 2019), la meilleure pratique serait d'utiliser à la git switchplace de la commande déroutantegit checkout .

Pour créer une nouvelle branche basée sur une ancienne version:

git switch -c temp_branch HEAD~2

Pour revenir à la branche maître actuelle:

git switch master
VonC
la source
0

Une solution plus élégante et simple consiste à utiliser

git stash

Il reviendra à la version locale la plus rancunière de la branche et enregistrera également vos modifications dans la cachette, donc si vous souhaitez annuler cette action, faites:

git stash apply
Ilya Gazman
la source
Je sais qu'elle est très ancienne mais je dois faire un commentaire à ce sujet (car je pense que cette solution ne devrait pas être utilisée) - Je n'utiliserais pas cette solution car elle ne résout pas ce problème mais un problème différent. avec cette solution de stockage chaque fois que vous souhaitez passer à un commit précédent, vous "enregistrez" des données, ce qui est très inutile dans ce cas. La façon la plus juste et la plus élégante est (comme indiqué précédemment) de simplement commander <branch>.
Maayao