web-dev-qa-db-fra.com

Git tirer dans la mauvaise branche

Moi-même et un autre développeur fusionnions et poussions notre travail dans une branche non maîtresse 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 flux de travail 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 généralement très bien jusqu'à ce que j'aie accidentellement émis ces commandes git

git checkout toolwork
git pull Origin master

À ce stade, un tas de nouveaux éléments sont apparus dans les outils des branches et je ne sais pas comment m'en débarrasser sans supprimer mon espace de travail et le clonage à nouveau du référentiel.

Existe-t-il un moyen de revenir sur cet état avant le pull?

60
milkplus
git reset --hard ORIG_HEAD 

À partir de la page de manuel git reset (si vous venez de tirer):

Annuler une fusion ou un pull

$ 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 pour le moment, alors vous décidez de le faire plus tard.
  2. "pull" n'a pas effectué la fusion, alors "git reset --hard", qui est un synonyme de "git reset --hard HEAD", supprime le désordre du fichier d'index et de l'arborescence de travail.
  3. Fusionner une branche de sujet dans la branche actuelle, ce qui entraîne 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" conserve toujours la pointe d'origine de la branche actuelle dans ORIG_HEAD. Réinitialiser le fichier en conséquence ramène votre fichier d'index et l'arborescence de travail dans cet état et réinitialise l'extrémité de la branche à cet état commettre.

Voir HEAD ET ORIG_HEAD pour plus d'informations.

89
VonC

Réinitialiser la branche principale:

git reset --hard Origin/master
61
Homero Barbosa

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

Sauvegardez tout d'abord! Et relisez la page de manuel de git reset pour vous assurer que vous répondez à vos attentes.

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

9
Cameron Skinner

J'ai récemment fait la même chose et utilisé une solution plus simple basée sur cette réponse .

En supposant que l'état de la branche toolwork à laquelle vous voulez 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é écrasée par une autre fusion sur une autre branche. Je n'avais donc pas à me soucier de la recherche du bon commit dans le journal.

4
zelanix

Ce qui a fonctionné pour moi est tout simplement

git reset --hard

Je l'ai fait à partir du référentiel local avec la fusion/pull malheureux:

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)
$
0
ssaltman