Supprimer les commits d'une branche dans Git

Je voudrais savoir comment supprimer un commit.

Par delete, Je veux dire que c'est comme si je n'avais pas fait ce commit, et quand je fais un push dans le futur, mes modifications ne pousseront pas vers la branche distante.

J'ai lu git help, Et je pense que la commande que je devrais utiliser est git reset --hard HEAD. Est-ce correct?

2644
demandé sur Randall 2009-08-27 07:39:50

27 réponses

Attention: git reset --hard supprimera vos modifications de répertoire de travail . Assurez-vous de stocker toutes les modifications locales que vous souhaitez conserver avant d'exécuter cette commande.

En supposant que vous êtes assis sur ce commit, alors cette commande va le délirer...

git reset --hard HEAD~1

Le HEAD~1 signifie le commit Avant head.

Ou, vous pouvez regarder la sortie de git log, Trouver l'id de validation de la validation que vous voulez sauvegarder, puis faites ceci:

git reset --hard <sha1-commit-id>

Si vous déjà poussé, vous aurez besoin de faire une force de pousser pour se débarrasser d'elle...

git push origin HEAD --force

Cependant, si d'autres ont tiré, alors vous serait mieux de commencer une nouvelle branche. Parce que quand ils tirent, il va juste le fusionner dans leur travail, et vous l'obtiendrez repoussé à nouveau.

Si vous avez déjà poussé, il peut être préférable d'utiliser git revert, pour créer un commit "image miroir" qui annulera les modifications. Toutefois, les deux commits seront dans le journal.


Pour info -- git reset --hard HEAD est génial si vous voulez vous débarrasser des travaux en cours. Il vous réinitialisera à la validation la plus récente et effacera tous les changements dans votre arbre de travail et votre index.


Enfin, si vous avez besoin de trouver un commit que vous avez "supprimé", il est généralement présent dans git reflog sauf si vous avez récupéré votre dépôt.

3388
répondu gahooa 2016-02-02 07:58:31

Si vous n'avez pas encore poussé la commettre n'importe où, vous pouvez utiliser git rebase -i pour supprimer ce commit. Tout d'abord, découvrez à quelle distance ce commit est (approximativement). Alors faites:

git rebase -i HEAD~N

Le ~N signifie rebase la dernière N s'engage (N doit être un nombre, par exemple HEAD~10). Ensuite, vous pouvez modifier le fichier que Git vous présente pour supprimer le commit incriminé. Lors de l'enregistrement de ce fichier, Git réécrira alors tous les commits suivants comme si celui que vous avez supprimé n'existait pas.

Le Git Le livre a une bonne section sur le rebasage avec des images et des exemples.

Soyez prudent avec cela, car si vous changez quelque chose que vous avez poussé ailleurs, une autre approche sera nécessaire sauf si vous prévoyez de faire une poussée de force.

617
répondu Greg Hewgill 2016-10-21 00:51:07

Une autre possibilité est l'une de mes commandes préférées personnelles:

git rebase -i <commit>~1

Cela va démarrer le rebase en mode interactif -i au point juste avant le commit que vous voulez frapper. L'éditeur commencera à lister tous les commits depuis lors. Supprimez la ligne contenant le commit que vous souhaitez effacer et enregistrez le fichier. Rebase fera le reste du travail, en supprimant uniquement ce commit et en rejouant tous les autres dans le journal.

420
répondu 1800 INFORMATION 2009-08-27 03:49:27

J'ajoute cette réponse parce que je ne vois pas pourquoi quiconque vient d'essayer de commettre un travail voudrait supprimer tout ce travail à cause d'une erreur en utilisant Git!

Si vous voulez garder votre travail et simplement 'annuler' cette commande commit (vous avez attrapé avant de pousser à repo):

git reset --soft HEAD~1

N'utilisez pas l'option --dur drapeau, sauf si vous voulez détruire votre travail en cours depuis le dernier commit.

287
répondu Rob 2012-10-15 18:17:58

La Suppression d'un ensemble de commettre

git rebase -p --onto SHA^ SHA

Remplacez évidemment " SHA " par la référence dont vous voulez vous débarrasser. Le " ^ " dans cette commande est littéral.

Http://sethrobertson.github.io/GitFixUm/fixup.html

52
répondu raittes 2015-08-31 19:36:46

Si vous n'avez pas publié de modifications, pour supprimer la dernière validation, vous pouvez faire

$ git reset --hard HEAD^

(notez que cela supprimerait également toutes les modifications non validées; utilisez avec soin).

Si vous avez déjà publié un commit à supprimer, utilisez git revert

$ git revert HEAD
46
répondu Jakub Narębski 2009-08-27 10:47:42
git reset --hard commitId

git push <origin> <branch> --force

PS: CommitId fait référence à celui auquel vous voulez revenir

33
répondu sun34 2017-08-12 10:13:42

Si vous voulez réparer votre dernier commit, vous pouvez annuler la validation, et unstage les fichiers qu'il contient, en faisant:

git reset HEAD~1

Cela ramènera votre référentiel à son état avant les commandes git add qui ont mis en scène les fichiers. Vos modifications seront dans votre répertoire de travail. HEAD~1 fait référence au commit sous la pointe actuelle de la branche.

Si vous voulez annuler N commits, mais conserver les modifications de code dans votre répertoire de travail:

git reset HEAD~N

Si vous voulez vous débarrasser de votre dernière commit, et ne veulent pas garder les changements de code, vous pouvez faire une réinitialisation "dure".

git reset --hard HEAD~1

De même, si vous voulez ignorer les N derniers commits et ne voulez pas conserver les modifications de code:

git reset --hard HEAD~N
28
répondu Anurag-Sharma 2014-05-31 07:19:37

Changer Avec Force L'Historique

En supposant que vous ne voulez pas simplement supprimer le dernier commit, mais que vous voulez supprimer des commits spécifiques des n derniers commits, allez avec:

git rebase -i HEAD~<number of commits to go back>, donc git rebase -i HEAD~5 si vous souhaitez voir la dernière des cinq s'engage.

, Puis dans l'éditeur de texte modifier le mot pick à drop à côté de chaque livraison que vous souhaitez supprimer. Enregistrez et quittez l'éditeur. Voila!

Modifier Additivement L'Historique

Essayez git revert <commit hash>. Revert{[21] } va créer un nouveau commit qui annule le commit spécifié.

21
répondu IliasT 2018-04-27 06:06:50

Disons que nous voulons supprimer les commits 2 et 4 du repo.

commit 0 : b3d92c5
commit 1 : 2c6a45b
commit 2 : <any_hash>
commit 3 : 77b9b82
commit 4 : <any_hash>

Note: Vous devez avoir des droits d'administrateur sur le repo puisque vous utilisez --hard et -f.

  • git checkout b3d92c5 extrait le dernier commit utilisable.
  • git checkout -b repair crée une nouvelle branche sur laquelle travailler.
  • git cherry-pick 77b9b82 Exécuter par commit 3.
  • git cherry-pick 2c6a45b exécuter par commit 1.
  • git checkout master maître de caisse.
  • git reset --hard b3d92c5 réinitialise le maître à la dernière validation utilisable.
  • git merge repair fusionner notre nouveau branche sur master.
  • git push -f origin master poussez le maître vers le dépôt distant.
19
répondu tk_ 2018-03-19 04:02:24
git rebase -i HEAD~2

Ici ' 2 ' est le nombre de commits que vous voulez rebaser.

'git rebase -i HEAD`

Si vous voulez rebaser tous les commits.

Ensuite, vous pourrez choisir l'une de ces options.

p, pick = use commit

r, reword = use commit, but edit the commit message

e, edit = use commit, but stop for amending

s, squash = use commit, but meld into previous commit

f, fixup = like "squash", but discard this commit's log message

x, exec = run command (the rest of the line) using shell

d, drop = remove commit

Ces lignes peuvent être réordonnées; elles sont exécutées de haut en bas. Si vous supprimez une ligne ici, le COMMIT sera perdu. Cependant, si vous supprimez tout, le le rebase sera annulé. Notez que les commits vides sont commentés

Vous pouvez simplement supprimer ce commit en utilisant l'option " d " ou en supprimant une ligne contenant votre commit.

15
répondu Siva Praveen 2016-05-18 23:39:53

Pour supprimer dans la branche locale, utilisez

git reset --hard HEAD~1

Pour supprimer une branche distante, utilisez

git push origin HEAD --force
11
répondu thestar 2014-08-28 16:06:07

Voici une autre façon de le faire:

Extraire la branche que vous voulez rétablir, puis réinitialiser votre copie de travail locale à la validation que vous voulez être la dernière sur le serveur distant (tout après cela ira au revoir). Pour ce faire, dans SourceTree, j'ai fait un clic droit sur le et sélectionné "réinitialiser BRANCHNAME à ce commit". Je pense que la ligne de commande est:

git reset --hard COMMIT_ID

Puisque vous venez de vérifier votre branche à distance, vous n'aurez pas de modifications locales à vous soucier perdre. Mais cela les perdrait si vous le faisiez.

Ensuite, accédez au répertoire local de votre référentiel et exécutez cette commande:

git -c diff.mnemonicprefix=false -c core.quotepath=false \
push -v -f --tags REPOSITORY_NAME BRANCHNAME:BRANCHNAME

Cela effacera tous les commits après celui en cours dans votre référentiel local mais seulement pour cette branche.

7
répondu CommaToast 2014-05-14 06:47:06

L'erreur:

Je git rebase -i --root'ed ma branche, pensant par ignorance que je pourrais reformuler le premier commit différent du maître (la vue par défaut de github pour Windows est la comparaison au maître, cachant son intégralité).

J'ai poussé une barbe de Silicon Valley alors que 900 + commits se sont chargés en Sublime. Sortant sans changement, j'ai chargé ma batterie puis j'ai procédé au rasage, car tous les 900 + commits individuels ont été rebasés de manière nonchalante - réinitialisant leurs temps de validation maintenant.

Déterminé à battre Git et à préserver les temps d'origine, j'ai supprimé ce référentiel local et re-cloné de la télécommande.

Maintenant, il avait ajouté un commit inutile le plus récent au maître que je voulais supprimer, donc procédé comme ça.

Épuiser les options:

Je ne voulais pas git revert - cela créerait un commit supplémentaire, donnant à Git le dessus.

git reset --hard HEAD n'a rien fait, après avoir vérifié le reflog, le dernier et le seul HEAD était le clone-Git gagner.

Pour obtenir le SHA le plus récent, j'ai vérifié le référentiel distant sur github.com -victoire mineure.

Après avoir pensé que git reset --hard <SHA> avait fonctionné, j'ai mis à jour une autre branche pour maîtriser et 1... 2... pouf! le commit était de retour - git gagne.

Retour à master, il est temps d'essayer git rebase -i <SHA>, puis retirez la ligne... en vain, c'est triste à dire. " Si vous supprimez une ligne ici, le COMMIT sera perdu". Ah...passé sous silence la nouvelle fonctionnalité troll le n00b dans la version 2.8.3 notes.

La solution:

git rebase -i <SHA> alors d, drop = remove commit.

Pour vérifier, j'ai vérifié à une autre branche, et le tour est joué - pas de commit caché pour aller chercher / tirer du maître.

Https://twitter.com/holman/status/706006896273063936

Bonne journée.

7
répondu Leo 2016-05-25 20:54:19

Toutes les commandes ci-dessus restaurent l'état de votre arbre de travail et indexent tel qu'ils étaient avant de faire la validation, mais ne restaurent pas l'état du référentiel. Si vous le regardez, la "suppression" d'engager n'est pas réellement supprimé, il n'est tout simplement pas l'un sur l'extrémité de la branche courante.

Je pense qu'il n'y a aucun moyen de supprimer un commit avec porcelaine commandes. Le seul moyen est de le supprimer du journal et du reflog, puis d'exécuter un git prune --expire -now.

6
répondu Angelo Borsotti 2012-10-31 04:31:08

Si vous venez de foiré votre dernier commit (mauvais message, oublié d'ajouter quelques modifications) et que vous voulez le réparer avant de le pousser dans un repo public pourquoi ne pas utiliser:

git commit --amend -m "New message here"

Si vous avez des modifications nouvellement mises en scène, elles seront combinées avec le dernier commit (dont vous essayez de vous débarrasser) et remplaceront ce commit.

Bien sûr, si vous modifiez un commit après l'avoir poussé, vous réécrivez l'historique, donc si vous le faites, assurez-vous de comprendre les implications.

Vous pouvez également passer le '--no-edit' au lieu de '-m' si vous préférez utiliser la précédente livraison du message.

Docs: http://git-scm.com/docs/git-commit.html

5
répondu Pwnrar 2014-05-26 23:24:22

Si vous voulez conserver l'historique, montrant le commit et le revert, vous devez utiliser:

git revert GIT_COMMIT_HASH

Entrez le message expliquant pourquoi vous revenez, puis:

git push  

Lorsque vous émettez git log vous verrez à la fois le" mauvais " commit et revert les messages du journal.

5
répondu Paulo Fidalgo 2015-01-07 15:13:35

Ce que je fais habituellement quand je commit et push (si quelqu'un a poussé son commit cela résout le problème):

git reset --hard HEAD~1

git push -f origin

Espérons que cette aide

3
répondu Chris Sim 2017-06-14 09:22:56

Si vous avez déjà poussé, trouvez d'abord le commit que vous voulez être en tête ($GIT_COMMIT_HASH_HERE) , puis exécutez ce qui suit:

git reset --hard $GIT_COMMIT_HASH_HERE
git push origin HEAD --force

Ensuite, chaque endroit où le repo a été cloné, exécutez:

git reset --hard origin/master
2
répondu Justin 2017-01-30 00:31:00

Source: https://gist.github.com/sagarjethi/c07723b2f4fa74ad8bdf229166cf79d8

Supprimer le dernier commit

Par exemple votre dernier commit

Git push origine + aa61ab32^: maître

Maintenant, vous voulez supprimer ce commit alors un moyen Facile de le faire suivant

Étapes

  1. Réinitialisez D'abord la branche au parent de la validation en cours

  2. Force-poussez-le vers le distant.

git reset HEAD^ --hard

git push origin -f

Pour un commit particulier, vous voulez réinitialiser suit

git reset bb676878^ --hard

git push origin -f
2
répondu sagar jethi 2018-06-22 13:40:59

Réinitialiser sur la branche locale

git reset --hard HEAD~<Number of commit> So git reset --hard HEAD~3

Forcer la poussée vers l'origine

git push -f origin
1
répondu Ashish Singh 2018-05-29 07:38:04

En supposant que vous n'avez pas poussé vers le référentiel distant, vous pouvez re-cloner le référentiel. Cela a été ma méthode de choix à quelques reprises.

0
répondu zacharydl 2014-12-31 06:54:56

Git reset --hard

Git push origin HEAD --force

Si un ou plusieurs commits sont marqués, supprimez d'abord les balises. sinon le commit marqué n'est pas supprimé.

0
répondu BillChan 2015-07-24 14:45:51

Utiliser git revert https://git-scm.com/docs/git-revert . il va rétablir tout le code alors vous pouvez faire la prochaine validation.Ensuite, head pointera vers ce dernier commit. les commits revertés ne sont jamais supprimés mais cela n'affectera pas votre dernier commit.

0
répondu Uttam Rahane 2017-03-01 15:15:44

supprimer de validation

Comme vous pouvez le voir sur l'image ci-dessus, je veux supprimer revert"test change 2" commit(SHA1 ID: 015b5220c50e3dfbb1063f23789d92ae1d3481a2(Vous pouvez obtenir SHA1 ID en utilisant la commande gitk dans Git bash)).

Pour cela, je peux utiliser(tout le travail de commande ci-dessous sur local seulement. vous devez pousser après Supprimer):

  1. git reset --hard 515b5220c50e3dfbb1063f23789d92ae1d3481a2 / / il Vous sauvegarde à ce commit (SHA1 ID de Test change 4 commit est 515b5220c50e3dfbb1063f23789d92ae1d3481a2)
  2. git reset --hard HEAD~1 / / il Vous sauvegarde avant un commit.
  3. git reset --hard HEAD^ / / pour supprimer le dernier commit de git

Après supprimer:

après la suppression de commettre

0
répondu ankit 2018-07-03 06:51:42

Prenez une sauvegarde de votre code dans le dossier temp. La commande suivante réinitialisera même que le serveur.

git reset --hard HEAD
git clean -f
git pull

Si vous souhaitez conserver vos modifications et supprimer les commits récents

git reset --soft HEAD^
git pull
0
répondu Lava Sangeetham 2018-07-20 05:14:18