Suppression dun commit git

Lorsque vous travaillez avec Git, vous constaterez que parfois les commits doivent être supprimés car ils ont introduit un bogue ou doivent être retravaillés.

Si cest le cas le dernier commit cest très simple. Exécutez simplement:

git reset HEAD^

Cela affichera le dernier commit mais laissera toutes les modifications apportées aux fichiers intactes.

Si vous avez besoin de supprimer plus que le dernier commit, vous pouvez utiliser deux méthodes. La première consiste à utiliser rebase cela vous permettra de supprimer un ou plusieurs commits consécutifs, lautre est cherry-pick qui vous permet de supprimer les commits non consécutifs.

Exemple git log

Nombre Hash Message de validation Auteur
1 2c6a45b (HEAD) Ajout dune méthode publique pour accéder à la méthode protégée Tom
2 ae45fab Mises à jour de linterface de base de données Contractant 1
3 77b9b82 Amélioration de linterface de la base de données Contractant 2
4 3c9093c A fusionné la branche de développement avec le maître Tom
5 b3d92c5 Ajout dun nouveau module Event CMS Paul
6 7feddbb Ajout dune classe et de fichiers CMS Tom
7 a809379 Ajout dun projet à Git Tom

Utilisation de Rebase

En utilisant le journal git ci-dessus, nous voulons supprimer les commits suivants; 2 & 3 (ae45fab & 77b9b82). Comme ce sont des commits consécutifs, nous pouvons utiliser rebase.

git rebase --onto <branch name>~<first commit number to remove> <branch name>~<first commit to be kept> <branch name>

par exemple pour supprimer les commits 2 & 3 ci-dessus

git rebase --onto repair~3 repair~1 repair

Utilisation de Cherry Pick

Étape 1: Trouvez le commit avant le commit vous voulez supprimer git log

Étape 2: Checkout that commit git checkout <commit hash>

Étape 3 : Créez une nouvelle branche en utilisant votre commit de paiement actuel git checkout -b <new branch>

Étape 4: Vous devez maintenant ajouter le commit après le commit supprimé git cherry-pick <commit hash>

Étape 5: Maintenant, répétez létape 4 pour tous les autres commits que vous voulez conserver.

Étape 6: Une fois que tous les commits ont été ajoutés à votre nouvelle branche et été engagé. Vérifiez que tout est dans le bon état et fonctionne comme prévu. Vérifiez que tout a été validé: git status

Étape 7: Passez à votre branche cassée git checkout <broken branch>

Étape 8: Effectuez maintenant une réinitialisation matérielle sur la branche cassée du commit avant celui que vous souhaitez supprimer git reset --hard <commit hash>

Étape 9: Fusionnez votre branche fixe dans cette branche git merge <branch name>

Étape 10: Repoussez les modifications fusionnées à lorigine. AVERTISSEMENT: cela écrasera le dépôt distant! git push --force origin <branch name>

Vous pouvez effectuer le processus sans créer de nouvelle branche en remplaçant létape 2 & 3 par létape 8 puis ne pas effectuer létape 7 & 9.

Exemple

Supposons que nous voulons supprimer les commits 2 & 4 du référentiel.

  1. git checkout b3d92c5 Récupérer le dernier commit utilisable.
  2. git checkout -b repair Créez une nouvelle branche sur laquelle travailler.
  3. git cherry-pick 77b9b82 Exécutez le commit 3.
  4. git cherry-pick 2c6a45b Exécuter le commit 1.
  5. git checkout master Checkout master.
  6. git reset --hard b3d92c5 Réinitialisez le maître sur le dernier commit utilisable.
  7. git merge repair Fusionnez notre nouvelle branche sur le maître.
  8. git push --hard origin master Push master vers le référentiel distant.

Note finale

Git rebase & cherrypick sont dangereux mais puissants des solutions qui ne doivent être utilisées quen dernier option et ne doit être entreprise que par quelquun qui sait ce quil fait. Attention, les deux solutions pourraient avoir des effets néfastes sur les autres utilisateurs qui travaillent sur le même référentiel / branche.

Enfin, noubliez pas dêtre prudent et bonne chance!

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *