Comment réparer, modifier ou annuler les commits Git (modification de l'historique Git) - CloudSavvy IT
Agence web » Actualités du digital » Comment réparer, modifier ou annuler les commits Git (modification de l’historique Git) –

Comment réparer, modifier ou annuler les commits Git (modification de l’historique Git) –

L’historique des commits de Git est conçu pour être immuable (pour la plupart) et suivre chaque changement dans votre projet afin que vous ne perdiez jamais de travail. Cependant, il est parfois nécessaire de réécrire l’historique de Git, Git fournit donc quelques outils pour éditer les commits existants.

Ajouter de nouvelles modifications aux commits

Le cas d’utilisation le plus courant est lorsque vous créez un message de validation, puis, avant de pousser votre télécommande, réalisez que vous vous êtes trompé et que vous devez apporter un petit changement. Vous pouvez bien sûr simplement faire un deuxième commit, mais c’est inutile, et cela montre également à tous vos collègues votre erreur stupide lorsque vous poussez finalement vers la télécommande.

Si vous ajoutez simplement des modifications, vous pouvez utiliser git commit --amend. Cela modifie le commit le plus récent et fusionne les modifications supplémentaires que vous avez mises en scène.

Tout d’abord, vous devez organiser vos modifications :

git add .

Et puis modifiez :

git commit --amend --no-edit

Le --no-edit flag fera que la commande ne modifie pas le message de validation. Si vous avez besoin de clarifier les nouvelles modifications dans un nouveau message, laissez cet indicateur de côté et vous serez invité à saisir le nouveau message de validation.

Sous le capot, la commande amender effectue un nouveau commit avec les modifications supplémentaires, puis remplace complètement le commit source dans l’historique Git. L’ancien commit est toujours accessible depuis git reflog (plus de détails ci-dessous), mais à l’avenir, le nouveau commit est le seul qui existe. Lorsque vous poussez vers un dépôt distant, il n’y a aucun moyen de savoir que le commit a été modifié, c’est un changement purement local.

Pour cette raison, vous ne voudrez pas modifier les commits qui ont déjà été poussés, car vous rencontrerez de nombreux problèmes et devrez forcer la commande à distance, ce qui n’est bon pour personne.

Changer juste le message de validation Git

Si vous n’avez pas besoin d’apporter de modifications et que vous souhaitez simplement corriger une faute de frappe, vous pouvez exécuter amend sans aucun changement aussi :

git commit --amend -m "an updated commit message"

Désactivation des modifications des commits

La commande amender de Git ne fonctionne que si vous êtes strictement ajouter changements. Lorsque nous disons « ajouté », nous ne parlons pas seulement de nouvelles lignes de code ; changer une ligne de code, c’est aussi ajouter des changements. La suppression d’une ligne de code ou d’un fichier entier est également une modification ajoutée, même si elle supprime des données du projet lorsque cette modification est appliquée.

Cependant, il existe également des cas où vous souhaiterez peut-être supprimer les modifications des commits. Par exemple, disons que vous avez exécuté :

git add .
git commit

Et ajouté chaque changement de votre dépôt aux changements mis en scène, et l’a validé, avant de se rendre compte, « oh merde ! Je n’avais pas l’intention de valider ce fichier ! » Dans ce cas, vous devrez renvoyer toutes les modifications au transfert, puis désinstaller manuellement les fichiers que vous ne souhaitez pas transférer.

La solution consiste à effectuer une réinitialisation, en supprimant le commit et en renvoyant les modifications. Il existe plusieurs types de réinitialisations, mais elles impliquent toutes de prendre des commits de l’historique de Git et de les renvoyer soit au staging, au répertoire local ou directement à la corbeille.

Dans ce cas, une réinitialisation logicielle est ce que vous voulez, qui renverra toutes les modifications à la mise en scène. Vous pouvez utiliser le raccourci suivant pour réinitialiser le commit derrière le HEAD, sinon vous devrez récupérer la référence de git reflog:

git reset --soft HEAD~

Ensuite, vous devrez supprimer le fichier que vous ne voulez pas valider. La façon de procéder est en fait également une réinitialisation, dans ce cas, une réinitialisation mixte sur un fichier spécifique :

git reset --mixed filename

Cela fonctionne car la réinitialisation de ce fichier supprimera les modifications de la mise en scène, et il ne sera pas validé lorsque vous refaites la validation.

Vous pouvez également effectuer une réinitialisation mixte sur l’ensemble du référentiel, et git add tous les fichiers sauf celui que vous ne voulez pas. C’est plus facile à faire si vous utilisez un client GUI Git.

Besoin d’annuler/supprimer un commit ? Utiliser la restauration

L’annulation d’un commit est le moyen le plus simple de supprimer les modifications. Fondamentalement, il prend toutes les modifications du commit cible et applique le contraire. Si vous avez créé un fichier, il est supprimé. Si vous avez supprimé une ligne de code, ce code est rajouté. C’est la méthode approuvée par Git pour « supprimer » ou « annuler » un commit, car l’original est toujours conservé dans l’historique git.

Pour l’utiliser, exécutez git log pour voir les commits :

git log

Copiez l’ID de référence, puis rétablissez le commit :

git revert 62ff517cc7c358eaf0bffdebbbe1b38dea92ba0f

Si vous venez de rester coincé dans vim, appuyez sur Q et exécutez peut-être git config --global core.editor "nano".

Utilisez le rebasage pour tout ce qui est plus compliqué

Le rebasage est essentiellement une méthode de déplacement des commits dans votre référentiel. Plutôt que de fusionner, rebase réécrit l’historique de git pour déplacer les commits individuels vers un nouvel emplacement. Les commits originaux sont laissés en suspens et sont supprimés de l’historique officiel de Git, bien qu’ils soient toujours là dans git reflog.

Nous n’entrerons pas dans les détails exacts ici, mais si vous êtes intéressé par son fonctionnement, vous pouvez lire notre guide d’utilisation git rebase.

Et si vous vouliez y retourner ?

Heureusement, Git conserve une trace de chaque changement, même lorsque vous enfreignez les règles et réécrivez l’histoire.

Chaque fois que votre conseil de branche est mis à jour pour une raison quelconque, Git stocke l’état du contenu du répertoire avant la mise à jour dans le Journal de référence, ou alors reflog. Vous pouvez consulter le journal avec git reflog:

git reflog

Beaucoup d’entre eux seront des commits réels, mais cela inclut également d’autres changements. Si vous devez revenir à une modification individuelle, vous pouvez effectuer une réinitialisation matérielle :

git reset --hard fdb9db9

Cela fournit un bon filet de sécurité, mais vous devez être averti que reflog ne suit que les changements qui ont été réellement validés, pas seulement mis en scène, et il ne suit que les mouvements de la pointe de la branche. De plus, reflog ne conserve les entrées que pendant 90 jours. Après cela, vous ne pourrez que réinitialiser les commits réels.

★★★★★