1405 votes

Comment supprimer les commits git non poussés ?

Je me suis accidentellement engagé dans la mauvaise branche. Comment puis-je supprimer ce commit ?

8voto

Atul Sureka Points 690

La commande suivante a fonctionné pour moi, toutes les modifications commises localement sont abandonnées et la branche locale est réinitialisée au même niveau que la branche origin/master distante.

git reset --hard origin

3voto

Xennex81 Points 359

Pour votre référence, je crois que vous pouvez "couper en dur" les commits de votre branche actuelle non seulement avec git reset --hard, mais aussi avec la commande suivante :

git checkout -B <branch-name> <SHA>

En fait, si vous n'avez pas l'intention de passer à la caisse, vous pouvez définir la branche comme vous le souhaitez :

git branch -f <branch-name> <SHA>

Ce serait un moyen programmatique de supprimer des commits d'une branche, par exemple, afin d'y copier de nouveaux commits (en utilisant rebase).

Supposons que vous avez une branche qui est déconnectée de master parce que vous avez pris des sources d'un autre endroit et les avez déversées dans la branche.

Vous avez maintenant une branche dans laquelle vous avez appliqué des changements, appelons-la "sujet".

Vous allez maintenant créer une copie de votre branche topic et la rebaser sur le dump du code source qui se trouve dans la branche "dump" :

git branch topic_duplicate topic
git rebase --onto dump master topic_duplicate

Maintenant, vos changements sont réappliqués dans la branche topic_duplicate basée sur le point de départ de "dump" mais seulement les commits qui ont eu lieu depuis "master". Ainsi, vos modifications depuis master sont maintenant réappliquées par-dessus "dump" mais le résultat se retrouve dans "topic_duplicate".

Vous pourriez alors remplacer "dump" par "topic_duplicate" en faisant :

git branch -f dump topic_duplicate
git branch -D topic_duplicate

Ou avec

git branch -M topic_duplicate dump

Ou simplement en jetant la décharge

git branch -D dump

Peut-être pourriez-vous également faire un choix sélectif après avoir effacé le "topic_duplicate" actuel.

Ce que j'essaie de dire, c'est que si vous voulez mettre à jour la branche "dupliquée" actuelle sur la base d'un ancêtre différent, vous devez d'abord supprimer les commits "cherrypicked" précédents en faisant un git reset --hard <last-commit-to-retain> o git branch -f topic_duplicate <last-commit-to-retain> et ensuite copier les autres commits (de la branche principale du sujet) soit par rebasement soit par cherry-picking.

Le rebasage ne fonctionne que sur une branche qui a déjà les commits, donc vous devez dupliquer votre branche topic chaque fois que vous voulez le faire.

Le tri sélectif est beaucoup plus facile :

git cherry-pick master..topic

Donc la séquence entière se résumera à :

git reset --hard <latest-commit-to-keep>
git cherry-pick master..topic

Lorsque votre branche de duplication de sujet a été retirée. Cela supprimerait les commits précédemment cueillis du duplicata actuel, et réappliquerait simplement tous les changements se produisant dans "topic" sur le dessus de votre "dump" actuel (ancêtre différent). Cela semble être un moyen raisonnablement pratique de baser votre développement sur le "vrai" master amont tout en utilisant un master "aval" différent pour vérifier si vos changements locaux s'appliquent également à celui-ci. Alternativement, vous pourriez simplement générer un diff et l'appliquer en dehors de tout arbre source Git. Mais de cette façon, vous pouvez conserver une version modifiée (corrigée) à jour basée sur la version de votre distribution, tandis que votre développement réel est basé sur le véritable master amont.

Donc, juste pour démontrer :

  • reset fera pointer votre branche vers un commit différent (--hard vérifie aussi le commit précédent, --soft garde les fichiers ajoutés dans l'index (qui seraient livrés si vous livrez à nouveau) et le défaut (--mixed) ne vérifiera pas le commit précédent (effaçant vos changements locaux) mais il effacera l'index (rien n'a encore été ajouté pour être livré).
  • vous pouvez simplement forcer une branche à pointer vers un commit différent
  • vous pouvez le faire tout en vérifiant immédiatement ce commit également
  • le rebasage fonctionne sur les commits présents dans votre branche actuelle
  • le "cherry-picking" signifie copier à partir d'une branche différente

J'espère que cela aidera quelqu'un. J'avais l'intention de le réécrire, mais je n'y arrive pas maintenant. Salutations.

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