Disons que je suis dans un référentiel Git. Je supprime un fichier et valide cette modification. Je continue de travailler et je fais encore plus de commits. Ensuite, je trouve que je dois restaurer ce fichier.
Je sais que je peux extraire un fichier en utilisant git checkout HEAD^ foo.bar
, mais je ne sais pas vraiment quand ce fichier a été supprimé.
- Quel serait le moyen le plus rapide de trouver le commit qui a supprimé un nom de fichier donné?
- Quelle serait la façon la plus simple de remettre ce fichier dans ma copie de travail?
J'espère que je n'ai pas à parcourir manuellement mes journaux, à extraire l'intégralité du projet pour un SHA donné, puis à copier manuellement ce fichier dans mon extraction de projet d'origine.
git
file-io
git-checkout
avdgaag
la source
la source
git log --diff-filter=D -- path/to/file
git checkout deletedFile
sera rétablideletedFile
s'il a été supprimé mais que cette suppression n'a pas encore été mise en place ou validée . Ce n'est pas ce que la question demande ici; cette question concerne la façon de restaurer un fichier dont la suppression a été validée il y a de nombreuses validations.Réponses:
Trouvez le dernier commit qui a affecté le chemin donné. Comme le fichier n'est pas dans la validation HEAD, cette validation doit l'avoir supprimé.
Ensuite, extrayez la version lors de la validation avant, en utilisant le
^
symbole caret ( ):Ou dans une commande, si
$file
c'est le fichier en question.Si vous utilisez zsh et que l'option EXTENDED_GLOB est activée, le symbole caret ne fonctionnera pas. Vous pouvez utiliser à la
~1
place.la source
± git checkout $(git rev-list -n 1 HEAD "spec/Sporkfile_example.rb")^ -- "spec/Sporkfile_example.rb" zsh: no matches found: b71c152d8f38dcd23ad7600a93f261a7252c59e9^
Je suis passé à bash et cela a bien fonctionné.error: pathspec <filename> did not match any file(s) known to git.
. La solution était d'utiliser git bash.git checkout <deleting-commit>~1 -- <file-path>
~ X vous permet de spécifier X commits avant le commit spécifié, donc ~ 1 est le commit avant, ~ 2 est deux commits avant, etc^
caractère est le caractère d'échappement! Par conséquent, sur cmd, vous devez taper^^
pour dire à cmd que vous voulez un seul littéral ^ et que vous n'échappez pas à autre chose après. Ce qui arrive à beaucoup de gens, c'est que le^
est suivi d'un espace. Donc cmd pense que vous échappez à l'espace - ce qui donne simplement un caractère d'espace. Ainsi, au moment où git obtient les arguments cli, il voitSHA1
et nonSHA1^
. C'est vraiment agaçant.~
n'est pas un personnage d'échappement, c'est pourquoi cela fonctionne toujours. (PS. Si vous pensez que les googleurs voudront cette information, veuillez voter pour ce commentaire)git log --diff-filter=D --summary
pour obtenir tous les commits qui ont supprimé des fichiers et les fichiers supprimés;git checkout $commit~1 path/to/file.ext
pour restaurer le fichier supprimé.Où
$commit
est la valeur du commit que vous avez trouvé à l'étape 1, par exemplee4cf499627
la source
git log -- *PartOfMyFileName*
. Merci pour le$commit~1
git checkout $commit~1 filename
syntaxe fonctionne parfaitement pour les fichiers individuels, et fonctionne également pour des répertoires entiers. à savoir: pour restaurer toutes les images supprimées dans ./images de sha 12345:git checkout 12345~1 images
. merci pour cette réponse!$commit~1
signifie que vous devez ajouter le nom du commit. Quelque chose comme1d0c9ef6eb4e39488490543570c31c2ff594426c
où$commit
est.Pour restaurer tous ces fichiers supprimés dans un dossier, entrez la commande suivante.
la source
git
a rendu même la tâche la plus simple.ls-files
sous-commande est pratique, mais ne semble pas fonctionner pour les fichiers qui ont été supprimés avecgit rm
ie staged, sans parler de commit, ce que l'OP a demandé.M myChangedFile
aprèsgit checkout
?Je suis venu à cette question en cherchant à restaurer un fichier que je viens de supprimer mais je n'avais pas encore validé la modification. Au cas où vous vous trouveriez dans cette situation, tout ce que vous devez faire est le suivant:
git checkout HEAD -- path/to/file.ext
la source
Si vous êtes fou, utilisez
git-bisect
. Voici quoi faire:Il est maintenant temps d'exécuter le test automatisé. La commande shell
'[ -e foo.bar ]'
retournera 0 si ellefoo.bar
existe et 1 sinon. La commande "run" degit-bisect
utilisera la recherche binaire pour trouver automatiquement le premier commit où le test échoue. Il commence à mi-chemin dans la plage donnée (de bon à mauvais) et le coupe de moitié en fonction du résultat du test spécifié.Vous êtes maintenant au commit qui l'a supprimé. À partir d'ici, vous pouvez revenir vers le futur et utiliser
git-revert
pour annuler le changement,ou vous pouvez revenir en arrière d'un commit et inspecter manuellement les dommages:
la source
git bisect run '[ -e foo.bar ]'
?git bisect run
dit à Git d'automatiser la bissection en exécutant la commande suivant le mot 'run' où la commande doit retourner0
pour unegood
version (voirgit help bisect
pour plus de détails). Le'[ -e foo.bar ]'
est une expression standard pour tester si le fichierfoo.bar
existe (l'implémentation est généralement dans un fichier/usr/bin/[
qui est habituellement lié à/usr/bin/test
) et les guillemets simples sont utilisés pour mettre tout cela comme un argument de ligne de commande unique.Mon nouvel alias préféré, basé sur bonyiii s » réponse (upvoted), et ma réponse au sujet de « passer un argument à une commande alias Git »:
J'ai perdu un fichier, supprimé par erreur il y a quelques commits?
Rapide:
Crise évitée.
Attention, avec Git 2.23 (Q3 2019) vient la commande expérimentale nommée
git restore
(!).Renommez donc cet alias (comme indiqué ci-dessous).
Robert Dailey propose dans les commentaires l'alias suivant:
Et jegan ajoute dans les commentaires :
la source
restore-file = !git checkout $(git rev-list -n 1 HEAD -- "$1")^ -- "$1"
git config --global alias.restore "\!git checkout \$(git rev-list -n 1 HEAD -- \"\$1\")^ -- \"\$1\""
Expansion of alias 'restore' failed; '!git' is not a git command
Si vous connaissez le nom de fichier, c'est un moyen simple avec les commandes de base:
Liste tous les commits pour ce fichier.
Le dernier commit (le plus haut) est celui qui a supprimé le fichier. Vous devez donc restaurer l'avant-dernier commit.
la source
Pour restaurer un fichier supprimé et validé:
Il a été testé sur Git version 1.7.5.4.
la source
error: pathspec 'foo' did not match any file(s) known to git.
assuré que le nom de fichier était correct. Git version 2.7.0git add -A
, mais le fichier restauré était donc encore en phase non validée.Si vous avez seulement apporté des modifications et supprimé un fichier, mais pas le valider, et maintenant vous avez rompu avec vos modifications
mais vos fichiers supprimés ne sont pas revenus, vous exécutez simplement la commande suivante:
Et hop, votre dossier est de retour.
la source
J'ai cette solution .
Obtenez l'id du commit où le fichier a été supprimé en utilisant l'une des méthodes ci-dessous.
git log --grep=*word*
git log -Sword
git log | grep --context=5 *word*
git log --stat | grep --context=5 *word*
# recommandé si vous ne vous souvenez de rienVous devriez obtenir quelque chose comme:
3 . Maintenant, en utilisant l'ID de validation bfe68bd117e1091c96d2976c99b3bcc8310bebe7, procédez comme suit:
Comme l'ID de validation fait référence à la validation où le fichier a déjà été supprimé, vous devez référencer la validation juste avant bfe68b, ce que vous pouvez faire en ajoutant
^1
. Cela signifie: donnez-moi le commit juste avant bfe68b.la source
la source
git undelete path/to/file.ext
Mettez ceci dans votre
.bash_profile
(ou tout autre fichier pertinent qui se charge lorsque vous ouvrez un shell de commande):Utilisez ensuite:
Cet alias vérifie d'abord pour trouver le dernier commit où ce fichier existait, puis effectue une extraction Git de ce chemin de fichier à partir du dernier commit où ce fichier existait. Source .
la source
Dans de nombreux cas, il peut être utile d'utiliser des coreutils (grep, sed, etc.) en conjonction avec Git. Je connais déjà assez bien ces outils, mais Git l'est moins. Si je voulais faire une recherche pour un fichier supprimé, je ferais ce qui suit:
Quand je trouve la révision / commit:
Tout comme d'autres l'ont dit avant moi.
Le fichier sera maintenant restauré dans son état antérieur à sa suppression. N'oubliez pas de le réengager dans l'arborescence de travail si vous souhaitez le conserver.
la source
J'ai dû restaurer un tas de fichiers supprimés à partir d'un commit spécifique, et je l'ai géré avec deux commandes:
(Notez l'espace de fin à la fin de chaque commande.)
Les fichiers ont été ajoutés au fichier .gitignore puis effacés avec
git rm
. J'avais besoin de restaurer les fichiers, mais de les décompresser. J'avais des centaines de fichiers à restaurer, et taper des choses manuellement pour chaque fichier comme dans les autres exemples allait être beaucoup trop lent.la source
En fait, cette question concerne directement Git, mais quelqu'un comme moi travaille avec des outils GUI comme WebStorm VCS part connaître les commandes CLI de Git.
Je fais un clic droit sur le chemin qui contient le fichier supprimé, puis je vais dans Git, puis je clique sur Afficher l'historique .
Les outils VCS montrent toutes les révisions et je peux voir tous les commits et les changements de chacun d'eux.
Ensuite, je sélectionne les commits que mon ami supprime le
PostAd.js
fichier. voir maintenant ci-dessous:Et maintenant, je peux voir mon fichier supprimé de désir. Je viens de double-cliquer sur le nom du fichier et il récupère.
Je sais que ma réponse n'est pas les commandes Git, mais elle est rapide, fiable et facile pour les développeurs débutants et professionnels. Les outils WebStorm VCS sont géniaux et parfaits pour travailler avec Git et ne nécessitent aucun autre plugin ou outil.
la source
J'avais la même question. Sans le savoir, j'avais créé un commit pendant .
Liste des validations pendantes
git fsck --lost-found
Inspectez chaque commit pendant
git reset --hard <commit id>
Mes fichiers ont réapparu lorsque je suis passé au commit suspendu.
git status
pour la raison:“HEAD detached from <commit id where it detached>”
la source
Restaurez le fichier supprimé:
la source
Si vous connaissez le commit qui a supprimé le ou les fichiers, exécutez cette commande où
<SHA1_deletion>
est le commit qui a supprimé le fichier:La partie avant le canal répertorie tous les fichiers qui ont été supprimés dans la validation; ils sont tous extraits de la validation précédente pour les restaurer.
la source
Recherchez le commit qui a supprimé votre fichier:
Exemple de sortie:
Depuis Git 2.23, il existe en fait une
restore
commande. C'est encore expérimental mais pour restaurer quelque chose que vous avez supprimé dans un commit (4711174 dans ce cas) vous pouvez alors taper:Notez le ^ après l'ID de validation car nous voulons restaurer quelque chose à partir du commit avant celui qui a supprimé le fichier.
L'
--source
argument indique aurestore
commande où chercher le ou les fichiers à restaurer et il peut s'agir de n'importe quel commit et même de l'index.Voir: doc git-restore pour git 2.23.0
la source
Dans notre cas, nous avons accidentellement supprimé des fichiers dans un commit et certains commits plus tard, nous avons réalisé notre erreur et voulions récupérer tous les fichiers qui ont été supprimés, mais pas ceux qui ont été modifiés.
Basé sur l'excellente réponse de Charles Bailey, voici mon one-liner:
la source
Simple et précis-
Tout d'abord, obtenez un dernier commit stable dans lequel vous avez ce fichier par -
Supposons que vous trouviez $ commitid 1234567 ..., puis
Cela restaurera la version du fichier qui était dans ce commit.
la source
Pour la meilleure façon de le faire, essayez-le.
Tout d'abord, recherchez l'ID de validation du commit qui a supprimé votre fichier. Il vous donnera un résumé des validations qui ont supprimé les fichiers.
Remarque:
84sdhfddbddd
est votrecommit id
Grâce à cela, vous pouvez facilement récupérer tous les fichiers supprimés.
la source
Vous pouvez toujours
git revert
votre commit qui a supprimé le fichier. ( Cela suppose que la suppression était le seul changement dans la validation. )Et si vous avez poursuivi le travail et réalisé plus tard que vous ne vouliez pas valider ce commit de suppression, vous pouvez le rétablir en utilisant:
git log
Montre maintenant :Et
readme.md
a été restauré dans le référentiel.la source
J'ai également ce problème en utilisant le code ci-dessous pour récupérer un fichier précédent dans un répertoire local:
L'exemple ci-dessous fonctionne pour moi:
git checkout resources/views/usaSchools.blade.php
la source
la source
Si la suppression n'a pas été validée, la commande ci-dessous restaurera le fichier supprimé dans l'arborescence de travail.
Vous pouvez obtenir une liste de tous les fichiers supprimés dans l'arborescence de travail à l'aide de la commande ci-dessous.
Si la suppression a été validée, recherchez la validation à l'endroit où elle s'est produite, puis récupérez le fichier à partir de cette validation.
Dans le cas où vous recherchez le chemin du fichier à récupérer, la commande suivante affichera un résumé de tous les fichiers supprimés.
la source
Afin de restaurer tous les fichiers supprimés avec Git, vous pouvez également faire:
Où
git ls-files --deleted
répertorie tous les fichiers supprimés etgit checkout $(git command)
restaure la liste des fichiers dans un paramètre.la source