4397 votes

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 ferai un push dans le futur, 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 dois utiliser est git reset --hard HEAD . Est-ce correct ?

75 votes

Je pense que c'est pas un duplicata de Git annuler le dernier commit car il demande comment supprimer tout à partir d'une branche. Je pense aussi qu'aucune des réponses ne répond réellement à cette question. Elles rembobinent toutes les derniers commits, pas les cherry-pick y delete une seule livraison qui peut avoir eu lieu il y a un certain temps.

25 votes

@Chris, la réponse avec git rebase -i HEAD~10 répond à la question, car il vous permet de choisir arbitrairement les commits à supprimer. Git applique les commits dans la plage que vous spécifiez un par un, en ignorant les commits que vous avez supprimés 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 repo tout en conservant le premier. Je suis d'accord qu'aucune des autres réponses n'est satisfaisante.

0 votes

@MST oui, j'aurais dû dire qu'aucune des options de la réponse acceptée ne répond à cette question, mais vous avez absolument raison - cette commande semble fonctionner.

5587voto

gahooa Points 38006

Attention : git reset --hard SUPPRIMERA LES CHANGEMENTS DE VOTRE RÉPERTOIRE DE TRAVAIL . Veillez à cachez tous les changements locaux que vous voulez conserver avant d'exécuter cette commande.

En supposant que vous êtes assis sur ce commit, alors cette commande le supprimera...

git reset --hard HEAD~1

El HEAD~1 signifie l'engagement avant la tête.

Ou, vous pouvez regarder la sortie de git log Trouvez l'identifiant du commit que vous voulez sauvegarder, et faites ceci :

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

Si vous l'avez déjà poussé, vous devrez faire un forçage pour vous en débarrasser...

git push origin HEAD --force

Cependant si d'autres l'ont retiré, alors vous feriez mieux de commencer une nouvelle branche. Parce que lorsqu'ils tirent, cela va juste fusionner avec leur travail, et vous allez le pousser vers le haut à 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 changements. Cependant, les deux commits seront dans le journal.


POUR INFO git reset --hard HEAD est idéal si vous voulez vous débarrasser des TRAVAUX EN COURS. Il vous ramènera au commit le plus récent, 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 typiquement présent dans git reflog sauf si vous avez fait un garbage collector de votre dépôt.

76 votes

HEAD~1 ou simplement HEAD^ . Si vous poussez, vous devez utiliser git revert à la place.

18 votes

Évidemment, vous pouvez aussi utiliser HEAD~n pour "revenir en arrière" n commet de votre tête. Peut-être qu'à partir de ce point, vous pouvez interpréter ... --hard HEAD également en tant que HEAD~0 => suppression des travaux en cours.

0 votes

@beamrider9 C'est ce que --hard signifie.

933voto

Greg Hewgill Points 356191

Si vous n'avez pas encore poussé le commit quelque part, vous pouvez utiliser git rebase -i pour supprimer cet engagement. D'abord, trouvez à combien de temps remonte ce commit (approximativement). Puis faites-le :

git rebase -i HEAD~N

El ~N signifie rebaser le dernier N commits ( 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 réécrira alors tous les commits suivants comme si celui que vous avez supprimé n'existait pas.

Le Git Book a un bon section sur le rebasement avec des photos et des exemples.

Faites attention cependant, car si vous changez quelque chose que vous ont poussé ailleurs, une autre approche sera nécessaire, à moins que vous ne prévoyiez de faire un forcing.

2 votes

Note : Si vous avez des fusions --no-ff dans le dernier lot de commits, rebase va les massacrer :( Ceci est mentionné sous -p sur cette page . Le problème est que si vous remplacez -i par -p, vous n'obtenez plus ce pop up avec les choix "edit this commit, sqush that one", etc etc. Quelqu'un connaît-il la solution ?

0 votes

Est-ce que c'est mieux que la réponse "reset hard" car cela ne supprimera pas les fichiers, mais seulement le message de validation erroné ? Parce qu'il semble avoir supprimé mes fichiers. Si la suppression du fichier est censée se produire, veuillez l'ajouter comme un avertissement clair !

4 votes

Et si vous l'avez poussé ? (je n'utilise que le dépôt distant)

735voto

1800 INFORMATION Points 55907

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

git rebase -i <commit>~1

Ceci lancera le rebasement en mode interactif -i au point juste avant le commit que vous voulez frapper. L'éditeur va démarrer en listant tous les commits depuis ce moment. Supprimez la ligne contenant le commit que vous voulez effacer et enregistrez le fichier. Rebase fera le reste du travail, supprimant seulement ce commit, et rejouant tous les autres dans le journal.

5 votes

Thx, btw si vous rencontrez des problèmes (comme des commits vides) vous pouvez utiliser git rebase --continue

19 votes

Encore plus facile : git rebase -i HEAD~1

4 votes

Wowzers. git rebase -i HEAD~1 a vraiment nettoyé le repo en profondeur ! C'est difficile de dire exactement ce qu'il a fait, mais l'ensemble a l'air beaucoup plus ordonné. Un peu inquiétant, en fait.

488voto

Rob Points 1464

Je joins cette réponse parce que je ne vois pas pourquoi quelqu'un qui vient d'essayer de livrer un travail voudrait supprimer tout ce travail à cause d'une erreur d'utilisation de Git !

Si vous voulez garder votre travail et juste 'annuler' cette commande commit (que vous avez prise avant de pousser vers le repo) :

git reset --soft HEAD~1

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

9 votes

Voici un exemple : vous effectuez un petit travail sur un serveur de développement que vous validez. Puis il s'avère que ce serveur n'a pas d'accès HTTPS sortant, donc vous ne pouvez pas pousser le commit n'importe où. Le plus simple est de faire comme si rien ne s'était passé, et de refaire le patch depuis votre machine locale.

2 votes

@KarthikBose il y aura toujours le reflog, même après git reset --hard HEAD~1 votre dernier commit précédent sera disponible via reflog (jusqu'à ce que vous l'expiriez) ; voir aussi ici : gitready.com/intermediate/2009/02/09/

1 votes

Peut-être que j'utilise mal git, mais il y a une situation dans laquelle j'aimerais que le fichier --hard pour les cas où j'ai plusieurs branches distantes et que j'ai poussé dans la mauvaise branche. Disons que j'ai une master et une staging Je travaille sur une branche locale, mais je fusionne et pousse accidentellement dans master, et je réalise alors que j'ai fait la mauvaise chose. Je voudrais alors restaurer le HEAD de master au deuxième commit le plus récent. y Je veux supprimer toute trace de ce push défectueux de master, car ce n'est pas supposée être en maître

61voto

Jakub Narębski Points 87537

Si vous n'avez pas publié de modifications, pour supprimer le dernier commit, vous pouvez effectuer les opérations suivantes

$ 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é le commit à supprimer, utilisez git revert

$ git revert HEAD

0 votes

Cela n'a pas fonctionné. Quand je fais un git log, tout est toujours là, peu importe ce que je fais, ça ajoute juste plus de commits. Je veux nettoyer l'historique.

0 votes

@Costa : Qu'est-ce qui n'a pas fonctionné (c'est-à-dire quelle version avez-vous utilisée), et comment avez-vous fait le git log ?

0 votes

J'ai essayé presque tout ce qu'il y a dans ces questions-réponses. (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)'

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X