685 votes

Comment réparer l'engagement sur la mauvaise branche Git?

Je viens de faire un commit parfaitement bon sur la mauvaise branche. Comment annuler le dernier commit dans ma branche principale et ensuite prendre ces mêmes changements et les intégrer dans ma branche de mise à niveau ?

1078voto

Blair Holloway Points 4043

Si vous n'avez pas encore poussé vos modifications, vous pouvez également effectuer une réinitialisation douce :

git reset --soft HEAD^

Cela annulera le commit, mais remettra les modifications engagées dans votre index. En supposant que les branches sont relativement à jour les unes par rapport aux autres, git vous permettra de faire un checkout dans l'autre branche, après quoi vous pourrez simplement valider :

git checkout branche
git commit -c ORIG_HEAD

La partie -c ORIG_HEAD est utile pour ne pas avoir à retaper le message de validation.

11 votes

Notez que la réinitialisation douce laisse vos modifications en attente et prêtes à être validées. Cela m'a un peu dérouté quand mon IDE n'affichait pas les fichiers revenir à l'état modifié après la réinitialisation douce.

12 votes

Parfait fix, en fait j'ai eu quelques engagements donc j'ai fait HEAD^^ et bam tout est nickel

9 votes

Merci. Cela m'a sauvé deux fois. Si les branches sont quelque peu différentes, après la réinitialisation et avant la validation, vous devrez peut-être mettre en mémoire tampon vos modifications avant de pouvoir valider une autre branche. Réappliquez la mise en mémoire tampon après la validation.

176voto

fotanus Points 6322

4 ans de retard sur le sujet, mais cela pourrait être utile pour quelqu'un.

Si vous avez oublié de créer une nouvelle branche avant de valider et avez tout validé sur master, peu importe le nombre de validations que vous avez faites, l'approche suivante est plus simple :

git stash                       # sauter si tous les changements sont validés
git branch my_feature
git reset --hard origin/master
git checkout my_feature
git stash pop                   # sauter si tous les changements étaient validés

Maintenant, votre branche master est égale à origin/master et toutes les nouvelles validations sont sur la branche my_feature. Notez que my_feature est une branche locale, pas une branche distante.

0 votes

Merci pour la réponse. Maintenant, j'utilise egit et je me demande si je peux accomplir la même chose en faisant ce qui suit : 1) Renommer le 'master' actuel en 'my_feature'. 2) Recréer la branche locale 'master' à partir de 'origin/master'. Je ne suis pas sûr de ce qu'egit fait en interne pour ces opérations, mais cela semble être une solution viable.

1 votes

Pourquoi la fusion ? vous pourriez créer la branche directement sur master, puis réinitialiser master sur origin/master.

0 votes

@caesarsol c'est un bon conseil, cependant je ne suis pas sûr comment voir le nombre de commits? La façon dont je le décris est un algorithme pour le faire, peu importe l'état actuel.

113voto

Michael Mrozek Points 44120

Si vous avez une copie de travail propre (non modifiée)

Pour revenir en arrière d'un commit (assurez-vous de noter le hachage du commit pour l'étape suivante) :

git reset --hard HEAD^

Pour extraire ce commit dans une autre branche :

git checkout autre-branche
git cherry-pick HACHAGE-COMMIT

Si vous avez des modifications ou des changements non suivis

Notez également que git reset --hard va supprimer toutes les modifications non suivies et modifiées que vous pourriez avoir, donc si vous en avez, vous pouvez préférer :

git reset HEAD^
git checkout .

0 votes

git rev-parse NOM_DE_LA_BRANCHE pour obtenir le sha.

12 votes

Si vous oubliez de noter d'abord le hash, utilisez simplement git reflog show !

2 votes

@Jefromi J'ai eu peur là pour une minute.

22voto

Igor Zevaka Points 32586

Si vous avez déjà poussé vos modifications, vous devrez forcer votre prochain push après avoir réinitialisé HEAD.

git reset --hard HEAD^
git merge COMMIT_SHA1
git push --force

Attention: une réinitialisation dure annulera toutes les modifications non validées dans votre copie de travail, tandis qu'un push forcé écrira complètement l'état de la branche distante avec l'état actuel de la branche locale.

Au cas où, sur Windows (en utilisant l'invite de commandes Windows, pas Bash), il faut en fait quatre ^^^^ au lieu d'un, donc c'est

git reset --hard HEAD^^^^

6 votes

Notez que vous ne devez pas effectuer de force-push sur une branche utilisée par d'autres personnes à moins que ce ne soit absolument nécessaire - sinon, elles ne pourront pas pousser leurs modifications jusqu'à ce qu'elles rebasent. Si vous êtes le seul développeur à utiliser Git, cependant, cela est acceptable.

2 votes

Ou à moins que vous ne vous en rendiez compte assez rapidement avant que quelqu'un d'autre n'ait extrait les commits erronés.

0 votes

Si vous êtes à plus d'un commit près, vous pouvez spécifier le commit dont vous avez besoin : git reset --hard COMMIT_HASH git push --force

18voto

Ali Mizan Points 326

J'ai récemment fait la même chose, où j'ai accidentellement commis un changement sur master, alors que j'aurais dû commettre sur other-branch. Mais je n'ai rien poussé.

Si vous venez de commettre sur la mauvaise branche, et que vous n'avez rien changé depuis, et que vous n'avez pas poussé vers le repo, vous pouvez faire ce qui suit :

// revenir en arrière sur master pour pointer vers le commit juste avant votre commit le plus récent.
// cela prend tous les changements de votre commit le plus récent et les transforme en changements non validés. 
git reset HEAD~1 

// sauvegarder temporairement vos changements non validés comme un commit qui n'est pas attaché à une branche en utilisant git stash
// tous les commits temporaires créés avec git stash sont mis dans une pile de commits temporaires.
git stash

// créer other-branch (si l'autre branche n'existe pas déjà)
git branch other-branch

// passer à l'autre branche sur laquelle vous auriez dû commettre.
git checkout other-branch

// prendre le commit temporaire que vous avez créé et appliquer tous ces changements à la nouvelle branche. 
// Cela supprime également le commit temporaire de la pile de commits temporaires.
git stash pop

// ajouter les changements que vous voulez avec git add...

// recommettre vos changements sur other-branch
git commit -m "quelques messages..."

REMARQUE : dans l'exemple ci-dessus, j'ai annulé 1 commit avec git reset HEAD~1. Mais si vous vouliez annuler n commits, vous pouvez faire git reset HEAD~n.

Aussi, si vous avez fini par commettre sur la mauvaise branche et que vous avez également écrit quelques lignes de code avant de réaliser que vous avez commis sur la mauvaise branche, vous pouvez utiliser git stash pour sauvegarder votre travail en cours :

// sauvegarder le travail non prêt à commettre sur lequel vous êtes en train de travailler
git stash 

// annuler n commits
git reset HEAD~n 

// mettre en stash les changements commis comme un seul commit temporaire dans la pile. 
git stash 

// créer other-branch (si elle n'existe pas déjà)
git branch other-branch

// passer à l'autre branche sur laquelle vous auriez dû commettre.
git checkout other-branch

// appliquer tous les changements commis à la nouvelle branche
git stash pop

// ajouter les changements que vous voulez avec git add...

// recommettre vos changements sur la nouvelle branche en un seul commit.
git commit -m "quelques messages..."

// extraire les changements sur lesquels vous travailliez et continuer à coder
git stash pop

REMARQUE : J'ai utilisé ce site web comme référence https://www.clearvision-cm.com/blog/what-to-do-when-you-commit-to-the-wrong-git-branch/

0 votes

Une chose similaire m'est arrivée, j'ai effectué quelques modifications dans la branche principale, mais j'aurais dû le faire dans une nouvelle branche et envoyer une PR. J'ai fini par faire un git checkout -b nouvelle_branche directement à partir de là, les commits étaient intacts, juste poussés, et j'ai créé une PR, je n'ai pas eu à recommiter.

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