Comment puis-je supprimer les commits git non compressés?

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:

  • reset réinitialisera votre twig à un commit différent (–hard vérifie également le commit précédent, –soft conserve les fichiers ajoutés dans l’index (qui seraient validés si vous vous engagez à nouveau) et le paramètre par défaut (–mixed) ne sera pas activé. vérifiez le commit précédent (effaçant vos modifications locales) mais cela effacera l’index (rien n’a encore été ajouté pour le commit)
  • vous pouvez simplement forcer une twig à pointer vers un autre commit
  • vous pouvez le faire tout en vérifiant immédiatement que vous vous engagez aussi
  • rebasage des travaux sur les commits présents dans votre agence actuelle
  • cherry-picking signifie copier à partir d’une twig différente

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.