web-dev-qa-db-fra.com

Décompresser un fichier supprimé dans git

Habituellement, pour annuler les modifications apportées à un fichier, procédez comme suit:

git checkout -- <file>

Que se passe-t-il si le changement que je veux ignorer est la suppression du fichier? La ligne ci-dessus donnerait une erreur:

error: pathspec '<file>' did not match any file(s) known to git.

Quelle commande restaurera ce fichier sans annuler les autres modifications?

point bonus: Et aussi, si le changement que je veux annuler est l'ajout d'un fichier? J'aimerais aussi savoir comment décontenancer ce changement.

447
lurscher

En supposant que vous souhaitiez annuler les effets de git rm <file> ou rm <file> suivi de git add -A ou de quelque chose de similaire:

# this restores the file status in the index
git reset -- <file>
# then check out a copy from the index
git checkout -- <file>

Pour annuler git add <file>, la première ligne ci-dessus suffit, en supposant que vous ne l'ayez pas encore validée.

694
twalberg

Les réponses aux deux questions sont données dans git status.

Pour dissiper l'ajout d'un nouveau fichier, utilisez git rm --cached filename.ext

# Changes to be committed:
#   (use "git rm --cached <file>..." to unstage)
#
#   new file:   test

Pour supprimer la suppression d’un fichier, utilisez git reset HEAD filename.ext

# Changes to be committed:
#   (use "git reset HEAD <file>..." to unstage)
#
#   deleted:    test

D'autre part, git checkout -- ne se défait jamais, il ignore simplement les modifications non échelonnées.

50
seppo0010

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

Une fois que vous avez créé un fichier (souvent avec git add, bien que certaines autres commandes implicitement implémentent également les modifications, comme git rm), vous pouvez annuler cette modification avec git reset -- <file>.

Dans votre cas, vous devez avoir utilisé git rm pour supprimer le fichier, ce qui équivaut à le supprimer simplement avec rm, puis à enregistrer cette modification. Si vous le retirez d'abord avec git reset -- <file>, vous pouvez le récupérer avec git checkout -- <file>.

10
Ben Jackson

S'il a été mis en attente et validé, le fichier suivant sera réinitialisé:

git reset COMMIT_HASH file_path
git checkout COMMIT_HASH file_path
git add file_path

Cela fonctionnera pour une suppression qui a eu lieu plusieurs commits précédents.

7
michaeldever