3.8 : Revenir en arrière : restore, revert, reset

Trois noms voisins, trois effets radicalement différents

restore, revert, reset. Trois commandes qui commencent par les mêmes lettres et qui font des choses sans rapport.

C’est probablement la plus grande source d’accidents chez les débutants — et la raison pour laquelle beaucoup finissent par recopier leur dossier avant chaque manipulation.

Il existe pourtant une méthode infaillible pour choisir. Elle tient en une question.


La question de tri

Où se trouve le changement que vous voulez annuler ?

   ┌───────────┐        ┌───────────┐        ┌────────────┐        ┌──────────┐
   │ L'ÉTABLI  │        │ LE PLATEAU│        │ LE REGISTRE│        │ LA FORGE │
   │           │        │           │        │   LOCAL    │        │          │
   └─────┬─────┘        └─────┬─────┘        └──────┬─────┘        └─────┬────┘
         │                    │                     │                    │
     restore              restore              reset                revert
                          --staged            (réécrit)          (ajoute un
                                                                enregistrement)
Le changement est… La commande Ce qu’elle fait
Modifié, pas encore ajouté git restore <fichier> Annule vos modifications
Ajouté au plateau git restore --staged <fichier> Le retire du plateau
Enregistré, pas publié git reset Réécrit votre historique local
Publié sur la forge git revert Crée un enregistrement qui l’annule

Retenez la dernière ligne. C’est la règle d’or de cette leçon :

On réécrit ce qui est local. On ajoute par-dessus ce qui est publié.


git restore — annuler des modifications en cours

Jeter ce que vous venez de faire

git restore Logon.ps1

Le fichier revient à son état du dernier enregistrement. Vos modifications non enregistrées disparaissent.

⚠️ Cette commande est destructive et sans filet. Contrairement à presque tout le reste de Git, ce que vous annulez ici n’a jamais été enregistré : reflog ne pourra pas vous le rendre. C’est l’une des rares façons de perdre réellement du travail avec Git.

Le réflexe : git diff avant, pour voir ce que vous êtes sur le point de jeter.

Pour tout le dépôt :

git restore .

À manier avec le même sérieux.

Retirer du plateau

git restore --staged Logon.ps1

Vous aviez fait git add un peu vite. Cette commande retire le fichier du plateau sans toucher à son contenu : vos modifications sont toujours là, elles ne sont simplement plus en partance.

C’est l’opération inverse de git add, et elle est totalement sans risque.

Récupérer une ancienne version d’un fichier

Celle-ci est précieuse, et peu connue :

git restore --source=HEAD~5 -- Logon.ps1

Vous récupérez le fichier tel qu’il était cinq enregistrements plus tôt, sans toucher au reste du dépôt ni à l’historique.