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 ?

2706voto

dbyrne Points 18604

Supprimez le commit le plus récent, en gardant le travail que vous avez fait :

git reset --soft HEAD~1

Supprime le commit le plus récent, la destruction de l'œuvre que vous avez fait :

git reset --hard HEAD~1

26 votes

S'assurer que HEAD pointe vers la branche (vérifier d'abord)

193 votes

Et assurez-vous que HEAD~1 est le commit... Vous pouvez aussi faire git reset --hard origin

17 votes

Pensée git remote liste l'origine pour moi, git reset --hard origin dit fatal: ambiguous argument 'origin': unknown revision or path not in the working tree. . Pourquoi ?

458voto

Ashkan Sirous Points 2637

Je me demande pourquoi la meilleure réponse que j'ai trouvée se trouve uniquement dans les commentaires ! ( par Daenyth avec 86 votes up )

git reset --hard origin

Cette commande synchronisera le dépôt local avec le dépôt distant en se débarrassant de toutes les modifications que vous avez faites sur votre dépôt local. Vous pouvez également faire ce qui suit pour récupérer la branche exacte que vous avez dans l'origine comme Cleary l'a suggéré dans les commentaires.

git reset --hard origin/<branch>

66voto

VonC Points 414372

Ne le supprimez pas : pour un seul engagement git cherry-pick est suffisant.

Mais si vous aviez plusieurs commits sur la mauvaise branche, c'est là que les 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 master et le déplacer là 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

pour remettre la branche y 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 (les réappliquer, en faisant réellement de nouveaux commits).

 git rebase --onto tmp y master
 git branch -D tmp

 x--x--x--x--m'--m' <-- master
           \
            -y--y <- y branch

2 votes

Malheureusement, ce n'était pas la question.

5 votes

@KatariaA C'est une alternative valable à la suppression du commit effectué sur la mauvaise branche et cela aidera les autres dans la même situation (bon commit effectué sur la mauvaise branche).

22voto

Hank Gay Points 36173

Faites un git rebase -i FAR_ENOUGH_BACK et laissez tomber la ligne pour l'engagement que vous ne voulez pas.

1 votes

Si vous finissez par supprimer tous les commits, vous pouvez ajouter "noop" comme action, ou rebase ne prend aucune action. C'est la version que je préfère, car ce que vous changez est très clair.

8voto

Alexander Groß Points 4217

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

git rev-parse HEAD

Ensuite, changez la branche actuelle

git checkout other-branch

Et cherry-pick l'engagement de other-branch

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

0 votes

D'après mon expérience, cela n'annule pas le commit de la branche d'origine, ce qui rend nécessaire l'utilisation de la fonction git reset --hard HEAD~1 après. Je pense qu'utiliser reset --soft alors changer de branche et valider à nouveau aurait évité un travail supplémentaire. De nouveau, j'utilisais SourceTree pour faire la plupart de mes tâches de base, et je n'ai utilisé la ligne de commande qu'après mon erreur.

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