web-dev-qa-db-fra.com

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 lorsque je ferai un Push dans le futur, mes modifications ne seront pas Push vers la branche distante.

Je lis git help, et je pense que la commande que je devrais utiliser est git reset --hard HEAD. Est-ce correct?

2755
hap497

Attention: git reset --hardSUPPRIMERA VOS MODIFICATIONS DU REPERTOIRE DE TRAVAIL. Assurez-vous de cacher toutes les modifications locales que vous souhaitez conserver avant d'exécuter cette commande.

En supposant que vous soyez assis sur ce commit, alors cette commande le fera sauter ...

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 du commit que vous souhaitez sauvegarder, puis procédez comme suit:

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

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

git Push Origin HEAD --force

Cependant , si d'autres l'ont fait, vous feriez mieux de créer une nouvelle branche. Parce que quand ils tireront, ça le fusionnera dans leur travail, et vous le ferez remonter à 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. Cependant, les deux commits seront dans le journal.


Pour votre information, git reset --hard HEAD est idéal si vous souhaitez vous débarrasser de WORK IN PROGRESS. Cela vous ramènera au commit le plus récent et effacera toutes les modifications de votre arbre et index de travail.


Enfin, si vous avez besoin de trouver un commit que vous avez "supprimé", il est généralement présent dans git reflog à moins que vous n'ayez collecté des ordures dans votre référentiel.

3542
gahooa

Si vous n'avez encore poussé la validation nulle part, vous pouvez utiliser git rebase -i pour supprimer cette validation. Tout d’abord, déterminez la distance (approximative) de ce commit. Alors fais:

git rebase -i HEAD~N

Le ~N signifie que le dernier changement de N a été modifié (N doit être un nombre, par exemple HEAD~10). Ensuite, vous pouvez éditer le fichier que Git vous présente pour supprimer le commit en question. Lors de la sauvegarde de ce fichier, Git réécrira tous les commits suivants comme si celui que vous aviez supprimé n'existait pas.

Le Git Book a un bon { section sur le rebasement } 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 à moins que vous ne envisagiez de pousser de force.

634
Greg Hewgill

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

git rebase -i <commit>~1

Ceci démarrera la base en mode interactif -i juste avant le commit que vous voulez frapper. L'éditeur va commencer à 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 relisant tous les autres dans le journal.

444
1800 INFORMATION

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

Si vous souhaitez conserver votre travail et annuler simplement cette commande de commit (vous vous êtes fait prendre avant d'appuyer sur repo):

git reset --soft HEAD~1

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

305
Rob

Supprimer un commit entier

git rebase -p --onto SHA^ SHA

Évidemment, remplacez "SHA" par la référence dont vous souhaitez vous débarrasser. Le "^" dans cette commande est littéral.

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

65
raittes

Si vous n'avez pas publié les 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; utilisez-le avec précaution).

Si vous avez déjà publié une validation à supprimer, utilisez git revert

$ git revert HEAD
48
Jakub Narębski
git reset --hard commitId

git Push <Origin> <branch> --force

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

33
sun34

Si vous souhaitez corriger votre dernier commit, vous pouvez annuler le commit et décomposer les fichiers qu'il contient en procédant comme suit:

git reset HEAD~1

Cela ramènera votre référentiel à son état avant que git ajoute les commandes qui ont stocké 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 souhaitez dégager des commits N, tout en conservant 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 ignorer les N derniers commits et ne pas conserver les modifications de code:

git reset --hard HEAD~N
27
Anurag-Sharma

Supposons que nous voulions supprimer les commits 2 et 4 du référentiel. 

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

Remarque: Vous devez disposer de droits d’administrateur sur le référentiel puisque vous utilisez --hard et -f.

  • git checkout b3d92c5 Commander le dernier commit utilisable.
  • git checkout -b repair Créez une nouvelle branche sur laquelle travailler.
  • git cherry-pick 77b9b82 exécuter à travers commit 3.
  • git cherry-pick 2c6a45b exécuter la validation 1.
  • git checkout master Master Checkout.
  • git reset --hard b3d92c5 Réinitialiser le maître sur le dernier commit utilisable.
  • git merge repair Fusionner notre nouvelle branche sur le maître.
  • git Push -f Origin master Poussez maître dans le dépôt distant.
26
tk_

Changer avec force l'histoire

En supposant que vous ne vouliez pas seulement 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~5 si vous voulez voir les cinq derniers commits.

Ensuite, dans l'éditeur de texte, remplacez Word pick par drop à côté de chaque commit que vous souhaitez supprimer. Enregistrez et quittez l'éditeur. Voila!

Additively Change History

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

25
IliasT

Pour supprimer dans une branche locale, utilisez

git reset --hard HEAD~1

Pour supprimer dans une branche distante, utilisez 

git Push Origin HEAD --force
12
thestar

Voici une autre façon de faire ceci:

Vérifiez la branche que vous souhaitez rétablir, puis réinitialisez votre copie de travail locale sur le commit que vous souhaitez utiliser comme dernier en date sur le serveur distant (tout ce qui suivra sera répété). Pour ce faire, dans SourceTree, j'ai cliqué avec le bouton droit de la souris sur et sélectionné "Réinitialiser BRANCHNAME à ce commit". Je pense que la ligne de commande est la suivante:

git reset --hard COMMIT_ID

Comme vous venez de vérifier votre branche à distance, vous ne risquez pas de perdre des modifications locales. 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 postérieures à celle en cours dans votre référentiel local mais uniquement pour cette branche.

7
CommaToast

L'erreur:

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

J'ai développé une barbe de la Silicon Valley alors que 900+ commits se sont chargés eux-mêmes dans Sublime. En sortant sans changement, j'ai rechargé ma batterie, puis je me suis rasé, les 900 personnes et plus commettant ayant été renvoyées nonchalamment - réinitialisant ainsi leurs temps de validation jusqu'à maintenant.

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

Maintenant, il avait rajouté un dernier engagement inutile à maîtriser que je souhaitais supprimer, donc procédé comme tel.

Épuiser les options:

Je ne souhaitais 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é la reflog, la dernière et unique 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 - victoire mineure.

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

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

La solution:

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

Pour vérifier, j'ai vérifié dans une autre branche, et le tour est joué - aucun secret ne se commet de chercher/extraire du maître.

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

Bonne journée.

7
Leo

Toutes les commandes ci-dessus restaurent l'état de votre arbre de travail et de votre index tels qu'ils étaient avant la validation, mais ne restaurent pas l'état du référentiel. Si vous le regardez, le commit "supprimé" n'est pas réellement supprimé, il ne s'agit tout simplement pas de celui qui se trouve au sommet de la branche actuelle.

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

6
Angelo Borsotti

Si vous venez de gâcher votre dernier commit (message erroné, oublié d'ajouter quelques modifications) et que vous voulez le réparer avant de le placer dans un dépôt public, pourquoi ne pas utiliser:

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

Si vous avez récemment mis en place des modifications, elles seront combinées avec le dernier commit (que vous essayez de supprimer) et remplaceront ce commit.

Bien sûr, si vous modifiez un commit après l'avoir poussé, vous êtes en train de réécrire l'historique. Si vous le faites, veillez à en comprendre les implications.

Vous pouvez également passer l'option '--no-edit' à la place de '-m' si vous préférez utiliser le message du commit précédent.

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

5
Pwnrar

Si vous souhaitez conserver l’historique, en affichant le commit et le revert, vous devez utiliser:

git revert GIT_COMMIT_HASH

entrez le message expliquant pourquoi vous revenez en arrière, puis:

git Push  

Lorsque vous émettez git log, vous verrez à la fois le "mauvais" commit et le message de journal de reprise.

5
Paulo Fidalgo

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 facile de le faire après

Pas 

  1. D'abord réinitialiser la branche sur le parent du commit en cours 

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

git reset HEAD^ --hard

git Push Origin -f

Pour un commit particulier, vous souhaitez réinitialiser comme suit

git reset bb676878^ --hard

git Push Origin -f
4
sagar jethi

Si vous avez déjà insisté, commencez par trouver le commit que vous souhaitez utiliser 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 repo a été cloné, exécutez:

git reset --hard Origin/master
3
Justin

Ce que je fais habituellement quand je commets et Push (si quelqu'un le pousse, cela résout le problème)

git reset --hard HEAD~1

git Push -f Origin

espérons que cette aide

3
Chris Sim

Réinitialiser sur une branche locale 

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

Force Push to Origin

git Push -f Origin
2
Ashish Singh
// display git commit log    
$ git log --pretty=oneline --abbrev-commit

// show last two commit and open in your default editor
// then delete second commit line and save it
$ git rebase -i HEAD~2

Référence: Comment supprimer un commit en git, local et distant

1
Shajid

J'ai déjà poussé. Besoin de restituer certains commits à distance ... J'ai essayé de nombreuses variantes, Mais seulement this from Justin via git bush fonctionne bien pour moi:

git reset --hard $GIT_COMMIT_HASH_HERE
git Push Origin HEAD --force
0
Serg Burlaka

Faites une sauvegarde de votre code dans le dossier temporaire. La commande suivante sera réinitialisée de la même manière 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
Lava Sangeetham

git reset --hard 

git Push Origin HEAD --force

Si un ou plusieurs commits sont étiquetés, supprimez-les d'abord. Sinon, la validation étiquetée n'est pas supprimée.

0
BillChan

 delete local commit

Comme vous pouvez le voir sur l'image ci-dessus, je souhaite supprimer la validation "test change 2" commit (ID SHA1: 015b5220c50e3dfbb1063f23789d92ae1d3481a2 (vous pouvez obtenir un ID SHA1 à l'aide de la commande gitk dans git bash)).

Pour cela, je peux utiliser (toute la commande ci-dessous ne fonctionne que sur le local. Vous devez appuyer après la suppression):

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

 after delete commit

0
ankit