Basculer temporairement la copie de travail vers une validation Git spécifique

248

Comment passer à une validation Git spécifique sans perdre toutes les validations faites après ?

Je veux que les fichiers locaux soient modifiés, mais la base de données des validations restera intacte, seul le pointeur de position actuelle est défini sur la validation actuellement sélectionnée.

Je veux changer l'état des fichiers en commit spécifique, exécuter le projet et, une fois terminé, restaurer les fichiers au dernier commit.

Comment faire cela sans zipper tout le dossier du projet?

Paul
la source

Réponses:

344

Si vous êtes dans une certaine branche mybranch, allez-y et git checkout commit_hash. Ensuite, vous pouvez retourner à votre succursale par git checkout mybranch. J'ai eu le même jeu bissectant un bogue aujourd'hui :) De plus, vous devriez connaître git bissect .

Alexander Pavlov
la source
6
Notez que vous pouvez simplement le faire git checkout commit_hashsi vous êtes sur un référentiel propre et que vous n'avez pas besoin de créer de branche. Pourrait être plus facile pour certains cas d'utilisation (comme le mien).
enderland
@enderland: votre HEAD pointe toujours vers une branche, normalement :)
Alexander Pavlov
J'ai eu un problème où j'ai dû utiliser tout le hachage de validation car un partiel n'a pas été accepté.
mightyiam
6
Votez pour la git bisectréférence; quel outil extrêmement utile!
Niek
54

Tout d'abord, utilisez git logpour voir le journal, choisissez le commit que vous voulez, notez le hachage sha1 qui est utilisé pour identifier le commit. Ensuite, exécutez git checkout hash. Une fois que vous avez terminé, git checkout original_branch. Cela a l'avantage de ne pas déplacer le HEAD, il bascule simplement la copie de travail vers un commit spécifique.

Femaref
la source
4
Je pense que tu veux dire git checkout <original_branch>. git checkout HEADest effectivement un NOOP
Abe Voelker
3
git reset --hard <hash>modifie la TÊTE de la branche actuelle, tandis que git checkout <hash>vous obtenez un paiement détaché qui ne modifie aucune branche, et vous pouvez facilement revenir sans connaître l'ID de hachage d'origine de votre branche, comme indiqué dans cette réponse.
jofel
@Femaref Beginner's question: étant donné le contexte de cette question (passer temporairement à un commit antérieur), pourquoi ce serait un avantage ou un inconvénient de déplacer ou de ne pas déplacer le HEAD?
fou sur natty
@nuttyaboutnatty En supposant que ma modification est approuvée, elle devrait répondre à votre question. HEAD se déplace en tout cas; mais lors d'une extraction, la référence de branche sur laquelle pointe HEAD n'est pas elle-même déplacée.
echristopherson
15

En plus des autres réponses ici vous montrant comment git checkout <the-hash-you-want>cela vaut la peine de savoir que vous pouvez revenir à l'endroit où vous utilisiez:

git checkout @{-1}

C'est souvent plus pratique que:

git checkout what-was-that-original-branch-called-again-question-mark

Comme vous pouvez vous git checkout @{-2}y attendre, vous ramènera à la succursale où vous étiez il y a deux git checkoutans, et de même pour les autres numéros. Si vous vous souvenez où vous étiez pour un plus grand nombre, vous devriez obtenir une sorte de médaille pour cela.


Malheureusement pour la productivité, git checkout @{1}ne vous emmène pas dans la branche où vous serez à l'avenir, ce qui est dommage.

Benjohn
la source
1
Notez que git checkout -c'est un raccourci pourgit checkout @{-1}
Nathanael
@Nathanael OMGOD , pas question … cela change tout! Bien merci! … J'allais incorporer cela dans la réponse, mais je pense qu'il est également utile de connaître la @{n}syntaxe générale , car elle fonctionne avec de nombreuses commandes git. J'ai eu du mal à ajouter votre raccourci sans rendre la réponse assez confuse. Au lieu de cela, j'ai voté pour votre commentaire - j'espère que les gens le verront. Merci encore.
Benjohn
1
Aucun problème. Cette discussion est de toute façon tangentielle à la question réelle. Plus de bonus! J'utilise souvent la même syntaxe pour fusionner des fonctionnalités dans une version. par exemple, git merge -pour fusionner la branche que vous avez extraite en dernier dans la branche actuellement extraite. C'est comme cd -dans bash.
Nathanael