59 votes

Comment revenir sur le dernier commit et le supprimer de l'historique ?

J'ai fait un commit et j'ai inversé avec

git revert HEAD^

juste le journal git

  git:(master) git log
commit 45a0b1371e4705c4f875141232d7a97351f0ed8b
Author: Daniel Palacio <danpal@gmail.com>
Date:   Tue Jan 17 16:32:15 2012 -0800

    Production explanation

Mais si je fais git log --all, il apparaît toujours. 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 supprimer le commit 5d44355080500ee6518f157c084f519da47b9391 de l'historique ?

0 votes

Duplication possible de Git undo last commit

0 votes

@AdrianCornish : C'est un bon début, mais cela n'aide pas à résoudre le problème des "informations sensibles".

0 votes

@KevinBallard - un git reset --hard will ? En supposant qu'il n'a été poussé nulle part - s'il a été poussé, tous les paris sont ouverts.

75voto

Kevin Ballard Points 88866

Tout d'abord, git revert n'est pas la bonne commande. Cela crée un nouveau commit qui annule un plus ancien. Ce n'est pas ce que vous demandez. Deuxièmement, il semble que vous vouliez inverser HEAD au lieu de HEAD^ .

Si vous ne l'avez pas poussé quelque part, vous pouvez utiliser git reset --hard HEAD^ pour supprimer le dernier commit (cela supprime également les modifications non validées, donc assurez-vous que vous n'en avez pas que vous souhaitez sauvegarder). En supposant que vous soyez d'accord avec la présence d'informations sensibles dans le fichier votre copie et de personne d'autre, c'est fini. Vous pouvez continuer à travailler et un git push ne poussera pas à la faute.

Si ce n'est pas une hypothèse sûre (mais si ce n'est pas le cas, j'aimerais savoir pourquoi), alors vous devez expirer vos reflogs et forcer un garbage collection qui collecte tous les objets en suspens dès maintenant. Vous pouvez le faire avec

git reflog expire --expire=now --expire-unreachable=now --all
git gc --prune=now

mais cela ne doit être fait que si c'est absolument nécessaire.


Si vous avoir a poussé votre engagement, vous n'avez pas de chance. Vous pouvez faire un force-push pour revenir en arrière à distance (mais seulement 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, donc n'importe qui ayant accès à ce dépôt peut le retrouver s'il sait ce qu'il doit chercher.

50voto

manojlds Points 96599

Si vous ne vous souciez pas de l'engagement, faites-le :

git reset --hard HEAD~

pour faire sauter l'engagement.

Si vous voulez que les modifications soient dans le répertoire de travail, faites :

git reset HEAD~

En fonction de ce que vous avez fait avec git revert Il se peut que vous deviez modifier les commandes ci-dessus. Revert crée un nouveau commit qui annule le commit que vous vouliez annuler. Il y aura donc deux livraisons. Il se peut que vous deviez faire HEAD~2 pour les retirer tous les deux.

Notez que, généralement, revert est le moyen le plus sûr pour, eh bien, inverser les changements. Mais ici, comme vous souhaitez supprimer des données sensibles, la réinitialisation est la meilleure approche.

13voto

dyrssen Points 158

Il existe une solution intéressante ici . Pour supprimer le dernier engagement (le plus élevé), vous pouvez procéder comme suit

git push [remote] +[bad_commit]^:[branch]

où [bad_commit] est le commit vers lequel [branch] pointe actuellement, ou si la [branch] est extraite localement, vous pouvez également faire

git reset HEAD^ --hard
git push [remote] -f

9voto

Bruno Oliveira Points 1130

Si vous n'avez pas encore poussé le commit, vous pouvez simplement le faire :

git reset --hard HEAD~2

(HEAD~2 pour supprimer votre commit original et votre commit "revert").

Cela réinitialisera votre branche actuelle au point de l'histoire précédant le commit que vous souhaitez supprimer. Si ce commit n'est dans aucune autre branche, il ne sera pas poussé vers votre origine.

0 votes

Cela n'aide pas à comprendre l'histoire. Le commit est toujours dans l'historique.

2 votes

Pas vraiment, à partir de ce moment, ce commit ne fera plus partie de votre branche actuelle, et sera finalement supprimé par git gc. Si vous voulez supprimer le commit tout de suite, vous pouvez utiliser git gc pour l'élaguer maintenant, ou cloner le dépôt à nouveau ; lors du clonage d'un dépôt, seuls les commits atteignables par une branche sont clonés.

1voto

chenchuk Points 1960

Voici une solution simple qui permet de supprimer le dernier commit du serveur distant :

  1. cloner le repo et trouver le dernier "bon" commit (....c407)
$ git clone git@host:PROJ/myrepo.git 
$ cd myrepo 
$ git log --pretty=oneline

234987fed789de97232ababababcef3234958723 bad_commit
e4a2ec4a80ef63e1e2e694051d9eb3951b14c407 v4.3
2f116449144dbe46e7260d5dac2304803751b5c2 v4.2
  1. extraire le dernier bon commit vers une nouvelle branche temporaire
$ git checkout e4a2ec4a80ef63e1e2e694051d9eb3951b14c407
$ git checkout -b temp_branch
  1. remplacer la branche distante ( en supprimant et en poussant la branche temporaire )
git push origin --delete dev_branch
git push origin temp_branch:dev_branch

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X