2010-10-22 42 views
53

Moi-même et un autre développeur avaient fusionné et poussé notre travail à une branche non-maître appelée toolwork. De cette façon, nous n'avons pas eu d'impact sur le reste de l'équipe. Ma branche de sujet s'appelait DPM-93 et ​​mon workflow git était celui-ci.Git tire dans la mauvaise branche

# 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 

qui fonctionnait bien jusqu'à ce que la plupart du temps j'ai publié par mégarde ces commandes git

git checkout toolwork 
git pull origin master 

À ce moment-là, un tas de choses nouvelles dans la branche a montré toolwork et je ne suis pas sûr de savoir comment se débarrasser de lui à court de supprimer mon espace de travail et de re-clonage du repo.

Y at-il un moyen de sauvegarder cela à l'état avant la traction?

Répondre

85
git reset --hard ORIG_HEAD 

De l'git reset man page (si vous venez de faire la traction):

annuler une fusion ou tirer

$ 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. Essayez de mettre à jour de l'amont a donné lieu à un grand nombre de conflits; vous n'étiez pas prêt à passer beaucoup de temps à fusionner maintenant, alors vous décidez de le faire plus tard.
  2. "pull" n'a pas effectué la validation, ainsi "git reset --hard" qui est un synonyme de "git reset --hard HEAD" efface le désordre du fichier d'index et de l'arborescence de travail.
  3. Fusionner une branche de rubrique dans la branche en cours, ce qui a entraîné une avance rapide.
  4. Mais vous avez décidé que la branche de rubrique n'est pas encore prête pour la consommation publique. "Tirer" ou "fusionner" laisse toujours la pointe originale de la branche actuelle dans ORIG_HEAD , donc la réinitialisation rend votre fichier index et l'arbre de travail dans cet état, et réinitialise la pointe de la branche à cette commettre.

Voir HEAD and ORIG_HEAD pour plus.

+0

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

+0

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

+0

Merci, @VonC. Désolé pour la question idiote. D'une certaine façon, je n'ai pas réalisé que 'git reset --hard' modifie non seulement l'arbre de travail et l'index, mais aussi le pointeur parent dans le DAG. – unutbu

9

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

Tout sauvegarder en premier! Et relisez la page man pour git reset pour vous assurer qu'il fait ce que vous voulez.

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

+0

Je ne vous voyais pas répondre au début. 'git reset' est juste (même si c'est un peu dangereux comme vous le dites légitimement). +1 – VonC

+0

Préférez cette réponse, car vous êtes plus explicite sur le commit auquel vous voulez revenir. Dans mon cas, c'était utile car j'avais quelques commits locaux avant d'avoir accidentellement tiré la mauvaise branche, donc je ne voulais pas faire une réinitialisation complète à ORIG_HEAD. –

49

Réinitialiser la branche principale:

git reset --hard origin/master 
+6

Je ne sais pas si cela est dû à la réponse "correcte" étant 2 ans, mais après avoir essayé les autres suggestions sans succès, c'est ce qui a fonctionné pour moi. –

+3

C'était la seule réponse qui a fonctionné pour moi. – lashleigh

+3

cela a résolu le problème que j'avais, qui est que j'avais tiré dans la mauvaise branche – HorseloverFat

3

J'ai fait une chose similaire récemment et utilisé une solution plus simple basée sur this answer.

En supposant que l'état de la branche toolwork que vous souhaitez revenir à a été poussé-origin, vous pouvez simplement faire

git fetch origin 
git reset --hard origin/toolwork 

Dans mon cas, la valeur de ORIG_HEAD avait été remplacé par un autre fusionner sur une branche différente, et ce faisant, je n'ai pas eu à m'inquiéter de rechercher la validation correcte dans le journal.