J'ai fait un commit et je suis revenu avec
git revert HEAD^
juste journal
➜ git:(master) git log
commit 45a0b1371e4705c4f875141232d7a97351f0ed8b
Author: Daniel Palacio <[email protected]>
Date: Tue Jan 17 16:32:15 2012 -0800
Production explanation
Mais si je me connecte, tout est toujours visible. Je dois le supprimer de l'historique car il contient des informations sensibles
git log --all
commit 5d44355080500ee6518f157c084f519da47b9391
Author: Daniel Palacio
Date: Tue Jan 17 16:40:48 2012 -0800
This commit has to be reset
commit 45a0b1371e4705c4f875141232d7a97351f0ed8b
Author: Daniel Palacio
Date: Tue Jan 17 16:32:15 2012 -0800
Production explanation
Comment puis-je supprimer le commit 5d44355080500ee6518f157c084f519da47b9391 de l'historique?
Tout d'abord, git revert
est la mauvaise commande ici. Cela crée un nouveau commit qui rétablit un ancien. Ce n'est pas ce que vous demandez. Deuxièmement, il semble que vous souhaitiez rétablir HEAD
au lieu de HEAD^
.
Si vous n'avez pas poussé cela nulle part, vous pouvez utiliser git reset --hard HEAD^
pour supprimer le dernier commit (cela supprime également les modifications non validées, assurez-vous donc que vous n'en avez pas à enregistrer). En supposant que vous soyez d'accord avec les informations sensibles présentes dans votre copie et que personne d'autre, vous avez terminé. Vous pouvez continuer à travailler et un git Push
ultérieur ne poussera pas votre mauvais commit.
Si ce n'est pas une hypothèse sûre (sinon, j'aimerais bien savoir pourquoi), vous devez alors expirer vos réflexions et forcer un ramassage des ordures qui regroupe tous les objets en suspens pour le moment. Vous pouvez le faire avec
git reflog expire --expire=now --expire-unreachable=now --all
git gc --Prune=now
bien que cela ne devrait être fait que si vous en avez absolument besoin.
Si vous avez poussé votre engagement, alors vous êtes plutôt malchanceux. Vous pouvez faire un push-force pour le rétablir à distance (bien que si le côté distant le permet), mais vous ne pouvez pas supprimer le commit lui-même de la base de données du côté distant, afin que toute personne ayant accès à ce référentiel puisse le trouver si sais quoi chercher.
Si vous ne vous souciez pas du commit, faites simplement:
git reset --hard HEAD~
souffler le commit.
Si vous voulez que les modifications soient dans le répertoire de travail, faites:
git reset HEAD~
Selon ce que vous avez fait avec git revert
, vous devrez peut-être modifier les commandes ci-dessus. Annuler crée un nouveau commit qui annule le commit que vous voulez annuler. Donc, il y aura deux commits. Vous devrez peut-être faire HEAD~2
pour les supprimer tous les deux.
Notez que, généralement, l’inversion est le moyen le plus sûr d’inverser les modifications. Mais ici, puisque vous souhaitez supprimer des données sensibles, la réinitialisation est la meilleure approche.
Il y a une bonne solution ici . Pour supprimer le dernier (top) commit que vous pouvez faire
git Push [remote] +[bad_commit]^:[branch]
où [bad_commit] est la validation vers laquelle pointe actuellement la branche, ou si la [branche] est extraite localement, vous pouvez également le faire.
git reset HEAD^ --hard
git Push [remote] -f
Si vous n'avez pas encore poussé le commit, vous pouvez simplement:
réinitialiser git - hard HEAD ~ 2
(HEAD ~ 2 pour supprimer votre commit original et votre "revert" commit).
Cela réinitialisera votre branche actuelle au point de l’historique avant le commit que vous souhaitez supprimer. Si ce commit ne se trouve dans aucune autre branche, il ne sera pas envoyé à votre origine.
Voici une solution simple qui supprime le dernier commit de remote:
$ git clone git@Host:PROJ/myrepo.git $ cd myrepo $ git log --pretty=oneline 234987fed789de97232ababababcef3234958723 bad_commit e4a2ec4a80ef63e1e2e694051d9eb3951b14c407 v4.3 2f116449144dbe46e7260d5dac2304803751b5c2 v4.2
$ git checkout e4a2ec4a80ef63e1e2e694051d9eb3951b14c407 $ git checkout -b temp_branch
git Push Origin --delete dev_branch git Push Origin temp_branch:dev_branch