Supprimer les validations d'une branche dans Git

3233

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 ferai un push à l'avenir, mes changements ne seront pas poussés vers la branche distante.

J'ai lu l'aide de git, et je pense que la commande que je devrais utiliser est git reset --hard HEAD. Est-ce correct?

hap497
la source
41
Je pense que ce n'est pas un doublon de Git undo last commit car il demande comment supprimer un commit d'une branche. Je pense également qu'aucune des réponses ne répond réellement à cette question. Ils rembobinent tous les derniers commit , pas cherry-picket deleteun seul commit qui a eu lieu il y a quelque temps.
Chris
12
@Chris, la réponse avec git rebase -i HEAD~10répond à la question, car elle vous permet de choisir arbitrairement des commits à supprimer. Git applique les validations dans la plage que vous spécifiez une par une, en ignorant les validations que vous avez supprimées du journal. J'ai utilisé cette commande aujourd'hui pour me débarrasser des deuxième et troisième commits les plus récents de mon dépôt tout en conservant le premier. Je suis d'accord qu'aucune des autres réponses n'est satisfaisante.
MST
@MST oui, j'aurais dû dire, aucune des options de la réponse acceptée ne répond à cette question, mais vous avez tout à fait raison - cette commande semble fonctionner
Chris

Réponses:

4128

Attention: git reset --hard SUPPRIMERA VOS CHANGEMENTS DE RÉPERTOIRE DE TRAVAIL . Assurez-vous de cacher toutes les modifications locales que vous souhaitez conserver avant d'exécuter cette commande.

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

git reset --hard HEAD~1

Le HEAD~1signifie le commit avant la tête.

Ou, vous pouvez regarder la sortie de git log, trouver l'id de commit du commit que vous souhaitez sauvegarder, puis faire ceci:

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

Si vous l'avez déjà poussé, vous devrez faire une poussée de force pour vous en débarrasser ...

git push origin HEAD --force

Cependant , si d'autres l'ont peut-être retiré, vous feriez mieux de commencer une nouvelle branche. Parce que quand ils tireront, cela le fusionnera simplement dans leur travail, et vous le repousserez.

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. Cependant, les deux validations seront dans le journal.


FYI - git reset --hard HEADest idéal si vous voulez vous débarrasser des TRAVAUX EN COURS. Il vous réinitialisera sur le commit le plus récent et effacera toutes les modifications dans votre arborescence 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 à git reflogmoins que vous n'ayez récupéré votre mémoire.

gahooa
la source
59
HEAD~1ou tout simplement HEAD^. Si vous avez poussé, vous devriez utiliser à la git revertplace.
Jakub Narębski
13
De toute évidence, vous pouvez également utiliser HEAD~npour "revenir en arrière" les ncommits de votre tête. Peut-être ... --hard HEADqu'à partir de ce point, vous pouvez également interpréter comme HEAD~0=> la suppression du travail en cours.
nuala
13
@ beamrider9 imho git rebase est presque toujours le meilleur moyen de supprimer les commits (comme décrit dans la réponse de Greg Hewgill) - notamment parce que le rebase inclut en fait un grand avertissement que vous supprimerez les éléments 4realz.
Noah Sussman
20
cela ne supprime cependant pas les modifications de l'arbre de validation. Le PO a demandé un engagement déjà fait. Si vous reset --hard, et vérifiez le log --oneline --all, les commits restent dans l'arborescence. Comment pouvons-nous supprimer ces commits de l'arbre? Merci.
iGbanam
17
utiliser reset --softpour supprimer le commit local SANS annuler le travail en cours!
704

Si vous n'avez encore poussé le commit nulle part, vous pouvez utiliser git rebase -ipour supprimer ce commit. Tout d'abord, découvrez à quelle distance ce commit est (approximativement). Alors fais:

git rebase -i HEAD~N

Le ~Nmoyen rebase les dernières validations N( Ndoit ê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 aviez supprimé n'existait pas.

Le Git Book 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.

Greg Hewgill
la source
2
Remarque: Si vous avez des fusions --no-ff dans ce dernier lot de validations, rebase les supprime :( Ceci est mentionné sous -p sur cette page . Le problème est que si vous remplacez -i par -p, vous ne recevez plus que pop avec les choix de « modifier ce commit, sqush que l' on », etc , etc. Tout le monde sait la solution?
Bukov
4
Et si vous l'avez poussé? (juste moi en utilisant le repo à distance)
Costa
6
@Costa vous pouvez utiliser push -fpour forcer la poussée et remplacer la branche distante par votre branche locale. Si c'est juste votre propre dépôt à distance, pas de problème. Le problème commence si quelqu'un d'autre est allé chercher entre-temps.
Greg Hewgill
3
J'ai ajouté et validé un fichier de données trop volumineux pour GitHub (ouais, il ne devrait probablement pas être dans le référentiel source de toute façon; eh bien). Quand j'ai essayé de pousser, GitHub a refusé à cause du fichier trop volumineux. Tout ce que je voulais faire était d'annuler ce seul commit, tout en enregistrant quelques autres commits non liés qui ont suivi. La git rebase -i HEAD~5commande était exactement ce dont j'avais besoin pour supprimer complètement ce commit de mon dépôt local! Merci!
aldo
4
@dumbledad: Avec rebase -i, les modifications correspondant au commit supprimé ne sont pas conservées.
Greg Hewgill
517

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

git rebase -i <commit>~1

Cela démarrera le rebase en mode interactif -iau point juste avant le commit que vous souhaitez supprimer. L'éditeur commencera à répertorier 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, supprimant uniquement ce commit et rejouant tous les autres dans le journal.

1800 INFORMATION
la source
3
thx, btw si vous rencontrez des problèmes (comme des git rebase --continue
validations
8
Encore plus facile: git rebase -i HEAD~1
mmell
2
Wowzers. git rebase -i HEAD~1vraiment nettoyé le repo beaucoup! Il est difficile de dire exactement ce qu'il a fait, mais le tout semble beaucoup plus net. Un peu alarmant, en fait.
Charles Wood
7
Je pense qu'il vaut la peine de noter que le commit n'est pas effacé, simplement supprimé de la liste. Si vous vous trompez, vous pouvez récupérer le commit en utilisant le reflog .
Zaz
6
La suppression de la ligne équivaut-elle à d / drop?
Leo
345

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

Si vous souhaitez conserver votre travail et simplement «annuler» cette commande de validation (vous avez intercepté avant de pousser pour repo):

git reset --soft HEAD~1

N'utilisez pas le drapeau --hard sauf si vous souhaitez détruire votre travail en cours depuis le dernier commit.

Rob
la source
5
Voici un exemple de pourquoi: vous effectuez un petit travail sur un serveur de développement que vous validez. Il s'avère ensuite que ce serveur n'a pas d'accès HTTPS sortant, vous ne pouvez donc pas pousser le commit n'importe où. Le plus simple est de prétendre que cela ne s'est jamais produit et de refaire le patch depuis votre machine locale.
Steve Bennett
1
@KarthikBose, il y aurait toujours le reflog. même après que git reset --hard HEAD~1votre dernier commit précédent serait disponible via reflog (jusqu'à ce que vous l'expiriez); voir aussi ici: gitready.com/intermediate/2009/02/09/…
codeling
4
Merci. Cette réponse doit être classée plus haut ou incluse dans la réponse acceptée. Suppression d'un commit! = Annulation d'un commit.
Alsciende
2
@RandolphCarter: vous perdrez néanmoins toutes les modifications non validées.
naught101
7
@Rob, par exemple, lorsque vous validez accidentellement un fichier contenant un secret (par exemple un mot de passe) qui ne devrait jamais être sous contrôle de code source. La validation locale doit être détruite , pas seulement annulée, de sorte qu'elle ne sera jamais envoyée au serveur.
Bob Meyers
143

Supprimer un commit entier

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#change_deep

raittes
la source
26
comment puis-je voter plus cette réponse ??? les autres solutions montrent simplement comment le faire de manière interactive ou pour supprimer les commits supérieurs.
ribamar
5
-p, --preserve-merges Recréez les validations de fusion au lieu d'aplatir l'historique en rejouant les validations introduites par la validation de fusion. Les résolutions de conflits de fusion ou les modifications manuelles des validations de fusion ne sont pas conservées.
raittes le
5
Ceci est la réponse exacte réelle
Hamman Samuel
9
Il dit "remplacez SHA par la référence dont vous voulez vous débarrasser" mais la ligne contient SHA deux fois. Voici ce que j'ai fait. git rebase -p --onto 5ca8832c120 ^ 5ca8832c120 Mais rien n'a changé. Suis-je censé utiliser le même SHA deux fois? Sinon, quel est le SHA pour que le commit soit supprimé et quel est l'autre SHA supposé être?
Rubicksman
3
WOW, cela a fonctionné parfaitement! Cela devrait être la réponse acceptée!
Liran H
51

Si vous n'avez pas publié de modifications, pour supprimer le dernier commit, vous pouvez le faire

$ git reset --hard HEAD^

(notez que cela supprimerait également toutes les modifications non validées; à utiliser avec précaution).

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

$ git revert HEAD
Jakub Narębski
la source
Ça n'a pas marché. Quand je git log, tout est toujours là, peu importe pourquoi je le fais ajoute juste plus de commits. Je veux nettoyer l'histoire.
Costa
@Costa: Qu'est-ce qui n'a pas fonctionné (c'est-à-dire quelle version avez-vous utilisée) et comment avez-vous git log?
Jakub Narębski
J'ai presque tout essayé sur ce Q&R. (J'ai essayé git revert HEAD, plus récemment) Mon journal git:tree = log --all --graph --format=format:'%C(bold blue)%h%C(reset) %C(dim black)%s%C(reset)%C(bold red)%d%C(reset) %C(green)by %an, %ar%C(reset)'
Costa
1
Je veux juste supprimer les commits (comme s'ils n'avaient jamais existé). Je suis parti dans une aventure de codage étrange, avec plusieurs nouveaux commits, et tout cela a fini par être une poubelle. Comment puis-je simplement effacer ceux de mon journal git?
Costa
2
Merde, quelque chose a fait comme par magie exactement ce que je voulais .... laquelle de ces commandes l'a fait? !!?!
Costa
45

Disons que nous voulons supprimer les commits 2 et 4 du dépôt.

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

Remarque: vous devez disposer des droits d'administrateur sur le référentiel puisque vous utilisez --hardet -f.

  • git checkout b3d92c5 Extraire le dernier commit utilisable.
  • git checkout -b repair Créez une nouvelle branche sur laquelle travailler.
  • git cherry-pick 77b9b82 Exécutez la validation 3.
  • git cherry-pick 2c6a45b Exécutez la validation 1.
  • git checkout master Maître de caisse.
  • git reset --hard b3d92c5 Réinitialiser le maître à la dernière validation utilisable.
  • git merge repair Fusionnez notre nouvelle branche sur master.
  • git push -f origin master Poussez le maître vers le référentiel distant.
tk_
la source
1
la dernière étape devrait être git push -f origin masteril n'y a pas d'option--hard
Vivex
2
Je suppose que commit 0c'est plus vieux que commit 1. S'il vous plaît, pourriez-vous me dire pourquoi commencer par commit 3(à la cueillette) puis par commit 1? Après le paiement de b3d92cd( commit 0), je m'attendrais à une sélection de cerises commit 1, alors commit 3. Merci.
Jarek C
@JarekC Je pense que le commit le plus haut est le plus récent commit ici, sauf si je vois quelque chose de mal ...
Jeff Huijsmans
41
git reset --hard commitId

git push <origin> <branch> --force

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

sun34
la source
git push --force <origin> <branchName>. car sans mentionner le nom de la branche, cela pourrait changer tous les fichiers sur la télécommande.
sheelpriy
39

Changer avec force l'historique

En supposant que vous ne vouliez pas simplement supprimer le dernier commit, mais que vous vouliez 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~5si vous voulez voir les cinq derniers commits.

Ensuite, dans l'éditeur de texte, remplacez le mot par pickà dropcôté de chaque validation que vous souhaitez supprimer. Enregistrez et quittez l'éditeur. Voila!

Historique des modifications additives

Essayez git revert <commit hash>. Revert créera un nouveau commit qui annule le commit spécifié.

IliasT
la source
drople mot clé n'est pas défini. Pour supprimer un commit, supprimez simplement la ligne entière.
Shayan Salehian
1
Pour moi, drop était défini comme un mot-clé, mais faire un drop ne semblait pas supprimer le commit de l'historique. Cependant, la suppression de la ligne du rebase interactif l'a fait.
Adam Parkin
C'est exactement ce dont j'avais besoin. Fonctionne très bien; Merci!
diekunstderfuge
30

Si vous souhaitez corriger votre dernier commit, vous pouvez annuler le commit et décompresser 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 organisé les fichiers. Vos modifications seront dans votre répertoire de travail. HEAD ~ 1 fait référence à la validation sous la pointe actuelle de la branche.

Si vous souhaitez annuler la validation de N, mais conservez les modifications de code dans votre répertoire de travail:

git reset HEAD~N

Si vous souhaitez vous débarrasser de votre dernier commit et ne souhaitez pas conserver les modifications de code, vous pouvez effectuer une réinitialisation "matérielle".

git reset --hard HEAD~1

De même, si vous souhaitez supprimer les N derniers validations et ne souhaitez pas conserver les modifications de code:

git reset --hard HEAD~N
Anurag-Sharma
la source
22
git rebase -i HEAD~2

Ici, «2» est le nombre de validations que vous souhaitez 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éorganisées; ils sont exécutés de haut en bas. Si vous supprimez une ligne ici, cet engagement sera perdu. Cependant, si vous supprimez tout, le rebase sera abandonné. Notez que les validations vides sont commentées

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

Siva Praveen
la source
Dans la dernière version de git, il n'y a plus d'option d . Il vous suffit de supprimer les lignes contenant des validations de rebase pour les supprimer.
Oleg Abrazhaev
17

Pour supprimer dans la branche locale, utilisez

git reset --hard HEAD~1

Pour supprimer dans une branche distante, utilisez

git push origin HEAD --force
l'étoile
la source
12

[Réponse rapide]

Vous avez de nombreuses alternatives, par exemple:

  • Alternative 1:

    git rebase -i <YourCommitId>~1
    

    Modifiez YourCommitId pour le numéro de la validation à laquelle vous souhaitez revenir.

  • Alternative 2:

    git reset --hard YourCommitId
    git push <origin> <branch> --force
    

    Modifiez YourCommitId pour le numéro de la validation à laquelle vous souhaitez revenir.

    Je ne recommande pas cette option car vous pouvez perdre votre travail en cours.

  • Variante 3:

    git reset --soft HEAD~1
    

    Vous pouvez conserver votre travail et annuler uniquement le commit.

Javier C.
la source
merci merci merci merci (Y)
Habib Rehman
11

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

Supprimer le dernier commit

Par exemple votre dernier commit

git push origin + aa61ab32 ^: maître

Maintenant, vous voulez supprimer ce commit, puis un moyen simple de le faire ci-dessous

Pas

  1. Remettez d'abord la branche au parent du commit actuel

  2. Forcez-le à la télécommande.

git reset HEAD^ --hard

git push origin -f

Pour un commit particulier, vous souhaitez réinitialiser ce qui suit

git reset bb676878^ --hard

git push origin -f
Sagar Jethi
la source
9

Voici une autre façon de procéder:

Extrayez la branche que vous souhaitez rétablir, puis réinitialisez votre copie de travail locale sur le commit que vous souhaitez être la dernière sur le serveur distant (tout ce qui se passera ensuite 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

Comme vous venez de vérifier votre branche à distance, vous n'aurez aucun changement local à craindre de 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 toutes les validations après celle en cours dans votre référentiel local, mais uniquement pour cette branche.

CommaToast
la source
9

L'erreur:

J'ai git rebase -i --rootédité ma branche, pensant par ignorance que je pouvais reformuler le premier commit différant du master (la vue par défaut de GitHub pour Windows est la comparaison avec master, cachant son intégralité).

J'ai fait pousser une barbe dans la Silicon Valley pendant que 900+ commits se chargeaient dans Sublime. Sortant sans changement, j'ai chargé ma batterie, puis j'ai procédé au rasage, car tous les 900+ engagements individuels ont été rebasés de manière nonchalante - réinitialisant leurs temps de validation jusqu'à maintenant.

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

Maintenant, il avait rajouté un dernier commit inutile à master que je souhaitais supprimer, alors j'ai 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 HEADn'a rien fait, après avoir vérifié le reflog, le dernier et le seul HEADétait le clone - Git gagne.

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

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

Revenir au maître, le temps d'essayer git rebase -i <SHA>, puis supprimer la ligne ... en vain, triste à dire. " Si vous supprimez une ligne ici CE COMMIT SERA PERDU ". Ah ... passé sous silence la nouvelle fonctionnalité troll le n00b dans les notes de version 2.8.3 .

La solution:

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

Pour vérifier, j'ai vérifié dans une autre branche, et le tour est joué - pas de cachette de validation pour récupérer / tirer du maître.

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

Bonne journée.

Leo
la source
8

Toutes les commandes ci-dessus restaurent l'état de votre arborescence de travail et de votre index tels qu'ils étaient avant de valider, mais ne restaurent pas l'état du référentiel. Si vous le regardez, le commit "supprimé" n'est pas réellement supprimé, ce n'est tout simplement pas celui à l'extrémité de la branche actuelle.

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

Angelo Borsotti
la source
1
L'ordre dans lequel les réponses sont affichées sur StackOverflow n'est pas fixe. Veuillez ne pas vous référer à «Toutes les commandes ci-dessus». Faites votre propre réponse de manière autonome.
Pascal Cuoq
Cette réponse n'est pas entièrement correcte. git prune est en fait l'une des commandes "porcelaine" . En outre, il est rare que vous souhaitiez effacer complètement votre reflog (un cas d'utilisation consiste à supprimer les informations sensibles de votre référentiel, mais comme je l'ai dit, c'est un cas d'utilisation rare). Le plus souvent, vous souhaiterez conserver les anciens commits dans le reflog, au cas où vous auriez besoin de récupérer des données. Voir Pro Git: 9.7 Git Internals - Maintenance and Data Recovery .
8

Si vous souhaitez conserver l'historique, montrer le commit et le retour, vous devez utiliser:

git revert GIT_COMMIT_HASH

entrez le message expliquant pourquoi revenez-vous, puis:

git push  

Lorsque vous émettez, git logvous verrez à la fois les messages de validation et de restauration «incorrects».

Paulo Fidalgo
la source
Oui, mais le PO était clair que ce n'était pas ce qu'il voulait.
Steve Bennett
7

Si vous venez de gâcher votre dernier commit (mauvais message, oublié d'ajouter quelques modifications) et que vous souhaitez le corriger avant de le pousser vers un dépôt public, pourquoi ne pas utiliser:

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

Si vous avez des changements récemment mis en scène, ils seront combinés avec le dernier commit (dont vous essayez de vous débarrasser) et remplacera 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 l'option '--no-edit' au lieu de '-m' si vous préférez utiliser le message du commit précédent.

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

Pwnrar
la source
2
Ce n'est pas ce que demande OP.
Steve Bennett
5

Si vous avez déjà poussé, recherchez d'abord le commit que vous voulez être dans HEAD ($ 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 dépôt a été cloné, exécutez:

git reset --hard origin/master
Justin
la source
5

Ce que je fais habituellement lorsque je valide et pousse (si quelqu'un a poussé sa validation, cela résout le problème):

git reset --hard HEAD~1

git push -f origin

j'espère que cette aide

Chris Sim
la source
5

J'ai déjà poussé. Besoin de renvoyer certaines validations à distance. J'ai essayé de nombreuses variantes, mais seule celle de Justin via git bush fonctionne bien pour moi:

git reset --hard $GIT_COMMIT_HASH_HERE
git push origin HEAD --force
Serg Burlaka
la source
4

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
Ashish Singh
la source
3

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

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

Si vous souhaitez conserver vos modifications et supprimer les validations récentes

git reset --soft HEAD^
git pull
Lava Sangeetham
la source
2

supprimer la validation locale

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

Pour cela, je peux utiliser (toutes les commandes ci-dessous fonctionnent uniquement en local. Vous devez pousser après la suppression):

  1. git reset --hard 515b5220c50e3dfbb1063f23789d92ae1d3481a2// il vous sauvegarde sur ce commit (l'ID SHA1 du commit de changement de test 4 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 suppression:

après la suppression du commit

ankit
la source
2

git reset --hard HEAD~1
Vous serez maintenant à la tête précédente. Tirez sur la branche. Poussez le nouveau code. Le commit sera supprimé de git

Jyotirmoy Upadhaya
la source
Sauf si vous avez déjà poussé les modifications. Dans ce cas, la réinitialisation matérielle ne nettoiera pas votre télécommande. Dans ce cas, rebaser est la bonne option
c0der512
1

git reset --hard

git push origin HEAD --force

Si un ou plusieurs des validations sont balisés, supprimez d'abord les balises. Sinon, le commit balisé n'est pas supprimé.

BillChan
la source
0

utilisez git revert https://git-scm.com/docs/git-revert . Il rétablira tout le code puis vous pourrez faire le prochain commit. Ensuite, head indiquera ce dernier commit. les validations annulées ne sont jamais supprimées mais cela n'affectera pas votre dernière validation.

Uttam Rahane
la source
0

Dans mon cas, mon code magique à cet effet est celui-ci:

git reset --hard @{u}

Testez-le et dites-moi. J'en ai essayé plusieurs, mais celui-ci est le seul qui m'a aidé.

Mauro Bilotti
la source