Je me suis accidentellement engagé dans la mauvaise branche. Comment puis-je supprimer ce commit ?
Réponses
Trop de publicités?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.
- Réponses précédentes
- Plus de réponses