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.
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.
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.
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>
.
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.