Comment revenir au dernier commit après avoir vérifié un commit précédent?

477

Je vérifie parfois une version précédente du code pour l'examiner ou le tester. J'ai vu des instructions sur la marche à suivre si je souhaite modifier les validations précédentes - mais supposons que je n'apporte aucune modification. Après avoir fait par exemple git checkout HEAD^, comment puis-je revenir à la pointe de la branche? .. git logne me montre plus le SHA du dernier commit.

Leo Alekseyev
la source
11
En ce qui concerne la git logphrase de votre question, vous pouvez toujours exécuter git log --all(ou plus utilement, git log --oneline --graph --all).
Wildcard

Réponses:

607

Si vous savez que le commit dans lequel vous souhaitez revenir est le chef d'une branche ou est étiqueté, vous pouvez simplement

git checkout branchname

Vous pouvez également utiliser git reflogpour voir les autres validations que votre HEAD (ou toute autre référence) a signalées dans le passé.


Modifié pour ajouter:

Dans les versions plus récentes de Git, si vous ne couriez que git checkoutou autre chose pour déplacer votre HEADfois, vous pouvez également faire

git checkout -

pour revenir à l'endroit où il se trouvait avant le dernier paiement. Cela était motivé par l'analogie avec l'idiome du shell cd -pour revenir au répertoire de travail dans lequel il se trouvait auparavant.

Phil Miller
la source
27
Je voudrais mentionner que l'exemple typique serait "git checkout master". L'une des difficultés que j'ai eues à apprendre à utiliser git était de ne pas savoir quels mots clés spécifiques (par exemple "maître") je peux réellement remplacer par des mots de substitution comme "nom de branche".
AbePralle
3
mastern'est pas vraiment une sorte de mot-clé HEAD. Il s'agit simplement du nom de branche par défaut dans un nouveau référentiel. Vous pouvez exécuter git branchpour obtenir une liste de branches dans votre référentiel et git tag -lpour une liste de balises. De même, originest le nom par défaut de la télécommande à partir de laquelle un référentiel est cloné, mais il n'y a rien de spécial à ce sujet.
Phil Miller
3
Si ce n'était pas clair, git reflogvous donne une liste de hachages, à quel moment vous pouvez l'utiliser git checkout [commit-hash].
jbnunn
J'ai supprimé un fichier et essayé la commande, mais elle ne le réinitialise pas complètement. Tout d'abord, ce n'est pas récursif. Ensuite, quand j'essaye ceci sur le fichier que j'ai supprimé, git me dit ensuite que HEAD est détaché. Que faire?
Daniel S.
1
@DanielS .: La question et ma réponse portaient sur les commits , alors que vous parlez de fichiers. Git les traite plutôt différemment.
Phil Miller,
27

git checkout master

master est l'astuce ou le dernier commit. gitk ne vous montrera que où vous vous trouvez dans l'arbre à ce moment-là. git reflog affichera toutes les validations , mais dans ce cas, vous voulez juste l'astuce, alors git checkout master.

Bruce Wells
la source
1
Cette. Ougit checkout branchname
Alex
19

Je suis tombé sur cette question tout à l'heure et j'ai quelque chose à ajouter

Pour accéder au commit le plus récent:

git checkout $(git log --branches -1 --pretty=format:"%H")

Explication:

git log --branchesaffiche le journal des
-1validations de toutes les branches locales, limite à une validation →
--pretty=format:"%H"format de validation le plus récent pour afficher uniquement le hachage de validation,
git checkout $(...)utilisez la sortie du sous-shell comme argument pour le paiement

Remarque:

Cela se traduira cependant par une tête détachée (car nous passons directement à la validation). Cela peut être évité en extrayant le nom de la branche à l'aide de sed, expliqué ci-dessous.


Pour accéder à la branche du commit le plus récent:

git checkout $(git log --branches -1 --pretty=format:'%D' | sed 's/.*, //g')

Explication:

git log --branchesaffiche le journal des
-1validations de toutes les branches locales limite à une validation → le
--pretty=format:"%D"format de validation le plus récent pour afficher uniquement les noms de référence
| sed 's/.*, //g'ignore tout sauf la dernière des multiples références (*)
git checkout $(...)utilise la sortie du sous-shell comme argument pour le paiement

*) Les branches HEAD et distantes sont répertoriées en premier, les branches locales sont répertoriées en dernier par ordre alphabétique décroissant, de sorte que celle qui reste sera le nom de la première branche par ordre alphabétique

Remarque:

Cela n'utilisera toujours le nom de la première branche (par ordre alphabétique) que s'il y en a plusieurs pour ce commit.


Quoi qu'il en soit, je pense que la meilleure solution serait simplement d'afficher les noms de référence pour le commit le plus récent pour savoir où payer:

git log --branches -1 --pretty=format:'%D'

Par exemple, créez l'alias git toppour cette commande.

816-8055
la source
1
D'une manière ou d'une autre, j'ai bousillé la deuxième commande ... Corrigé, il vous vérifiera maintenant correctement sur la branche du commit le plus récent.
816-8055
Alias ​​Bash / zsh pour la commande de retour à la têtealias git-head='git checkout $(git log --branches -1 --pretty=format:"%D" | sed "s/.*, //g")'
Hi-Angel
9

Jetez un œil à l'interface graphique ... gitkelle montre tous les commits. Parfois, il est plus facile de travailler graphiquement ... ^^

tanascius
la source
oui, c'est en fait ainsi que je l'ai fait dans le passé - mais je n'ai pas l'interface graphique disponible pour le moment
Leo Alekseyev
7

Pour cela, vous pouvez utiliser l'une des commandes git suivantes:

git checkout master
git checkout branchname
hothead1000
la source
4

afficher toutes les branches et valider
git log --branches --oneline

afficher le dernier journal de git de validation -
branches -1 - en ligne

afficher avant le dernier commit
git log --branches -2 --oneline

abdesselam
la source
La première commande va-t-elle réellement valider le code actuellement mis en scène, ou suis-je en train de mal interpréter cela?
Lazerbeak12345
3
git reflog //find the hash of the commit that you want to checkout
git checkout <commit number>>
Atif Majeed
la source
0

Si vous avez une branche différente de master, une méthode simple consiste à extraire cette branche, puis à extraire master. Voila, vous êtes de retour à la pointe du maître. Il y a probablement des moyens plus intelligents ...

ConorR
la source
0

Vous pouvez simplement le faire git pull origin branchname. Il récupérera à nouveau le dernier commit.

Ankit Singh
la source
Je ne le recommande pas si vous ne voulez pas tirer de l'amont. Il ne faut gérer les conflits de fusion que lorsqu'ils sont prêts à le faire.
Lazerbeak12345
Eh bien, dans ce cas, la tête restera un état détaché même si vous passez à la dernière validation.
Ankit Singh
-2

Si votre dernier commit est sur la branche master, vous pouvez simplement utiliser

git checkout master
Jackie Xu
la source