Question Comment est-ce que je supprime des commits de git non balayés?


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


593
2017-07-07 17:47


origine


Réponses:


Supprimez le commit le plus récent, en conservant le travail que vous avez effectué:

git reset --soft HEAD~1

Supprimer le commit le plus récent, détruire le travail tu as fait:

git reset --hard HEAD~1

1121
2017-07-07 17:50



Ne le supprimez pas: pour un seul commit git cherry-pick est assez.

Mais si vous aviez nombreuses s'engage sur la mauvaise branche, c'est là git rebase --onto brille:

Supposons que vous avez ceci:

 x--x--x--x <-- master
           \
            -y--y--m--m <- y branch, with commits which should have been on master

, alors vous pouvez marquer master et déplacez-le où vous voulez ê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 y branche où il 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éplacez 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

46
2017-07-07 17:58



Fait une git rebase -i FAR_ENOUGH_BACK et déposez la ligne pour le commit que vous ne voulez pas.


10
2017-07-07 17:55



Si vous voulez déplacer ce commit vers une autre branche, obtenez le SHA du commit en question

git rev-parse HEAD

Ensuite, changez la branche actuelle

git checkout other-branch

Et cherry-pick l'engagement à other-branch

git cherry-pick <sha-of-the-commit>

6
2017-07-07 17:55



Pour votre référence, je crois que vous pouvez "hard cut" commet hors 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 ne vous souciez pas de vérifier, vous pouvez définir la branche à ce que vous voulez avec:

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

Ce serait une manière programmatique de supprimer des commits d'une branche, par exemple, afin de lui copier de nouveaux commits (en utilisant rebase).

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

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

Vous allez maintenant créer un doublon de votre branche de sujet et ensuite le rebaser sur le vidage de code source qui est assis dans la branche "dump":

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

Maintenant, vos modifications sont réappliquées dans la branche topic_duplicate en fonction du point de départ de "dump" mais uniquement des validations qui se sont produites depuis "master". Donc vos changements depuis master sont maintenant réappliqués sur "dump" mais le résultat se termine par "topic_duplicate".

Vous pouvez ensuite 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 juste en rejetant la décharge

git branch -D dump

Peut-être que vous pourriez aussi juste choisir après avoir effacé l'actuel "topic_duplicate".

Ce que j'essaie de dire, c'est que si vous voulez mettre à jour la branche "duplicate" actuelle basée sur un ancêtre différent, vous devez d'abord supprimer les commits précédemment "cherrypicked" en faisant un git reset --hard <last-commit-to-retain> ou git branch -f topic_duplicate <last-commit-to-retain> puis en copiant l'autre (depuis la branche du sujet principal) en effectuant un rebasement ou en sélectionnant les cerises.

Le rebasing ne fonctionne que sur une branche qui a déjà les validations, donc vous devez dupliquer votre branche de sujet chaque fois que vous voulez faire cela.

Cherrypicking est beaucoup plus facile:

git cherry-pick master..topic

Donc, la séquence entière descendra à:

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

Lorsque votre branche en double a été extraite. Cela supprimerait les commits précédemment sélectionnés dans le doublon actuel, et réappliquerait simplement tous les changements qui se produisent dans "topic" par dessus votre "dump" actuel (ancêtre différent). Il semble que ce soit une manière raisonnablement pratique de baser votre développement sur le maître «réel» en amont tout en utilisant un autre maître «en aval» pour vérifier si vos modifications locales s'appliquent également à cela. Alternativement, vous pouvez simplement générer un diff et ensuite l'appliquer en dehors de toute arborescence source Git. Mais de cette façon, vous pouvez conserver une version modifiée (corrigée) à jour qui est basée sur la version de votre distribution alors que votre développement réel est contre le vrai maître en amont.

Alors juste pour démontrer:

  • reset rendra votre branche pointant vers un commit différent (--hard vérifie également la validation précédente, --soft conserve les fichiers ajoutés dans l'index (qui seront validés si vous validez à nouveau) et la valeur par défaut (--mixed) ne sera pas vérifier le commit précédent (effacer vos changements locaux) mais il effacera l'index (rien n'a encore été ajouté pour le commit)
  • vous pouvez simplement forcer une branche à pointer vers un autre commit
  • vous pouvez le faire tout en vérifiant immédiatement ce commit ainsi
  • rebasing fonctionne sur les commits présents dans votre branche actuelle
  • cerise-picking moyens de copier à partir d'une branche différente

J'espère que cela aide quelqu'un. Je voulais réécrire cela, mais je ne peux pas gérer maintenant. Cordialement.


2
2017-07-28 16:02



Si vous avez une sauvegarde de votre code (y compris .git dossier), supprimez le dossier .git de votre dernière base de code. Copier vieux .git dossier à la dernière base de code. Exécuter git pull.

Remarque: Veuillez utiliser cette solution uniquement si vous manquez de temps et que vous êtes très confus.


0
2018-06-07 12:25