587 votes

Démettre un fichier supprimé dans git

En général, pour annuler les changements apportés à un fichier, vous feriez :

git checkout -- 

Et si le changement que je veux annuler est la suppression du fichier? La ligne ci-dessus donnerait une erreur :

erreur: le chemin '' n'a pas été trouvé dans git.

Quelle commande restaurera ce fichier unique sans annuler les autres changements?

point bonus: De plus, que faire si le changement que je veux annuler est l'ajout d'un fichier? J'aimerais savoir comment annuler cette modification également.

1 votes

Ignorer les modifications et annuler la mise en attente sont deux choses différentes, que cherchez-vous à faire ?

1 votes

Il s'agit de deux questions et problèmes distincts dans un seul article. Cela rend les réponses bien trop confuses et inutilement compliquées.

4voto

J'ai essayé les solutions ci-dessus et j'avais toujours des difficultés. J'avais d'autres fichiers mis en scène avec deux fichiers qui ont été supprimés accidentellement.

Pour annuler la suppression des deux fichiers, j'ai dû supprimer la mise en scène de tous les fichiers :

git reset HEAD .

À ce moment-là, j'ai pu restaurer les fichiers supprimés :

git checkout -- WorkingFolder/FileName.ext

Enfin, j'ai pu remettre en scène le reste des fichiers et continuer avec mon commit.

0voto

KyoungWan Points 1

À partir de la page manuel,

git-reset - Réinitialise le HEAD actuel à l'état spécifié
git reset [-q] [] [--] ...
Dans la première et la deuxième forme, copiez les entrées de  vers l'index.

par exemple, quand nous utilisons git reset HEAD~1 il réinitialise notre HEAD actuel à HEAD~1

donc quand nous utilisons git reset 'some-deleted-file-path'

git suppose que 'some-deleted-file-path' est un point de commit et essaie de réinitialiser notre HEAD actuel là-bas.

Et cela échoue

fatal: argument ambigu 'some-deleted-file-path' : révision inconnue ou chemin inexistant dans l'arborescence de travail.

0voto

irowe Points 140

La réponse ici traite déjà du cas de base pour annuler la suppression d'un fichier spécifique. Cependant, si vous avez accidentellement mis en scène la suppression de nombreux fichiers mélangés avec des modifications que vous souhaitez conserver, vous pouvez utiliser cette série de commandes :

git diff --staged --name-status | awk '$1=="D"{print $2}' | xargs git restore --staged -- 

La première portion, git diff --staged --name-status, affiche toutes les modifications mises en scène avec une lettre pour identifier le type de modification. Les fichiers supprimés ont un "D".

La deuxième partie affiche le nom du fichier si la lettre de statut (première colonne) est "D". Cela filtre efficacement la liste pour ne conserver que les suppressions mises en scène.

La dernière ligne appelle la commande git restore --staged (que les autres réponses ont si aimablement indiquée) pour chaque fichier supprimé. Notez que restore nécessite git 2.23 ou plus récent, sinon vous devrez utiliser une combinaison de git reset et git checkout (comme c'est fait dans cette autre réponse. Pour plus d'explications sur git restore, consultez la documentation de git ou cette réponse.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X