HOWTO · Git

Comment annuler rm dans Git

Découvrez comment récupérer un fichier supprimé avec git rm, que la suppression soit encore dans l'index ou déjà validée. Choisissez une commande Git sûre pour restaurer la version souhaitée depuis l'index ou un commit.

Sur cette page

Pour annuler git rm, vérifiez d’abord si la suppression est encore dans l’index ou a déjà été validée. Avant un commit, restaurez le chemin depuis HEAD ; après un commit, sélectionnez un commit contenant la version souhaitée et restaurez le chemin depuis celui-ci. Git peut récupérer les versions validées, mais il ne peut pas recréer le contenu de fichiers qui n’ont jamais été validés.

Ce que git rm modifie

git rm <path> supprime un fichier suivi de l’arbre de travail et place sa suppression dans l’index. La suppression est donc prête à être incluse dans le prochain commit. La commande rm n’est pas un alias de git remove ; rm est une commande du shell, tandis que git rm met également à jour l’index de Git.

Utilisez git rm --cached <path> lorsque vous voulez que Git cesse de suivre un fichier tout en conservant sa copie dans l’arbre de travail. Cela place la suppression de l’index dans la zone de préparation et laisse le fichier sur le disque. C’est souvent utilisé lorsqu’un fichier doit rester local mais ne plus appartenir au dépôt.

Restaurer une suppression avant le commit

Si la suppression est dans l’index et que vous voulez la dernière version validée, restaurez le chemin depuis HEAD à la fois dans l’index et dans l’arbre de travail avec git restore --source=HEAD --staged --worktree -- <path>. Vérifiez que votre installation de Git fournit git restore avant de l’utiliser. Sinon, git checkout HEAD -- <path> restaure ce chemin depuis HEAD dans l’index et l’arbre de travail.

Ces commandes récupèrent la version validée, et non les modifications qui n’existaient que dans l’arbre de travail. Inspectez d’abord tout changement préparé ou local pour le chemin, car restaurer les deux emplacements remplace ce chemin par la version sélectionnée. Pour restaurer plusieurs chemins, énumérez chaque chemin après --.

Cet exemple autonome crée un dépôt temporaire, valide une note, prépare sa suppression et restaure la version validée. La dernière ligne est le contenu du fichier restauré.

set -eu
repo_dir="$(mktemp -d)"
trap 'rm -rf "$repo_dir"' EXIT
cd "$repo_dir"
git init -q
git config user.name "Example User"
git config user.email "example@example.invalid"
printf 'A tracked note.\n' > notes.txt
git add notes.txt
git commit -qm "Add note"
git rm -q notes.txt
if git restore --source=HEAD --staged --worktree -- notes.txt 2>/dev/null; then
  :
else
  git checkout HEAD -- notes.txt
fi
cat notes.txt

Sortie standard attendue :

A tracked note.

Récupérer une suppression après le commit

Après qu’un commit a enregistré la suppression, choisissez un commit contenant la version du fichier souhaitée. Restaurez ensuite uniquement ce chemin avec git restore --source=<commit> --staged --worktree -- <path>. Si git restore n’est pas disponible, utilisez git checkout <commit> -- <path>. Remplacez <commit> et <path> par le commit sélectionné et le chemin relatif au dépôt.

Restaurer un chemin n’annule pas le commit qui l’a supprimé ; cela crée une restauration du fichier dans l’index que vous pouvez vérifier et valider. Ne supposez pas que HEAD~1 est la bonne source : des commits ultérieurs peuvent exister, et le commit immédiatement précédent peut ne pas contenir la version dont vous avez besoin.

Trouver une version antérieure avec l’historique Git

Utilisez git log --all -- <path> pour inspecter les commits qui ont modifié le chemin et en identifier un contenant la version souhaitée. git reflog enregistre les positions récentes des pointes de branches et peut aider à localiser un commit après un déplacement de branche, comme un reset. Il ne stocke pas le contenu des fichiers séparément ; le commit que vous sélectionnez doit contenir la version du fichier que vous voulez.

Une fois un candidat identifié, vérifiez qu’il inclut le chemin, puis restaurez ce chemin depuis le commit candidat à l’aide de la commande ci-dessus. L’historique Git n’aide que lorsque le contenu a été validé. Si le fichier n’a jamais été validé, vérifiez plutôt les sauvegardes de l’éditeur, les sauvegardes système ou d’autres copies.

Choisir une méthode de récupération sûre

Utilisez l’état du dépôt pour choisir la source : restaurez depuis HEAD pour une suppression préparée non validée, ou depuis un commit antérieur précis pour une suppression validée. Examinez le diff préparé et l’état de l’arbre de travail avant de valider le fichier récupéré, surtout si vous avez d’autres travaux sur le même chemin.

Évitez git reset --hard comme méthode routinière pour récupérer un fichier. Il réinitialise l’index et l’arbre de travail et peut écarter des modifications non validées sans rapport. Restaurer un seul chemin depuis un commit choisi est plus ciblé. Pour plusieurs fichiers, fournissez chaque chemin à la commande de restauration et examinez les changements résultants avant de valider.