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?
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)
- 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.
- "
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.- Fusionner une branche de sujet dans la branche actuelle, ce qui entraîne une avance rapide.
- 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 dansORIG_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.
Réinitialiser la branche principale:
git reset --hard Origin/master
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.
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.
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)
$