Attention : il faut garder à l’esprit que les commandes qui vont être présentées vont réécrire l’arbre des commits et si vous avez déjà envoyé celui-ci vers quelqu’un d’autre, les commandes vous obligeront à envoyer de force les modifications. Ceci entrainera des conflits et ce n’est jamais plaisant à résoudre. Dans ce cas les commandes ne sont pas recommandées.

Tout d’abord, tel un fichier .bashrc, un fichier .gitconfig (plus d’informations) dans votre dossier $HOME vous permettra de définir des alias. Ainsi, si vous avez des commandes Git trop longues ou compliquées à retenir, vous pouvez les y placer et obtenir une version plus pratique.

Exemple d’alias que j’utilise dans ~/.gitconfig :

[alias]
  # Annuler le dernier commit
  undo = reset --soft HEAD^

  # Editer le dernier commit
  amend = commit -p --amend --no-edit

Il arrive que vous ayez fait un commit avec un mauvais message ou que vous ayez sélectionné des modifications non désirées. Pour retirer le dernier commit, vous pouvez utiliser git reset --soft HEAD^. Cette commande réécrit l’arbre des commits en partant du bout, ici on annule le dernier commit tout en gardant les fichiers modifiés (option --soft). Vous pouvez également en annuler plusieurs d’un coup avec git reset --soft HEAD~33 représente le nombre de commits que vous souhaitez annuler.

Dans mon cas, si je viens de faire un commit dont je ne suis finalement pas content, je peux revenir rapidement en arrière avec mon alias git undo.

Si vous avez oublié d’ajouter quelque chose à votre dernier commit et que vous ne souhaitez pas ajouter un commit supplémentaire et faire des manipulations pénibles, vous pouvez utiliser git commit -p --amend --no-edit. Cette commande va vous faire valider les modifications que vous souhaitez ajouter (option -p) puis va fusionner ces modifications avec le dernier commit (option --amend) pour en faire un nouveau avec tout. Le message du nouveau commit sera repris de l’ancien (option --no-edit).

Maintenant imaginez que vous ayez fait une mauvaise manipulation du type : fusion de plusieurs mauvaises branches le tout saupoudré de mauvais choix de résolution de conflits et que vous ayez tenté de corriger des éléments en réécrivant l’arbre des commits et que vous avez fait un push force. Vous vous retrouvez avec un dépôt avec du code bancal et il serait mieux de revenir en arrière pour refaire un cheminement propre. Malheureusement la réécriture de l’arbre des commits et le push force vous bloque l’accès aux solutions simples.

Heureusement Git loggue également les opérations que vous effectuez sur votre dépôt local, par exemple, quand vous changez de branche, quand vous effectuez une fusion, etc. Avec la commande git reflog vous pouvez consulter ces logs. Ils s’affichent sous cette forme :

a9800d6 HEAD@{0}: checkout: moving from master to post/git-tricks
a9800d6 HEAD@{1}: pull: Fast-forward
7fce1bf HEAD@{2}: checkout: moving from post/permissions-voter to master
b17d507 HEAD@{3}: commit (amend): Add the permissions post
7f44dd4 HEAD@{4}: commit: Add the permissions post
7fce1bf HEAD@{5}: checkout: moving from master to post/permissions-voter
7fce1bf HEAD@{6}: pull: Fast-forward

La première colonne indique la référence du log, la deuxième vous indique la position et la dernière l’opération effectuée ainsi que les messages des commits. En admettant que que j’ai fait une erreur lors de l’opération commit (amend): Add the permissions post qui as été retiré et remplacé le commit de l’opération commit: Add the permissions post, je souhaiterais revenir au commit dont la référence est : 7f44dd4. Hors ce commit n’existe plus dans l’arbre vu qu’il a été retiré. Mais grâce à la référence, je peux retrouver l’arbre que j’avais avant de faire des opérations malencontreuses. La commande git reset --hard 7f44dd4 vous fait retourner à l’état précédent. Attention: toutes les modifications de fichiers auront été oubliées.

Vous savez maintenant comment manipuler les commits Git afin de récupérer des erreurs effectuées.