Commençons par une description qualitative de ce que nous voulons faire (une grande partie de ceci est dit dans la réponse de Ben Straub). Nous avons fait un certain nombre de commits, dont cinq ont modifié un fichier donné, et nous voulons revenir à l'une des versions précédentes. Tout d'abord, git ne conserve pas les numéros de version des fichiers individuels. Il ne fait que suivre le contenu - un commit est essentiellement un instantané de l'arbre de travail, accompagné de quelques métadonnées (par exemple, le message du commit). Donc, nous devons savoir quel commit a la version du fichier que nous voulons. Une fois que nous le savons, nous devons faire un nouveau commit pour remettre le fichier dans cet état. (Nous ne pouvons pas simplement jouer avec l'historique, car nous avons déjà poussé ce contenu, et l'édition de l'historique perturbe tout le monde).
Commençons donc par trouver le bon engagement. Vous pouvez voir les commits qui ont fait des modifications au(x) fichier(s) donné(s) très facilement :
git log path/to/file
Si vos messages de commit ne sont pas suffisants, et que vous avez besoin de voir ce qui a été fait au fichier à chaque commit, utilisez la fonction -p/--patch
option :
git log -p path/to/file
Ou, si vous préférez la vue graphique de gitk
gitk path/to/file
Vous pouvez également le faire une fois que vous avez lancé gitk par le biais du menu de vue ; une des options pour une vue est une liste de chemins à inclure.
Dans tous les cas, vous pourrez trouver le SHA1 (hash) du commit avec la version du fichier que vous voulez. Maintenant, tout ce que vous avez à faire est ceci :
# get the version of the file from the given commit
git checkout <commit> path/to/file
# and commit this modification
git commit
(La commande checkout lit d'abord le fichier dans l'index, puis le copie dans l'arbre de travail, il n'est donc pas nécessaire d'utiliser la commande git add
pour l'ajouter à l'index en vue de son engagement).
Si votre fichier n'a pas un historique simple (par exemple, les renommages et les copies), consultez l'excellent commentaire de VonC. git
peuvent être orientés pour rechercher plus soigneusement ces éléments, au détriment de la vitesse. Si vous êtes sûr que l'histoire est simple, vous n'avez pas besoin de vous inquiéter.
1 votes
Voulez-vous revenir au fichier avec la modification 2 de façon permanente, ou voulez-vous temporairement retirer la modification 2 pour voir à quoi ressemblait le fichier à ce moment-là ?
0 votes
J'utilise toujours SVN quotidiennement et git seulement un peu, donc je ne peux pas vous aider avec votre question - mais j'ai pensé que vous pourriez être intéressé par cette ressource - le livre "Pro Git" est disponible en ligne ici -. progit.org/book Je possède et j'ai lu le livre - il est excellent, dommage que je n'aie pas l'occasion d'utiliser git en ce moment ; il semble que vous ayez juste besoin d'obtenir une version historique de votre fichier et ensuite de réengager l'ancienne version, pas de branche ?
0 votes
@Jim Hurne : Oui, je veux rétablir le fichier de façon permanente. @house9 : Merci, je vais jeter un coup d'oeil à ce livre. La partie historique semble bonne, comment est-elle faite ?