Si un fichier a disparu de votre projet Mac avant que vous ne l'ayez commité, vérifiez d'abord la Corbeille du Mac ainsi que toute sauvegarde Time Machine ou dans le cloud. Vérifiez ensuite Git : il peut restaurer un fichier supprimé si la version se trouve dans l'index ou dans un commit, et peut révéler du contenu enregistré sous forme d'objet inaccessible. Si le fichier n'existait qu'en tant que contenu de copie de travail non enregistré ou non indexé (unstaged), Git n'en a peut-être aucune copie. Effectuez ces vérifications avant de créer de nouveaux fichiers dans le projet.

1. Vérifier la Corbeille et effectuer une recherche sur le Mac

Ouvrez la Corbeille depuis le Dock et recherchez le fichier par son nom. Si vous le trouvez, effectuez un contrôle-clic dessus et choisissez Remettre pour le replacer à son emplacement d'origine, ou faites-le glisser vers un endroit sûr. Apple recommande également d'effectuer une recherche avec Spotlight si le fichier a pu être déplacé ou renommé. Pour un dossier de projet situé dans iCloud Drive, vérifiez également la Corbeille ainsi que les options « Supprimés récemment » ou de récupération de données d'iCloud ; Apple indique que les fichiers iCloud Drive supprimés éligibles peuvent généralement être récupérés dans un délai de 30 jours. Instructions de récupération iCloud d'Apple

Si un outil de développement a directement supprimé le fichier ou si la Corbeille a été vidée, passez à l'étape suivante. Ne partez pas du principe que chaque suppression passe par la Corbeille.

2. Regarder dans Time Machine, y compris les instantanés locaux

Si Time Machine était activé, connectez le disque de sauvegarde s'il est disponible. Dans le Finder, ouvrez le dossier qui contenait le fichier, utilisez Spotlight pour ouvrir Time Machine, puis parcourez la chronologie ou les flèches de sauvegarde jusqu'à une date antérieure à la suppression. Sélectionnez le fichier et cliquez sur Restaurer. Apple précise que les éléments restaurés retournent à leur emplacement d'origine ; pensez donc à restaurer l'élément vers un autre emplacement si vous souhaitez comparer les versions avant de remplacer quoi que ce soit. Guide d'Apple pour la restauration d'éléments avec Time Machine

Un disque de sauvegarde déconnecté n'exclut pas nécessairement une récupération. Time Machine peut utiliser des instantanés locaux stockés sur le Mac, mais ceux-ci sont temporaires : Apple indique que les instantanés sont généralement enregistrés toutes les heures et conservés pendant 24 heures, des instantanés supplémentaires dépendant de l'espace disponible. Ils n'existent que lorsque Time Machine est utilisé et ne remplacent pas une sauvegarde externe. À propos des instantanés locaux de Time Machine

3. Restaurer un fichier suivi à partir de Git

Ouvrez le Terminal, placez-vous dans le répertoire du projet et vérifiez l'état du fichier avant de restaurer quoi que ce soit :

git status --short

Si le chemin supprimé apparaît et que le fichier était suivi, restaurez-le depuis l'index à l'aide de son chemin relatif par rapport au projet :

git restore -- path/to/file.ext

Cette commande copie la version indexée dans l'arbre de travail. Si l'index ne contenait pas le fichier, mais qu'il existe dans le dernier commit, restaurez-le plutôt depuis HEAD :

git restore --source=HEAD -- path/to/file.ext

La distinction est importante : par défaut, git restore utilise l'index pour restaurer l'arbre de travail ; --source=HEAD sélectionne explicitement le dernier commit. Une restauration écrase le chemin spécifié dans l'arbre de travail avec la version sélectionnée ; veillez donc d'abord à copier ailleurs tout fichier s'y trouvant dont le contenu a de l'importance. Git documente ces sources de restauration et ce comportement dans son manuel de git restore.

Ces commandes ne permettent pas de récupérer un tout nouveau fichier non suivi (untracked) ou des modifications qui n'ont jamais été indexées (staged) ou commitées. Git ne connaît que les versions qui sont parvenues dans son index, ses commits ou sa base de données d'objets.

4. Rechercher dans les objets inaccessibles de Git en dernier recours

Il arrive parfois que Git ait stocké le contenu d'un fichier même si aucune branche ni aucun commit ne pointe vers lui — par exemple, une version qui a été indexée puis retirée de l'index. Depuis le répertoire du projet, inspectez les objets inaccessibles :

git fsck --unreachable

Git peut signaler un blob inaccessible suivi d'un identifiant d'objet (object ID). Pour inspecter un candidat sans modifier le projet, utilisez :

git cat-file -p OBJECT_ID

Remplacez OBJECT_ID par l'identifiant indiqué. Si la sortie correspond au fichier manquant, redirigez-la vers une copie de récupération en dehors du projet, par exemple :

git cat-file -p OBJECT_ID > "$HOME/Desktop/recovered-file.txt"

Le nom de fichier et l'extension sont ici donnés à titre d'exemple ; choisissez une destination et un nom adaptés au fichier. Les blobs Git stockent le contenu, pas le chemin d'origine ; vous devrez donc peut-être examiner les candidats et identifier vous-même le bon nom. git fsck signale les objets inaccessibles, et son option --lost-found permet d'écrire le contenu des blobs sous .git/lost-found/other/ ; aucune de ces méthodes ne garantit une version récupérable. Documentation Git de git fsck

Lorsqu'aucune source de récupération ne contient le fichier

Si la Corbeille, les sauvegardes, la récupération dans le cloud, l'index Git, les commits et les objets Git inaccessibles ne le contiennent pas, il se peut qu'aucune copie ne soit disponible par le biais de ces outils documentés. En particulier, un fichier non suivi qui n'a jamais été indexé se situe en dehors de l'historique enregistré de Git. Vérifiez l'historique local propre à votre éditeur ou un autre service de sauvegarde si vous en utilisiez un ; la disponibilité et les étapes de récupération dépendent de ce produit. Préservez le projet en l'état pendant vos recherches et enregistrez tout contenu récupéré sous un nouveau nom jusqu'à ce que vous confirmiez qu'il s'agit bien de la version dont vous avez besoin.

Sources