Supprimer s'engage à partir d'une branche 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 une poussée dans le futur, mes changements ne pousseront pas à 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
la source

27 ответов

attention: git reset --hard supprimera les modifications de votre répertoire de travail . Assurez-vous que stocke tous les changements locaux que vous voulez garder avant d'exécuter cette commande.

en supposant que vous êtes assis sur ce commit, alors cette commande va le faire foirer...

git reset --hard HEAD~1

le HEAD~1 désigne la propagation avant tête.

ou, vous pouvez regarder sortie de git log , trouvez l'id de propagation de la propagation que vous voulez sauvegarder, et ensuite faites ceci:

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

si vous l'avez déjà poussé, vous aurez besoin de faire une poussée de force pour vous en débarrasser...

git push origin HEAD --force

Toutefois , si d'autres ont tiré, alors vous serait mieux de commencer une nouvelle branche. Parce que quand ils tirent, il suffit de le fusionner dans leur travail, et vous l'aurez poussé à nouveau de retour.

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


pour info -- git reset --hard HEAD est l'endroit idéal si vous voulez vous débarrasser de votre TRAVAIL EN cours. Il vous réinitialisera vers la propagation la plus récente, et effacera toutes les modifications de votre arborescence et de votre index.


enfin, si vous avez besoin de trouver une propagation que vous avez "effacée", elle est typiquement présente dans git reflog à moins que vous n'ayez récupéré vos déchets dans votre dépôt.

3388
répondu gahooa 2016-02-02 10:58:31
la source

si vous n'avez pas encore poussé le commit n'importe où, vous pouvez utiliser git rebase -i pour supprimer ce commit. Tout d'abord, découvrez jusqu'à quel point ce commit est (approximativement). Puis faire:

git rebase -i HEAD~N

Le ~N signifie "rebase" le dernier N s'engage ( N doit être un nombre, par exemple HEAD~10 ). Ensuite, vous pouvez éditer le fichier que Git vous présente pour supprimer le commit incriminé. En sauvegardant ce fichier, Git va alors réécrivez toutes les propagations suivantes comme si celle que vous avez effacée n'existait pas.

Le Git Livre a un bon "1519130920 la section" rebasage avec des images et des exemples.

soyez prudent avec ceci cependant, parce que si vous changez quelque chose que vous avez poussé ailleurs, une autre approche sera nécessaire à moins que vous planifiez de faire une poussée de force.

617
répondu Greg Hewgill 2016-10-21 03:51:07
la source

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

git rebase -i <commit>~1

cela lancera le rebase en mode interactif -i au point juste avant la propagation que vous voulez frapper. L'éditeur va commencer à lister toutes les commits depuis lors. Supprimez la ligne contenant la propagation que vous voulez effacer et sauvegardez le fichier. Rebase va faire le reste du travail, en supprimant seulement ce commit, et en rejouant tous les autres dans le journal.

420
répondu 1800 INFORMATION 2009-08-27 07:49:27
la source

je joins cette réponse parce que je ne vois pas pourquoi quelqu'un qui vient d'essayer de s'engager dans le travail voudrait supprimer tout ce travail à cause d'une erreur en utilisant Git!

si vous voulez garder votre travail et juste 'annuler' la commande de propagation (vous avez attrapé avant de pousser à la restitution):

git reset --soft HEAD~1

n'utilisez pas le --hard à moins que vous ne vouliez détruire votre travail en cours depuis la dernière commit.

287
répondu Rob 2012-10-15 22:17:58
la source

suppression d'un engagement entier

git rebase -p --onto SHA^ SHA

bien sûr, remplacez " 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 22:36:46
la source

si vous n'avez pas publié les modifications, pour supprimer la dernière propagation, vous pouvez faire

$ git reset --hard HEAD^

(notez que cela supprimerait également tous les changements non engagés; utiliser avec soin).

si vous avez déjà publié la commande à supprimer, utilisez git revert

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

git push <origin> <branch> --force

PS: CommitId se réfère à celui que vous voulez revenir à

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

si vous voulez corriger votre dernière propagation, vous pouvez défaire la propagation, et dégrafer les fichiers qu'elle contient, en faisant:

git reset HEAD~1

cela ramènera votre dépôt à son état avant que le git Ajoute les commandes qui ont mis en scène les fichiers. Vos modifications seront dans votre répertoire de travail. HEAD~1 se réfère à la propagation sous la pointe actuelle de la branche.

si vous voulez désactiver les propagations, mais gardez les changements 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 voulez pas garder les changements de code, vous pouvez faire une réinitialisation" dure".

git reset --hard HEAD~1

de même, si vous voulez rejeter le dernier n commits, et ne voulez pas garder les changements de code:

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

Changer L'Histoire Avec Force

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

git rebase -i HEAD~<number of commits to go back> , donc git rebase -i HEAD~5 si vous voulez voir les cinq dernières propagations.

puis dans l'éditeur de texte, changez le mot pick en drop à côté de chaque propagation que vous souhaitez supprimer. Enregistrez et quittez l'éditeur. Voila!

Additivement Changer L'Histoire

Essayer git revert <commit hash> . Revert va créer un nouveau commit qui annule le commit spécifié.

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

disons que nous voulons supprimer les commits 2 & 4 de la pension.

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 check-out the last usable commit.
  • git checkout -b repair créer une nouvelle branche sur laquelle travailler.
  • git cherry-pick 77b9b82 Exécuter par le biais de commettre 3.
  • git cherry-pick 2c6a45b Exécuter par le biais de commettre 1.
  • git checkout master Checkout master.
  • git reset --hard b3d92c5 réinitialiser maître à la dernière commit utilisable.
  • git merge repair fusionnez notre nouvelle branche avec master.
  • git push -f origin master Push maître de la télécommande repo.
19
répondu tk_ 2018-03-19 07:02:24
la source
git rebase -i HEAD~2

ici '2' est le nombre de propagations que vous voulez reformuler.

'git rebase -i HEAD`

si vous voulez reformuler toutes les propagations.

alors 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 que COMMIT sera perdu. Toutefois, si vous supprimez tout, cela sera annulée. Notez que les propagations vides sont commentées

vous pouvez simplement supprimer cette propagation en utilisant l'option" d " ou en supprimant une ligne qui a votre propagation.

15
répondu Siva Praveen 2016-05-19 02:39:53
la source

supprimer dans la branche locale, utiliser

git reset --hard HEAD~1

pour supprimer dans une branche distante, utiliser

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

Voici une autre façon de le faire:

Vérifiez la branche que vous voulez revenir en arrière, puis réinitialisez votre copie de travail locale à la propagation que vous voulez être la dernière sur le serveur distant (tout après cela ira bye-bye). Pour ce faire, dans SourceTree j'ai cliqué à droite sur le bouton et sélectionné "Reset BRANCHNAME to this 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'allez pas d'avoir des changements locaux à craindre de perdre. Mais ça les perdrait si tu le faisais.

naviguez ensuite dans le répertoire local de votre dépôt et lancez cette commande:

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

Ceci effacera toutes les propagations après celle en cours dans votre dépôt local, mais seulement pour cette branche.

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

l'erreur:

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

j'ai fait pousser une barbe Silicon Valley tandis que 900 + commits se sont chargés dans Sublime. Je suis sorti sans changement, j'ai chargé ma batterie puis j'ai commencé à me raser, car tous les 900 + individu commits nonchalamment rebasé-en réinitialisant leur temps d'engagement jusqu'à maintenant.

déterminé à battre Git et préserver les temps originaux, j'ai supprimé ce dépôt local et re-cloné à partir de la télécommande.

maintenant, il avait ré-ajouté un plus récent non-nécessaire commit à Maître je voulais supprimer, donc procédé comme tel.

épuiser les options:

Je ne voulais pas git revert - il créerait un commit supplémentaire, donnant Git la main supérieure.

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

pour obtenir le SHA le plus récent, j'ai vérifié le dépôt à distance 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! l'engagement était de retour-Git gagne.

retour au capitaine, temps de essayez git rebase -i <SHA> , puis retirez la ligne... en vain, c'est triste à dire. " si vous supprimez une ligne ici que COMMIT sera perdu ". Ah...glissé sur la nouvelle caractéristique troll le n00b dans le 2.8.3 notes de mise à jour .

La solution:

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

pour vérifier, je suis allé dans une autre branche, et voilà-pas de secret à partir de le maître.

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

Bonjour à vous.

7
répondu Leo 2016-05-25 23:54:19
la source

toutes les commandes ci-dessus restaurent l'état de votre arbre de travail et de votre index tel qu'il était avant de faire la propagation, mais ne restaurent pas l'état du dépôt. 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 . La seule façon est de le supprimer du journal et de se recharger et ensuite d'exécuter un git prune --expire -now .

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

si vous avez tout simplement foiré votre dernière propagation (mauvais message, oublié d'ajouter quelques modifications) et que vous voulez la corriger avant de la pousser vers un repo public, pourquoi ne pas utiliser:

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

si vous avez de nouveaux changements mis en scène, ils seront combinés 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'histoire donc si vous le faites, assurez-vous de comprendre la implication.

vous pouvez également passer l'option '--no-edit' au lieu de '-m' si vous préférez utiliser le message de propagation précédent.

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

5
répondu Pwnrar 2014-05-27 03:24:22
la source

si vous voulez garder l'historique, montrant le commit et le revert, vous devez utiliser:

git revert GIT_COMMIT_HASH

entrez le message expliquant pourquoi vous revenez en arrière et ensuite:

git push  

quand vous émettez git log vous verrez à la fois les messages "wrong" commit et revert log.

5
répondu Paulo Fidalgo 2015-01-07 18:13:35
la source

ce que je fais habituellement quand je commets et pousse (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 12:22:56
la source

si vous avez déjà poussé, trouvez d'abord la propagation que vous voulez faire à la tête ($GIT_COMMIT_HASH_HERE) , puis lancez ce qui suit:

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

puis chaque endroit où la déclaration a été clonée, exécuter:

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

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

supprimer le dernier commit

par exemple votre dernier commit

git push origin +aa61ab32^: master

maintenant vous voulez supprimer ce commit alors un moyen facile de le faire suivant

Étapes

  1. réinitialiser D'abord la branche au parent du commit actuel

  2. Force-poussez-le à distance.

git reset HEAD^ --hard

git push origin -f

Pour particulier, valider, vous souhaitez réinitialiser est la suite de

git reset bb676878^ --hard

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

Reset sur la branche locale

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

de la Force de pousser à l'origine

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

en supposant que vous n'avez pas poussé vers le dépôt distant, vous pouvez cloner à nouveau le dépôt. Cela a été ma méthode de choix plusieurs fois.

0
répondu zacharydl 2014-12-31 09:54:56
la source

git reset -- hard

git push origin HEAD --force

si une ou plusieurs des propagations sont marquées, supprimer la ou les balises en premier. sinon le commit étiqueté n'est pas supprimé.

0
répondu BillChan 2015-07-24 17:45:51
la source

use git revert https://git-scm.com/docs/git-revert .Il va inverser tout le code puis vous pouvez faire la prochaine propagation.Alors head pointera vers ce dernier engagement. reverted commits ne supprimera jamais mais cela n'affectera pas votre dernière commit.

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

delete local commit

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

Pour que je puisse l'utiliser(tout en dessous de la commande de travail sur local uniquement. vous devez appuyer après Supprimer):

  1. git reset --hard 515b5220c50e3dfbb1063f23789d92ae1d3481a2 //il back-up vous à qui s'engagent (SHA1 ID de test de changement 4 validation 515b5220c50e3dfbb1063f23789d92ae1d3481a2 )
  2. git reset --hard HEAD~1 // il vous avant de s'engager.
  3. git reset --hard HEAD^ // Pour supprimer le dernier commit à partir de git

après Supprimer:

after delete commit

0
répondu ankit 2018-07-03 09:51:42
la source

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

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

si vous voulez conserver vos modifications , et supprimer les propagations récentes

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

Autres questions sur git git-reset git-rebase