79 votes

Pull Git dans une mauvaise branche

Moi-même et un autre développeur avions fusionné et poussé notre travail vers une branche non-master appelée toolwork. De cette façon, nous n'avions pas d'impact sur le reste de l'équipe. Ma branche topic s'appelait DPM-93 et mon workflow git était le suivant.

# do some work
git checkout DPM-93
git commit -m "did some work"

# catch up
git checkout toolwork
git pull origin toolwork

# rebase my topic branch
git checkout DPM-93
git rebase toolwork

# merge and push my changes
git checkout toolwork
git merge --no-ff DPM-93
git push origin toolwork

Cela fonctionnait bien jusqu'à ce que je lance accidentellement les commandes git suivantes

git checkout toolwork
git pull origin master

À ce moment-là, un tas de nouvelles choses sont apparues dans les outils de la branche et je ne sais pas comment m'en débarrasser, à moins de supprimer mon espace de travail et de refaire un clonage à partir du dépôt.

Y a-t-il un moyen de revenir à l'état initial avant le retrait ?

111voto

VonC Points 414372
git reset --hard ORIG_HEAD 

De la git reset page de manuel (si vous venez de faire la traction) :

Annuler une fusion ou un tirage

$ git pull                         (1)
Auto-merging nitfol
CONFLICT (content): Merge conflict in nitfol
Automatic merge failed; fix conflicts and then commit the result.
$ git reset --hard                 (2)
$ git pull . topic/branch          (3)
Updating from 41223... to 13134...
Fast-forward
$ git reset --hard ORIG_HEAD       (4)
  1. Essayer de mettre à jour à partir de l'amont a entraîné beaucoup de conflits ; vous n'étiez pas prêt à passer beaucoup de temps à fusionner maintenant, donc vous décidez de le faire plus tard.
  2. " pull "n'a pas fait de commit de fusion, donc " git reset --hard "qui est un synonyme de " git reset --hard HEAD " efface le désordre du fichier d'index et de l'arbre de travail.
  3. Fusionner une branche de sujet dans la branche courante, ce qui a entraîné une avance rapide.
  4. Mais vous avez décidé que la branche thématique n'est pas encore prête pour la consommation publique.
    "pull" ou "merge" laisse toujours l'extrémité originale de la branche courante en ORIG_HEAD Ainsi, la réinitialisation de la branche à ce commit ramène votre fichier d'index et l'arbre de travail à cet état, et réinitialise l'extrémité de la branche à ce commit.

Véase HEAD y ORIG_HEAD pour plus.

0 votes

Serait-il possible d'utiliser git rebase -i ORIG_HEAD pour supprimer les commits non désirés, en supposant que personne n'a encore tiré de master ?

0 votes

@unutbu : Je crois que le résultat final d'un tel rebasement serait similaire à une git reset dans ce cas.

0 votes

Merci, @VonC. Désolé pour la question stupide. Je n'avais pas réalisé que git reset --hard modifie non seulement l'arbre de travail et l'index mais supprime également le pointeur parent dans le DAG.

89voto

Homero Barbosa Points 886

Réinitialiser la branche principale :

git reset --hard origin/master

11 votes

Je ne sais pas si cela est dû au fait que la "bonne" réponse date d'il y a deux ans, mais après avoir essayé les autres suggestions sans succès, voici ce qui a fonctionné pour moi.

5 votes

Cela a résolu le problème que j'avais, à savoir que j'étais entré dans la mauvaise branche.

2 votes

Ça a marché pour moi. Je vous remercie.

10voto

Cameron Skinner Points 19987

Vous pouvez utiliser git log pour trouver le SHA-1 de la révision que vous voulez avoir en tête de votre toolwork puis utiliser git reset --hard <SHA1> pour rétablir votre copie de travail à cette révision.

Sauvegardez tout d'abord ! Et relisez la page de manuel de git reset pour s'assurer qu'il fait ce que vous voulez.

EDIT : Oh oui, ORIG_HEAD devrait contenir le bon SHA-1. Mais vérifiez d'abord.

0 votes

Je n'ai pas vu votre réponse au début. git reset a raison (même si c'est un peu dangereux comme vous le mentionnez à juste titre). +1

0 votes

Préférez cette réponse, puisque vous êtes plus explicite sur le commit vers lequel vous voulez revenir. Dans mon cas, c'était utile car j'avais quelques commits locaux avant de tirer accidentellement la mauvaise branche, donc je ne voulais pas faire un hard reset à ORIG_HEAD.

7voto

zelanix Points 372

J'ai fait une chose similaire récemment, et j'ai utilisé une solution plus simple basée sur les éléments suivants cette réponse .

En supposant que l'état de la toolwork la branche sur laquelle vous voulez revenir a été poussé a origin vous pouvez simplement faire

git fetch origin
git reset --hard origin/toolwork

Dans mon cas, la valeur de ORIG_HEAD avait été écrasé par une autre fusion sur une branche différente, et en faisant cela je n'avais pas à me soucier de rechercher le bon commit dans le journal.

2voto

ssaltman Points 789

Ce qui a fonctionné pour moi est simplement

git reset --hard

J'ai fait cela à partir du dépôt local avec le malheureux merge/pull :

Laptop@LAPTOP-xxxxxxxx /d/Google Drive/xxxxxxx/Github/xxxxx (staging_ec2|MERGING)
$ git reset --hard
HEAD is now at 2d5a511 [last commit comment]

Laptop@LAPTOP-xxxxxxxx /d/Google Drive/xxxxxxx/Github/xxxxx (staging_ec2)
$

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