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?
git
git-rebase
git-reset
hap497
la source
la source
cherry-pick
etdelete
un seul commit qui a eu lieu il y a quelque temps.git rebase -i HEAD~10
ré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.Réponses:
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 ...
Le
HEAD~1
signifie 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:Si vous l'avez déjà poussé, vous devrez faire une poussée de force pour vous en débarrasser ...
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 HEAD
est 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 reflog
moins que vous n'ayez récupéré votre mémoire.la source
HEAD~1
ou tout simplementHEAD^
. Si vous avez poussé, vous devriez utiliser à lagit revert
place.HEAD~n
pour "revenir en arrière" lesn
commits de votre tête. Peut-être... --hard HEAD
qu'à partir de ce point, vous pouvez également interpréter commeHEAD~0
=> la suppression du travail en cours.reset --hard
, et vérifiez lelog --oneline --all
, les commits restent dans l'arborescence. Comment pouvons-nous supprimer ces commits de l'arbre? Merci.reset --soft
pour supprimer le commit local SANS annuler le travail en cours!Si vous n'avez encore poussé le commit nulle part, vous pouvez utiliser
git rebase -i
pour supprimer ce commit. Tout d'abord, découvrez à quelle distance ce commit est (approximativement). Alors fais:Le
~N
moyen rebase les dernières validationsN
(N
doit être un nombre, par exempleHEAD~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.
la source
push -f
pour 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.git rebase -i HEAD~5
commande était exactement ce dont j'avais besoin pour supprimer complètement ce commit de mon dépôt local! Merci!rebase -i
, les modifications correspondant au commit supprimé ne sont pas conservées.Une autre possibilité est l'une de mes commandes préférées personnelles:
Cela démarrera le rebase en mode interactif
-i
au 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.la source
git rebase --continue
git rebase -i HEAD~1
git rebase -i HEAD~1
vraiment 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.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):
N'utilisez pas le drapeau --hard sauf si vous souhaitez détruire votre travail en cours depuis le dernier commit.
la source
git reset --hard HEAD~1
votre dernier commit précédent serait disponible via reflog (jusqu'à ce que vous l'expiriez); voir aussi ici: gitready.com/intermediate/2009/02/09/…Supprimer un commit entier
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
la source
-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.Si vous n'avez pas publié de modifications, pour supprimer le dernier commit, vous pouvez le faire
(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
la source
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)'
Disons que nous voulons supprimer les commits 2 et 4 du dépôt.
Remarque: vous devez disposer des droits d'administrateur sur le référentiel puisque vous utilisez
--hard
et-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.la source
git push -f origin master
il n'y a pas d'option--hard
commit 0
c'est plus vieux quecommit 1
. S'il vous plaît, pourriez-vous me dire pourquoi commencer parcommit 3
(à la cueillette) puis parcommit 1
? Après le paiement deb3d92cd
(commit 0
), je m'attendrais à une sélection de cerisescommit 1
, alorscommit 3
. Merci.PS: CommitId fait référence à celui auquel vous souhaitez revenir
la source
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>
, doncgit rebase -i HEAD~5
si vous voulez voir les cinq derniers commits.Ensuite, dans l'éditeur de texte, remplacez le mot par
pick
àdrop
cô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é.la source
drop
le mot clé n'est pas défini. Pour supprimer un commit, supprimez simplement la ligne entière.Si vous souhaitez corriger votre dernier commit, vous pouvez annuler le commit et décompresser les fichiers qu'il contient, en faisant:
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:
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".
De même, si vous souhaitez supprimer les N derniers validations et ne souhaitez pas conserver les modifications de code:
la source
Ici, «2» est le nombre de validations que vous souhaitez rebaser.
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.
la source
Pour supprimer dans la branche locale, utilisez
Pour supprimer dans une branche distante, utilisez
la source
[Réponse rapide]
Vous avez de nombreuses alternatives, par exemple:
Alternative 1:
Alternative 2:
Variante 3:
la source
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
Remettez d'abord la branche au parent du commit actuel
Forcez-le à la télécommande.
Pour un commit particulier, vous souhaitez réinitialiser ce qui suit
la source
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:
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:
Cela effacera toutes les validations après celle en cours dans votre référentiel local, mais uniquement pour cette branche.
la source
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 HEAD
n'a rien fait, après avoir vérifié lereflog
, le dernier et le seulHEAD
é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>
alorsd, 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.
la source
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
.la source
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 .Si vous souhaitez conserver l'historique, montrer le commit et le retour, vous devez utiliser:
entrez le message expliquant pourquoi revenez-vous, puis:
Lorsque vous émettez,
git log
vous verrez à la fois les messages de validation et de restauration «incorrects».la source
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:
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
la source
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:
Ensuite, à chaque endroit où le dépôt a été cloné, exécutez:
la source
Ce que je fais habituellement lorsque je valide et pousse (si quelqu'un a poussé sa validation, cela résout le problème):
j'espère que cette aide
la source
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:
la source
Réinitialiser sur la branche locale
Forcer la poussée vers l'origine
la source
Prenez la sauvegarde de votre code dans le dossier temporaire. La commande suivante réinitialisera la même chose que le serveur.
Si vous souhaitez conserver vos modifications et supprimer les validations récentes
la source
Référence: comment supprimer un commit dans git, local et remote
la source
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
gitk
commande dans git bash)).Pour cela, je peux utiliser (toutes les commandes ci-dessous fonctionnent uniquement en local. Vous devez pousser après la suppression):
git reset --hard 515b5220c50e3dfbb1063f23789d92ae1d3481a2
// il vous sauvegarde sur ce commit (l'ID SHA1 du commit de changement de test 4 est 515b5220c50e3dfbb1063f23789d92ae1d3481a2 )git reset --hard HEAD~1
// il vous sauvegarde avant un commit.git reset --hard HEAD^
// Pour supprimer le dernier commit de gitaprès suppression:
la source
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
la source
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é.
la source
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.
la source
Dans mon cas, mon code magique à cet effet est celui-ci:
Testez-le et dites-moi. J'en ai essayé plusieurs, mais celui-ci est le seul qui m'a aidé.
la source