Restaurer le fichier de l'ancien commit dans git

Réponses:

222
git checkout 'master@{7 days ago}' -- path/to/file.txt

Cela ne modifiera pas HEAD, cela écrasera simplement le fichier local path/to/file.txt

Voir man git-rev-parse pour les spécifications de révision possibles (bien sûr un simple hachage (comme dd9bacb) fera très bien l'affaire)

N'oubliez pas de valider le changement (après un examen ...)

sehe
la source
15
Wow, @heneryville et sehe, en fait, je pensais que «il y a 7 jours» était une méta pour que vous trouviez quel commit. ty!
AnneTheAgile
7
Partie 2 Lorsque vous souhaitez choisir un commit particulier, le format ci-dessus ne fonctionne pas. Utilisez plutôt ce qu'Urs a montré ci-dessous, git checkout commitShaNumber - chemin / vers / fichier.txt par stackoverflow.com/questions/215718/…
AnneTheAgile
2
@AnneTheAgile en fait qui est toujours exactement la même syntaxe, je vient de se passer pour donner un exemple « complexe » d'un revision-specificationpuisque c'est ce que l'OP a demandé :)
sehe
1
Si votre commit a été utilisé pour supprimer le fichier que vous essayez de récupérer, utilisez simplement shacommit~1(ex:) git checkout 0f4bbdcd~1 -- path/to/file.txtpour obtenir le commit juste avant.
sdlins
90
  1. Extrayez le fichier de votre ancien commit via git checkout [Revision_Key] -- path/to/file.
  2. Ajouter, valider, pousser selon le cas.
Urs Reupke
la source
3
git checkoutpeut gérer des fichiers uniques (voir réponse par sehe), pas besoin de copier et coller.
Koraktor
1
Les clés de révision sont-elles toujours SHA1 pour le commit?
IslandCow
1
Ils le sont, mais généralement les 6 à 8 premiers caractères du SHA1 sont suffisants pour identifier la révision.
Urs Reupke
2
@IslandCow non, ils peuvent être SHA1 mais aussi branche, tag, ou toute autre chose que les points à une validation, par exemple HEAD, ORIG_HEADou l' un des combinés avec ^/ ~/ @notation de style.
Alois Mahdal
2
Vous indiquez que l'on est censé "ajouter" le fichier par la suite. Mais c'est incorrect. Le fichier n'est pas placé dans la zone de préparation. C'est déjà ajouté.
xApple
10

J'avais besoin de restaurer un fichier récent commis dans git. Donc, juste pour réitérer et donner une autre perspective, vous devez le faire en exécutant les deux étapes suivantes:

  1. git log -3
    Cela montre les trois commits les plus récents. Lisez les commentaires et le nom de l'auteur afin de préciser la version exacte que vous souhaitez. Notez ce long ID de validation (par exemple b6b94f2c19c456336d60b9409fb1e373036d3d71) pour la version de validation souhaitée.

  2. git checkout b6b94f2c19c456336d60b9409fb1e373036d3d71 -- myfile.java
    Transmettez l'ID de validation ET le nom du fichier que vous souhaitez restaurer. Assurez-vous que vous disposez d'un espace avant et après le double tiret.

Il existe de nombreuses autres façons de le faire, mais c'est la plus simple dont je me souvienne.

REMARQUE: Si vous vous trouvez dans le chemin / dossier de votre projet, il n'est pas nécessaire de taper le chemin d'accès complet du fichier dans la commande d'extraction.

Salvador Valence
la source
Meilleur commentaire jamais. Parce que celle, qui est la réponse acceptée, suppose que le fichier qui doit être récupéré est poussé en amont, cependant cette commande récupère / restaure le fichier qui n'existe que localement.
ot0
1
Je viens d'essayer cela dans le dossier racine de mon dépôt git local. J'avais encore besoin de fournir le chemin relatif du fichier. Le simple fait de fournir le - [nom du fichier] seul ne fonctionnait pas.
user2784627
@ ot0 Non, cela ne suppose pas cela. Ce sont exactement la même réponse.
mat
4

Toutes les réponses mentionnent git checkout <tree-ish> -- <pathspec>. Depuis git v2.23.0, il existe une nouvelle méthode de restauration git qui est censée assumer une partie de ce dont elle git checkoutétait responsable. Voir les faits saillants des changements sur le blog github .

Le comportement par défaut de cette commande est de restaurer l'état d'une arborescence de travail avec le contenu provenant du sourceparamètre (qui dans votre cas sera un hachage de validation).

En supposant que le hachage de validation est abcdefla commande ressemblerait à ceci:

git restore --source=abcdef file_name

qui (par défaut) le met dans l'arborescence de travail. Si vous souhaitez mettre la modification directement dans l'index afin qu'elle puisse être validée immédiatement:

git restore --source=abcdef --worktree --staged file_name

ou avec des noms d'options courts:

git restore -s=abcdef -W -S file_name
mjarosie
la source