HOWTO · Git
Rétablir un fichier à un commit précédent dans Git
Découvrez comment restaurer un fichier suivi à partir d'un commit Git précédent avec git restore ou git checkout, inspecter le résultat et décider de l'indexer et de le committer.
Sur cette page
Pour restaurer un fichier suivi par Git depuis un commit antérieur, trouvez le commit qui contient la version souhaitée, puis exécutez git restore --source <commit> -- <file-path>. Cette commande met à jour le fichier dans votre répertoire de travail sans modifier l’historique des commits et, par défaut, laisse la version restaurée sans l’ajouter à l’index. Examinez ou sauvegardez d’abord vos modifications locales importantes : la restauration remplace le contenu du fichier dans votre répertoire de travail. Pour enregistrer la version restaurée dans un nouveau commit, ajoutez-la à l’index et créez ensuite le commit.
Trouver le commit qui contient la version souhaitée
Utilisez git log --oneline -- <file-path> pour afficher les commits qui ont modifié le fichier et repérer celui dont vous voulez récupérer la version. Par exemple, pour un README.md situé à la racine du dépôt, exécutez git log --oneline -- README.md. Le séparateur -- marque la fin des options de la commande ; il est utile lorsqu’un chemin pourrait autrement être interprété comme une option. Avec git log, un chemin peut être relatif au répertoire courant. Vous pouvez aussi indiquer un chemin relatif à la racine du dépôt avec la syntaxe de chemin :(top) de Git, par exemple :(top)README.md.
Lisez le résumé du commit et, si nécessaire, examinez le fichier à un commit donné avec git show <commit>:<file-path>. Dans cette forme, le chemin après les deux-points est toujours relatif à la racine du dépôt, quel que soit votre répertoire courant. Par exemple, si vous avez lancé git log --oneline -- README.md depuis un sous-répertoire docs pour repérer les modifications de docs/README.md, examinez cette version avec git show <commit>:docs/README.md. Pour un README.md à la racine du dépôt, utilisez git show <commit>:README.md, depuis la racine ou un sous-répertoire. Dans la commande de restauration, utilisez l’identifiant du commit indiqué par le journal, sous sa forme abrégée ou complète. Un commit peut contenir la version souhaitée même si des commits ultérieurs ont modifié le fichier : choisissez en fonction du contenu que vous voulez récupérer, et pas seulement selon l’entrée la plus récente.
Restaurer un fichier depuis un commit précédent
Commencez par examiner ou sauvegarder toute modification importante du fichier concerné. Restaurez ensuite la version choisie avec git restore --source <commit> -- <file-path>. Pour reprendre l’exemple fourni, la commande est git restore --source 9cbe84d -- README.md. Remplacez le commit et le chemin par les valeurs correspondant à votre dépôt. Cette commande copie dans votre répertoire de travail la version du fichier enregistrée dans ce commit. Elle ne crée pas de commit et ne déplace pas la branche courante ; par défaut, le contenu restauré n’est pas ajouté à l’index.
Ces exemples montrent des opérations Git sans sortie d’exécution annoncée ; leur effet dépend de l’historique de votre dépôt et de l’état actuel de l’index et du répertoire de travail. Après la restauration, utilisez git diff -- <file-path> pour examiner les modifications du répertoire de travail. Si vous avez également des modifications indexées pour ce chemin, vérifiez la version dans l’index avec git diff --cached -- <file-path> afin de savoir ce qui sera inclus dans le prochain commit.
Choisir entre git restore et git checkout
Pour récupérer un fichier depuis un commit donné, git restore --source <commit> -- <file-path> indique explicitement le commit source et met à jour le répertoire de travail sans ajouter le résultat à l’index par défaut. L’autre forme possible est git checkout <commit> -- <file-path>. Cette commande met à jour à la fois le fichier du répertoire de travail et l’index : la version restaurée est donc immédiatement indexée. Cette différence compte lorsque vous préparez un commit : après git checkout, examinez les modifications indexées ; après git restore, ajoutez vous-même le fichier à l’index seulement si c’est ce que vous souhaitez.
Les deux formes remplacent le contenu actuel du fichier dans le répertoire de travail. Sauvegardez ou examinez vos modifications locales avant d’exécuter l’une ou l’autre, surtout si elles ne sont pas enregistrées dans un autre commit. Restaurer un fichier ne crée pas de commit ; cela modifie l’état à partir duquel vous pouvez poursuivre votre travail. L’historique de la branche reste inchangé jusqu’à la création d’un commit ultérieur.
Ajouter le fichier restauré à l’index et le valider
Après git restore, examinez les modifications et utilisez git add -- <file-path> pour ajouter le fichier à l’index si vous souhaitez l’inclure dans un commit. Vérifiez ensuite la version indexée avec git diff --cached -- <file-path>, puis créez un commit dont le message explique pourquoi le fichier a été restauré. Si vous ne souhaitez pas encore enregistrer cette restauration, laissez-la comme modification du répertoire de travail.
Après la forme git checkout <commit> -- <file-path>, la version restaurée se trouve déjà dans l’index. Avant de créer un commit, examinez-la avec git diff --cached -- <file-path>. Selon la suite voulue, vous pouvez modifier encore le fichier, ajouter ces modifications à l’index ou retirer le chemin de l’index tout en conservant le contenu du répertoire de travail. La restauration d’un fichier est indépendante de votre choix de créer ou non un commit ; elle ne publie ni ne partage automatiquement la modification.
Comprendre git revert et git reset pour les fichiers
git revert et la restauration d’un fichier répondent à des besoins différents. git revert <commit> crée un nouveau commit qui annule les modifications introduites par un commit antérieur ; cette commande permet d’annuler un commit tout en préservant l’historique existant. Elle ne sert pas à copier un seul fichier depuis un commit précédent. Pour récupérer une version d’un fichier, suivez la procédure de restauration depuis un commit décrite plus haut, puis décidez si vous souhaitez enregistrer le résultat dans un commit.
La forme avec un chemin, git reset HEAD -- <file-path>, retire ce chemin de l’index : elle modifie l’index pour qu’il corresponde à HEAD, tout en laissant intact le contenu du fichier dans le répertoire de travail. Elle ne restaure pas le contenu du fichier depuis un commit choisi. Pour annuler les modifications du répertoire de travail et revenir à la version du fichier dans le HEAD actuel, git restore -- <file-path> restaure depuis HEAD par défaut. Cette commande remplace également le contenu du fichier dans le répertoire de travail : examinez ou sauvegardez d’abord vos modifications. L’ancienne forme git checkout -- <file-path> a un effet similaire d’annulation des modifications du répertoire de travail, mais ne permet pas de choisir un commit antérieur. Utilisez la forme explicite --source <commit> lorsque la version souhaitée provient d’un commit précis.
Pour en savoir plus, consultez la documentation de Git restore, la documentation de Git checkout et le chapitre de Pro Git sur l’annulation de modifications.