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?
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.
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.
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.
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.
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.
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
git reset --hard commitId
git push <origin> <branch> --force
PS: CommitId fait référence à celui auquel vous voulez revenir
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
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é.
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.
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.
Pour supprimer dans la branche locale, utilisez
git reset --hard HEAD~1
Pour supprimer une branche distante, utilisez
git push origin HEAD --force
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.
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.
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
.
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.
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.
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
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
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
-
Réinitialisez D'abord la branche au parent de la validation en cours
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
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
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.
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é.
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.
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):
-
git reset --hard 515b5220c50e3dfbb1063f23789d92ae1d3481a2
/ / il Vous sauvegarde à ce commit (SHA1 ID de Test change 4 commit est 515b5220c50e3dfbb1063f23789d92ae1d3481a2) -
git reset --hard HEAD~1
/ / il Vous sauvegarde avant un commit. -
git reset --hard HEAD^
/ / pour supprimer le dernier commit de git
Après supprimer:
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
J'ai fait référence aux deux liens ci-dessous, ce serait bien.
Http://christoph.ruegg.name/blog/git-howto-revert-a-commit-already-pushed-to-a-remote-reposit.html https://gist.github.com/gunjanpatel/18f9e4d1eb609597c50c2118e416e6a6