Aller à une révision particulière

582

J'ai cloné un référentiel git d'un certain projet. Puis-je remettre les fichiers à leur état initial et quand je les passe en revue, passez à la révision 2, 3, 4 ... la plus récente? J'aimerais avoir un aperçu de l'évolution du projet.

xralf
la source

Réponses:

876

Utilisez git checkout <sha1>pour extraire un commit particulier.

Marcelo Cantos
la source
2
Tu peux le faire git log -n1. Mais à moins d’ git checkoutéchouer, c’est un gaspillage d’efforts.
Marcelo Cantos
2
Ça marche. J'ai dû utiliser le sha1 complet (non partiel). Et si je veux mettre le projet en deuxième révision? git logne montre que le premier commit maintenant, puis-je trouver le sha1 du prochain commit?
xralf
6
Vous ne devez utiliser qu'une quantité suffisante de sha1 pour garantir l'unicité. Vous avez peut-être eu une coïncidence malchanceuse. Git n'a aucune idée du "prochain" commit; l'histoire est un DAG avec toutes les flèches pointant vers l'arrière. Vous devez exécuter git log --onelineet coller la sortie dans un fichier texte pour référence (les sommes abrégées sha1 qu'il fournit sont garanties d'être uniques). Une autre option, si votre historique est linéaire, est de déterminer le nombre de commits depuis le premier commit jusqu'à ce qu'ils soient masterutilisés git checkout master~543(s'il y a 543 commits) git checkout master~542, etc.
Marcelo Cantos
20
et comment récupérer le commit actuel depuis "git checkout <sha1>"?
ア レ ッ ク ス
6
@AlexanderSupertramp Checkout la succursale.
Marcelo Cantos
50

Pour accéder à une version / validation particulière, exécutez les commandes suivantes. CODE HASH que vous pouvez obtenirgit log --oneline -n 10

git reset --hard HASH-CODE

Remarque - Après avoir réinitialisé une version / validation particulière, vous pouvez exécuter git pull --rebase, si vous souhaitez ramener toutes les validations qui sont rejetées.

J4cK
la source
1
Notez qu'un resetpas seulement extraire un point particulier dans le graphique, il déplacera également votre branche actuellement extraite
Liam
De plus reset, toutes vos modifications en attente sont ignorées.
WilliamKF
2
--hard flag supprimera tous les commits après ledit hachage .... vous voulez probablement ajouter ce petit détail ici. Je suis sûr que les gens ont perdu l'histoire et se sont demandé pourquoi.
Urasquirrel
git pull --rebasene fonctionne que si vous avez une télécommande pour votre repo et qu'elle est à jour.
Keith Thompson
19

Vous pouvez obtenir une vue graphique de l'historique du projet avec des outils comme gitk. Exécutez simplement:

gitk --all

Si vous souhaitez retirer une branche spécifique:

git checkout <branch name>

Pour une validation spécifique, utilisez le hachage SHA1 au lieu du nom de la branche. (Voir Treeish dans le Git Community Book , qui est une bonne lecture, pour voir d'autres options pour naviguer dans votre arbre.)

git log dispose d'un ensemble d'options pour afficher également un historique détaillé ou résumé.

Je ne connais pas de moyen simple d' avancer dans l'historique des validations. Les projets avec une histoire linéaire ne sont probablement pas si communs. L'idée d'une "révision" comme vous le feriez avec SVN ou CVS ne correspond pas si bien à Git.

Tapis
la source
2
Attention: git ne vous mentira pas en vous donnant une seule histoire linéaire du projet. C'est à moins que le projet n'évolue réellement de cette façon.
Andres Jaan Tack,
Aller de l'avant n'a logiquement aucun sens (même dans une histoire linéaire), car un commit ne fait aucune référence au "futur". Au mieux, vous pouvez identifier toutes les validations qui ont la validation en question en tant que parent. Attention, reculer n'est pas non plus un exercice trivial, en raison des fusions.
Marcelo Cantos
5

En utilisant la clé SHA1 d'un commit, vous pouvez effectuer les opérations suivantes:

  • Tout d'abord, recherchez le commit que vous souhaitez pour un fichier spécifique:

    git log -n <# commits> <file-name>

    Ceci, en fonction de votre <# commits>, générera une liste de validations pour un fichier spécifique.

    CONSEIL: si vous n'êtes pas sûr de vous engager cherchez, une bonne façon de savoir est d' utiliser la commande suivante: git diff <commit-SHA1>..HEAD <file-name>. Cette commande montrera la différence entre la version actuelle d'un commit et une version précédente d'un commit pour un fichier spécifique.

    REMARQUE: la clé SHA1 d'un commit est formatée dans la git log -nliste des comme:

commettre <SHA1 id>

  • Ensuite, vérifiez la version souhaitée:

    Si vous avez trouvé la version / commit souhaitée, utilisez simplement la commande: git checkout <desired-SHA1> <file-name>

    Cela placera la version du fichier que vous avez spécifié dans la zone de transfert. Pour le retirer de la zone de transit, utilisez simplement la commande:reset HEAD <file-name>

Pour revenir à l'endroit où le référentiel distant est pointé, utilisez simplement la commande: git checkout HEAD <file-name>

sorcier
la source
2

J'étais dans une situation où nous avons une branche principale, puis une autre branche appelée 17.0 et à l'intérieur de cette 17.0, il y avait un hachage de validation sans dire "XYZ" . Et le client reçoit une version jusqu'à cette révision XYZ. Nous avons maintenant rencontré un bug et cela doit être résolu pour ce client. Nous devons donc créer une branche distincte pour ce client jusqu'à ce hachage "xyz". Voici donc comment je l'ai fait.

J'ai d'abord créé un dossier avec ce nom de client sur ma machine locale. Dites que le nom du client est "AAA" une fois que ce dossier est créé, émettez la commande suivante à l'intérieur de ce dossier:

  1. git init
  2. git clone Après cette commande, vous serez sur la branche master. Alors passez à la branche souhaitée
  3. git checkout 17.0 Cela vous amènera à la branche où votre commit est présent
  4. git checkout Cela prendra votre dépôt jusqu'à ce que le hachage soit validé. Voir le nom de la branche dans laquelle elle a été changée en hash de validation non. Donnez maintenant un nom de branche à ce hachage
  5. git branch ABC Cela créera une nouvelle branche sur votre machine locale.
  6. git checkout ABC
  7. git push origin ABC Cela poussera cette branche vers le référentiel distant et créera une branche sur le serveur git. Vous avez terminé.
cendré
la source
1

Une façon serait de créer toutes les validations jamais apportées aux correctifs. extraire le commit initial puis appliquer les correctifs dans l'ordre après la lecture.

utiliser git format-patch <initial revision>et ensuite git checkout <initial revision>. vous devriez obtenir une pile de fichiers dans votre directeur en commençant par quatre chiffres qui sont les correctifs.

quand vous avez fini de lire votre révision, faites git apply <filename>ce qui devrait ressembler git apply 0001-*et compter.

Mais je me demande vraiment pourquoi vous ne voudriez pas simplement lire les correctifs à la place? Veuillez poster ceci dans vos commentaires parce que je suis curieux.

le manuel de git me donne aussi ceci:

git show next~10:Documentation/README

Affiche le contenu du fichier Documentation / README tel qu'il était dans le 10ème dernier commit de la branche suivante.

vous pouvez également consulter git blame filenamece qui vous donne une liste où chaque ligne est associée à un hachage de validation + auteur.

Alex
la source
1

Pour accéder à un code validé spécifique, vous avez besoin du code de hachage de cette validation. Vous pouvez obtenir ce code de hachage de deux manières:

  1. Obtenez-le depuis votre compte github / gitlab / bitbucket. (C'est sur votre URL de validation, c'est-à-dire: github.com/user/my_project/commit/ commit_hash_code ), ou vous pouvez
  2. git loget vérifiez vos validations récentes sur cette branche. Il vous montrera le code de hachage de votre validation et le message que vous avez laissé pendant que vous validiez votre code. Copiez et faitesgit checkout commit_hash_code

Après avoir migré vers ce code, si vous souhaitez travailler dessus et apporter des modifications, vous devez créer une autre branche avec git checkout -b <new-branch-name>, sinon, les modifications ne seront pas conservées.

Ianiv Hojman
la source
0

Pour vérifier un commit (nb vous regardez le passé!).

  • git checkout "commmitHash"

Pour redémarrer brutalement à partir d'un commit et supprimer les dernières branches que vous avez probablement gâchées.

  • git reset --hard "commmitHash"
Jeremy
la source