web-dev-qa-db-fra.com

Comment annuler le dernier commit et le supprimer de l'historique?

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?

46
daniel

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.

53
Lily Ballard

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.

33
manojlds

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
7
dyrssen

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.

5
Bruno Oliveira

Voici une solution simple qui supprime le dernier commit de remote:

  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. commander le dernier bon commit dans une nouvelle branche temporaire
$ git checkout e4a2ec4a80ef63e1e2e694051d9eb3951b14c407
$ git checkout -b temp_branch
  1. remplacer la branche distante (par delete et Push the temp)
git Push Origin --delete dev_branch
git Push Origin temp_branch:dev_branch
0
chenchuk