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

0
217

L'historique des commits de Git est conçu pour être immuable (pour la plupart) et suivre chaque modification dans votre projet pour ne jamais perdre 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< /h2>

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 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 changements, 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 place.

Vous devez d'abord mettre en place vos modifications :

git add .

Et puis modifiez :

git commit –amend –no-edit

L'indicateur –no-edit empêchera la commande de modifier le message de validation. Si vous avez besoin de clarifier les nouvelles modifications dans un nouveau message, laissez ce drapeau 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 à partir de 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é, il s'agit d'un changement purement local.

Publicité

Pour cette raison, vous ne voulez modifier les commits qui ont déjà été poussés, car vous rencontrerez de nombreux problèmes et devrez forcer le push vers la télécommande, ce qui n'est bon pour personne.

Modifier uniquement 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 également exécuter amender sans aucune modification :

git commit –amend -m “un message de commit mis à jour”

Annuler les modifications des commits

La commande Git’s amender ne fonctionne que si vous& #8217 ; vous ajoutez strictement des modifications. Quand on dit “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 réaliser, “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.

Publicité

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 vous ne voulez pas être engagé. 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 recommencerez le commit.

Vous pouvez également effectuer une réinitialisation mixte sur l'ensemble du référentiel et git ajouter 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 “supprimer” ou “annuler” un commit, car l'original est toujours conservé dans l'historique de git.

Pour l'utiliser, exécutez git log pour afficher les commits :

git log

Copiez l'ID de référence, puis annulez le commit :

git revert 62ff517cc7c358eaf0bffdebbbe1b38dea92ba0f

Si vous venez de rester bloqué dans vim, appuyez sur Q, et peut-être exécuter git config –global core.editor “nano”.

Utiliser 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 d'origine sont laissés en suspens et sont supprimés de l'historique officiel de Git, bien qu'ils soient toujours là dans git reflog.

Publicité

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 de git rebase.

Et si vous vouliez revenir en arrière ?

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 reflog. Vous pouvez afficher le journal avec git reflog :

git reflog

Beaucoup d'entre eux seront des commits réels , mais il inclut également d'autres changements. Si vous devez revenir à un changement individuel, 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 commis, pas seulement mis en scène, et il ne suit que les mouvements de l'extrémité 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.