J’ai accidentellement commis à la mauvaise twig. Comment supprimer ce commit?
Supprimez la dernière validation en conservant le travail que vous avez effectué:
git reset --soft HEAD~1
Supprimez la validation la plus récente, détruisant le travail que vous avez effectué:
git reset --hard HEAD~1
Ne le supprimez pas: pour un seul commit, git cherry-pick
suffit.
Mais si vous aviez plusieurs commits sur la mauvaise twig, c’est là que git rebase --onto
brille:
Supposons que vous ayez ceci:
x--x--x--x <-- master \ -y--y--m--m <- y branch, with commits which should have been on master
, alors vous pouvez marquer le master
et le déplacer où vous voudriez être:
git checkout master git branch tmp git checkout y git branch -f master x--x--x--x <-- tmp \ -y--y--m--m <- y branch, master branch
, réinitialiser la twig où elle aurait dû être:
git checkout y git reset --hard HEAD~2 # ~1 in your case, # or ~n, n = number of commits to cancel x--x--x--x <-- tmp \ -y--y--m--m <- master branch ^ | -- y branch
, et enfin déplacer vos commits (réappliquez-les, en faisant de nouveaux commits)
git rebase --onto tmp y master git branch -D tmp x--x--x--x--m'--m' <-- master \ -y--y <- y branch
Faites un git rebase -i FAR_ENOUGH_BACK
et déposez la ligne pour le commit que vous ne voulez pas.
Si vous souhaitez déplacer cette validation vers une autre twig, obtenez le SHA du commit en question
git rev-parse HEAD
Puis changez la twig actuelle
git checkout other-branch
Et cherry-pick
le commit dans une other-branch
git cherry-pick
Pour votre information, je pense que vous pouvez “couper” de votre twig actuelle non seulement avec git reset –hard, mais aussi avec la commande suivante:
git checkout -B
En fait, si vous ne vous souciez pas de vérifier, vous pouvez définir la twig comme vous voulez avec:
git branch -f
Ce serait un moyen programmatique de supprimer les commits d’une twig, par exemple, pour y copier de nouveaux commits (en utilisant rebase).
Supposons que vous ayez une twig déconnectée de maître car vous avez pris des sources à un autre endroit et les avez transférées dans la twig.
Vous avez maintenant une twig dans laquelle vous avez appliqué les modifications, appelons-le “sujet”.
Vous allez maintenant créer un duplicata de votre twig de sujet, puis le rebaser sur le vidage du code source qui se trouve dans la twig “dump”:
git branch topic_duplicate topic git rebase --onto dump master topic_duplicate
Maintenant, vos modifications sont réappliquées dans la twig topic_duplicate en fonction du sharepoint départ de “dump”, mais uniquement des commits survenus depuis “master”. Vos modifications depuis Master sont donc réappliquées au dessus de “dump” mais le résultat se retrouve dans “topic_duplicate”.
Vous pouvez alors remplacer “dump” par “topic_duplicate” en procédant comme suit:
git branch -f dump topic_duplicate git branch -D topic_duplicate
Ou avec
git branch -M topic_duplicate dump
Ou simplement en jetant le vidage
git branch -D dump
Peut-être que vous pourriez aussi choisir juste après avoir effacé le “topic_duplicate” actuel.
Ce que j’essaie de dire, c’est que si vous voulez mettre à jour la twig “duplicate” actuelle basée sur un ancêtre différent, vous devez d’abord supprimer les commits précédemment “cherrypicked” en effectuant un git reset --hard
git branch -f topic_duplicate
git reset --hard
ou git branch -f topic_duplicate
et copie ensuite les autres commits (de la twig principale du sujet) en les rebasant ou en les sélectionnant.
Le remappage ne fonctionne que sur une twig qui a déjà les commits, vous devez donc dupliquer votre twig de sujet à chaque fois que vous voulez le faire.
La cueillette des cerises est beaucoup plus facile:
git cherry-pick master..topic
Donc, toute la séquence se résumera à:
git reset --hard git cherry-pick master..topic
Lorsque votre twig sujet-dupliqué a été extraite. Cela supprimerait les commits précédemment sélectionnés dans le duplicata actuel, et réappliquerait simplement toutes les modifications qui se produisent dans “topic” au-dessus de votre “dump” actuel (ancêtre différent). Cela semble être un moyen raisonnablement pratique de baser votre développement sur le “vrai” maître en amont tout en utilisant un autre maître “en aval” pour vérifier si vos modifications locales s’appliquent également à cela. Sinon, vous pouvez simplement générer un diff, puis l’appliquer en dehors de toute arborescence de sources Git. Mais de cette façon, vous pouvez conserver une version modifiée (corrigée) à jour, basée sur la version de votre dissortingbution, alors que votre développement réel est contre le véritable maître en amont.
Donc, juste pour démontrer:
J’espère que cela aide quelqu’un. Je voulais réécrire ceci, mais je ne peux pas gérer maintenant. Cordialement.
Si vous avez une sauvegarde de votre code (y .git
dossier .git
), supprimez le dossier .git de votre dernier code. Copiez l’ancien dossier .git
vers la dernière base de code. Exécutez git pull
.
Remarque: Veuillez utiliser cette solution uniquement si vous manquez de temps et que vous êtes très confus.