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.
-
git checkout b3d92c5
Récupérer le dernier commit utilisable. -
git checkout -b repair
Créez une nouvelle branche sur laquelle travailler. -
git cherry-pick 77b9b82
Exécutez le commit 3. -
git cherry-pick 2c6a45b
Exécuter le commit 1. -
git checkout master
Checkout master. -
git reset --hard b3d92c5
Réinitialisez le maître sur le dernier commit utilisable. -
git merge repair
Fusionnez notre nouvelle branche sur le maître. -
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!