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.

926voto

twalberg Points 19804

En supposant que vous voulez annuler les effets de git rm ou rm suivi de git add -A ou quelque chose de similaire :

# ceci restaure le statut du fichier dans l'index
git reset -- 
# puis vérifiez une copie à partir de l'index
git checkout -- 

Pour annuler git add , la première ligne ci-dessus suffit, en supposant que vous n'ayez pas encore validé.

92 votes

Le -- est la clé. git reset ne fonctionne pas, c'est pourquoi je suis ici.

0 votes

Mais cela restaurera également toutes les modifications. Que faire si je veux seulement restaurer tous les fichiers supprimés. Et conserver toutes les modifications intactes.

7 votes

Pourquoi end-of-options-marker est-il requis uniquement dans le cas du fichier supprimé?

65voto

seppo0010 Points 3758

Les deux questions sont répondues dans git status.

Pour désindexer l'ajout d'un nouveau fichier, utilisez git rm --cached nomfichier.ext

# Modifications à valider :
#   (utilisez "git rm --cached ..." pour désindexer)
#
#   nouveau fichier :   test

Pour désindexer la suppression d'un fichier, utilisez git reset HEAD nomfichier.ext

# Modifications à valider :
#   (utilisez "git reset HEAD ..." pour désindexer)
#
#   supprimé :    test

En revanche, git checkout -- ne désindexe jamais, il se contente de supprimer les modifications non-indexées.

6 votes

Je ne vois pas l'indice pour un fichier supprimé dans git 1.7.2.5 sur Debian.

0 votes

Il est bon de voir la commande git status citée ; cela montre aux utilisateurs un moyen de s'auto-assister maintenant et la prochaine fois, et au cas où des informations seraient ajoutées ou mises à jour dans les futures versions de git.

0 votes

C'est faux. "Changes to be committed" est ce que vous voyez avant le git reset. Après le git reset, vous voyez "Changed but not updated" ce qui signifie "Changes not staged" dans la langue maternelle des auteurs de git, apparemment. Plus important encore, tout le dogme selon lequel "git status vous dit tout ce que vous savez" est un mensonge. (Les gestionnaires qui disent cela gaspillent le temps des gens et devraient être renvoyés.)

17voto

michaeldever Points 320

Si elle a été mise en scène et validée, alors ce qui suit réinitialisera le fichier :

git reset COMMIT_HASH chemin_du_fichier
git checkout COMMIT_HASH chemin_du_fichier
git add chemin_du_fichier

Cela fonctionnera pour une suppression qui s'est produite plusieurs commits auparavant.

16voto

KreemPuff Points 321

À partir de git v2.23, vous avez une autre option:

git restore --staged --

12voto

Ben Jackson Points 28358

Les réponses à vos deux questions sont liées. Je vais commencer par la deuxième :

Une fois que vous avez préparé un fichier (souvent avec git add, bien que certaines autres commandes mettent implicitement en scène les modifications également, comme git rm), vous pouvez annuler ce changement avec git reset -- .

Dans votre cas, vous devez avoir utilisé git rm pour supprimer le fichier, ce qui équivaut à simplement le supprimer avec rm puis mettre en scène ce changement. Si vous le désenregistrez d'abord avec git reset -- , vous pouvez ensuite le récupérer avec git checkout -- .

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