On vient de voir comment défaire les modifications préliminaires à un commit. Maintenant comment peut-on traiter la phase post-commit, quels outils ou plus exactement quelles commandes sont à notre disposition pour défaire du travail présent dans des commits existants ?

La commande magique qui va nous servir de base pour défaire énormément de choses est encore reset. Si vous vous rappelez vos bases sur la manière dont Git crée un historique, vous vous souvenez donc qu’un historique projet n’est qu’une succession de commits qui se référencent à la chaîne, et que HEAD est la référence qui désigne notre emplacement courant. Si vous n’êtes pas à l’aise avec ces notions, je vous encourage à regarder notre cours gratuit d’introduction aux concepts clés de Git.

Pour en revenir à notre sujet, à savoir défaire des commits, reset va nous aider en déplaçant le HEAD. L’option de mode que prend reset nous permettra de préciser notre action et d’agir, en plus du dépôt local, sur l'index et la copie de travail selon ce qu’on cherche à défaire.

Déplacer HEAD, c’est-à-dire ?

Avant de rentrer dans le détail de la commande, essayons de comprendre un peu mieux ce qu’on entend par « déplacer le HEAD ». Je vous présente notre petit bonhomme log, qui représente une partie d’un historique projet, donc une série de commits et de branches, et aussi l’emplacement actuel de HEAD.

On vient de le rappeler, HEAD désigne le commit courant, qui correspond généralement à la tête de branche courante.

Quand on parle de déplacer HEAD avec la commande reset ça peut paraître effrayant. Mais rassurez-vous, Git a des mécanismes qui nous permettent d'éviter toute perte de données  (et que nous verrons un peu plus tard).

En résumé, on peut déplacer HEAD comme bon nous semble, d'avant en arrière dans notre historique, et même latéralement sur les branches.

On peut même revenir à notre emplacement initial. Est-ce que ça n'est pas magique ?

Effet des modes sur les zones

On a vu que reset nous permet de déplacer HEAD. Voyons un peu à quoi peut bien servir le mode qu’on peut lui passer en option.

Pour commencer, pas de surprise par rapport à ce qu’on vient de dire, tous les modes permettent de déplacer HEAD.

Ensuite, je vous avais indiqué qu’au-delà de déplacer HEAD on pouvait aussi agir sur les zones. C’est l’intérêt des modes. Mais commençons par le commencement : la commande reset propose 5 modes, --soft, --mixed, --keep, --merge et --hard. Si vous ne précisez pas de mode, ce sera --mixed par défaut. C’est donc ce mode qui est utilisé dans ce qu’on a vu précédemment pour désindexer des modifications, et c’est le seul mode à pouvoir agir sur des fichiers spécifiques.

Comme vous l’avez très certainement remarqué mon tableau regroupe les options --keep, --merge et --hard. Rassurez-vous nous verrons bientôt ce qui les différencie.

Revenons à nos histoires de zones. Ce tableau nous présente la portée d’action de reset selon le mode employé. Les modes y sont classés par ce qu’on pourrait appeler la force ou la puissance. Le premier mode, --soft, déplace uniquement HEAD sans toucher à l’index ni à la copie de travail. Le second mode, --mixed, déplacera HEAD et défera l’index, sans toucher à notre copie de travail. Enfin, les 3 derniers modes déplaceront HEAD et déferont l’index et la copie de travail. On verra un peu plus tard leurs différences.

Je l’avoue jusque là ça reste très abstrait. Retenez donc de ce tableau que les options --soft et --mixed sont là pour vous permettre de changer votre historique dans votre dépôt local en conservant l’état actuel des fichiers, alors que les 3 options restantes sont là pour vous permettre d’oublier le travail associé à un ou plusieurs commits.

Essayons de comprendre à l’aide de schémas comment agissent chacun de ces modes, sur nos zones et sur notre historique.

”Git Undo” ou le savoir-défaire

Détendez-vous ! Avec Git, il est facile de récupérer un travail paumé et de vous sortir de toutes les situations délicates…