Il était une fois un dossier dans mon projet que j'aimerais maintenant pouvoir récupérer.
Le problème est: je n'ai aucune idée de quand l'ai-je supprimé et de quel chemin il s'agissait.
Comment localiser les validations de ce fichier lorsqu'il existait?
Réponses:
Si vous ne connaissez pas le chemin exact que vous pouvez utiliser
Si vous connaissez le chemin d'accès du fichier, vous pouvez le faire:
Cela devrait afficher une liste des validations dans toutes les branches qui ont touché ce fichier. Ensuite, vous pouvez trouver la version du fichier que vous souhaitez, et l'afficher avec ...
Ou restaurez-le dans votre copie de travail avec:
git checkout <SHA>^ -- <path-to-file>
Notez le symbole caret (
^
), qui obtient le retrait avant celui identifié, car au moment de la<SHA>
validation, le fichier est supprimé, nous devons regarder la validation précédente pour obtenir le contenu du fichier suppriméla source
git log -- <path>
n'aura aucune sortie lorsque vous êtes sur une branche dans laquelle le fichier n'a jamais existé. Vous devez toujours utilisergit log --all -- <path>
, pour vous assurer de ne pas manquer les modifications qui se sont produites sur d'autres branches. La commandegit log -- <path>
peut être très dangereuse si vous avez plusieurs branches et avez tendance à oublier les chemins et les branches (comme moi) et elle est également dangereuse si vous travaillez avec d'autres développeurs.--all
(merci Philip ) à votregit log
réponse, afin que les gens ne manquent pas les modifications et les fichiers sur d'autres branches. Cela éviterait aux gens oublieux comme moi beaucoup de chagrin.git checkout <SHA>^ -- <path-to-file>
(notez le symbole ^), car au moment de la validation de <SHA>, le fichier est supprimé, nous devons regarder la validation précédente pour obtenir le contenu du fichier suppriméObtenez une liste des fichiers supprimés et copiez le chemin complet du fichier supprimé
Exécutez la commande suivante pour trouver l'ID de validation de cette validation et copiez l'ID de validation
Afficher la différence du fichier supprimé
N'oubliez pas que vous pouvez écrire la sortie dans un fichier en utilisant
>
commela source
unknown revision or path not in the working tree
.git log --diff-filter=D --summary | grep -E 'delete|^commit\s+\S+'
git-grep-latest(){ result_path=$(git log --diff-filter=D --summary | grep $1 | head -1 | awk '{print $4;}'); latest_commit=$(git log --all -- $result_path | head -1 | awk '{print $2;}'); git show $latest_commit -- $result_path; }
et maintenant vous pouvez simplement faire:git-grep-latest some_text
linux pipes
.. vous aimerez ça.Impossible de modifier la réponse acceptée. Ajoutez-la ici comme réponse,
pour restaurer le fichier dans git, utilisez ce qui suit (notez le signe '^' juste après le SHA)
la source
<SHA>~1
devrait fonctionner de la même manière sans qu'il soit nécessaire de l'envelopper avec des guillemets.Supposons que vous souhaitiez récupérer un fichier appelé
MyFile
, mais n'êtes pas sûr de son chemin (ou de son extension, d'ailleurs):Prelim.: Évitez la confusion en marchant à la racine git
Un projet non trivial peut avoir plusieurs répertoires avec des noms similaires ou identiques.
Trouvez le chemin complet
delete mode 100644 full/path/to/MyFile.js
full/path/to/MyFile.js
est le chemin d'accès et le fichier que vous recherchez.Déterminez tous les commits qui ont affecté ce fichier
bd8374c Some helpful commit message
ba8d20e Another prior commit message affecting that file
cfea812 The first message for a commit in which that file appeared.
Extraire le fichier
Si vous choisissez le premier commit répertorié (le dernier chronologiquement, ici bd8374c), le fichier ne sera pas trouvé, car il a été supprimé dans ce commit.
Sélectionnez simplement le précédent (ajouter un signe d'insertion):
la source
git log --diff-filter=D --summary | find "delete" | find "MyFile"
Et step3, notez les guillemets autour du hachage:git checkout "bd8374c^" -- full/path/to/MyFile.js
@Amber a donné la bonne réponse! Encore un ajout, si vous ne connaissez pas le chemin exact du fichier, vous pouvez utiliser des caractères génériques! Cela a fonctionné pour moi.
la source
Vous trouverez ci-dessous une commande simple, où un utilisateur dev ou git peut passer un nom de fichier supprimé du répertoire racine du référentiel et obtenir l'historique:
Si quelqu'un peut améliorer la commande, veuillez le faire.
la source
Essayez d'utiliser l'un des visualiseurs, par exemple
gitk
pour parcourir l'historique pour trouver ce fichier à moitié mémorisé. (utilisergitk --all
si nécessaire pour toutes les branches)la source
--all
option est essentielle à la fois pour votre réponse et pour la réponse acceptée.Sommaire:
Vous recherchez le chemin complet de votre fichier dans l'historique des fichiers supprimés
git log --diff-filter=D --summary | grep filename
Vous restaurez votre fichier à partir de la validation avant sa suppression
la source
Voici ma solution:
la source