Git, Comment réinitialiser origin / master à un commit?

245

Je réinitialise mon maître local à un commit par cette commande:

git reset --hard e3f1e37

lorsque j'entre dans la $ git statuscommande, le terminal dit:

# On branch master
# Your branch is behind 'origin/master' by 7 commits, and can be fast-forwarded.

#   (use "git pull" to update your local branch)
#
nothing to commit, working directory clean

Étant donné que je souhaite également réinitialiser l'origine / l'en-tête, je passe à l'origine / maître:

$ git checkout origin/master
Note: checking out 'origin/master'.

You are in 'detached HEAD' state. You can look around, make experimental
changes and commit them, and you can discard any commits you make in this
state without impacting any branches by performing another checkout.

If you want to create a new branch to retain commits you create, you may
do so (now or later) by using -b with the checkout command again. Example:

  git checkout -b new_branch_name

HEAD is now at 2aef1de... master problem fixed for master. its okay now.

et réinitialiser l'en-tête par cette commande:

$ git reset --hard e3f1e37
HEAD is now at e3f1e37 development version code incremented for new build.

Ensuite, j'ai essayé d'ajouter un commit à l'origine / en-tête qui n'a pas réussi.

$ git commit -m "Reverting to the state of the project at e3f1e37"
# HEAD detached from origin/master
nothing to commit, working directory clean

Enfin, je commande à mon maître local.

$ git checkout master
Switched to branch 'master'
Your branch is behind 'origin/master' by 7 commits, and can be fast-forwarded.
  (use "git pull" to update your local branch)

Depuis, j'ai réinitialisé la tête d'origine / maître, je m'attends à ce que local et origine soient dans la même direction, mais comme vous le voyez, git dit que mon local / maître est derrière origine / maître de 7 commits.

Comment puis-je résoudre ce problème? Ce que je recherche, c'est que le responsable local / master et le point origin / master pointent vers le même commit. L'image suivante montre ce que j'ai fait. Merci.

entrez la description de l'image ici

Hesam
la source
Tout d'abord, assurez-vous que vous êtes autorisé à forcer le code push vers une branche protégée sur votre projet, sinon vous ne pourrez pas ...
DarmVillegas

Réponses:

564

origin/xxxles branches pointent toujours vers une télécommande. Vous ne pouvez pas les extraire car ils ne pointent pas vers votre référentiel local (vous ne récupérez que la validation. C'est pourquoi vous ne verrez pas le nom écrit dans le marqueur de branche de l'interface de ligne de commande, uniquement le hachage de validation).

Ce que vous devez faire pour mettre à jour la télécommande est de forcer le push de vos modifications locales vers le master:

git checkout master
git reset --hard e3f1e37
git push --force origin master
# Then to prove it (it won't print any diff)
git diff master..origin/master
Simon Boudrias
la source
9
cela fait l'opération demandée, mais gardez à l'esprit que cela rendra malheureux ceux qui ont déjà retiré les commits du maître.
mnagel
J'ai suivi ces étapes et ça a reculé. Mais l'origine / HEAD pointe maintenant vers une branche autre que master. Que puis-je faire pour résoudre ce problème?
Daniil Shevelev
1
Vous ne devez pas vous soucier de l'origine / HEAD, il suffit de pousser la bonne référence à l'origine / ref
Simon Boudrias
D'accord, a dû le faire aujourd'hui après avoir accidentellement fusionné les mauvaises branches ensemble, puis poussé à l'origine. Cela fonctionne bien, mais cela pourrait être très perturbateur si d'autres personnes vérifiaient les branches concernées depuis leur origine. Utiliser avec précaution.
Nick W.
1
Ça ne marche pas. remote: error: denying non-fast-forward refs/heads/master (you should pull first)
m0skit0
52

La solution trouvée ici nous a aidés à mettre à jour master vers un commit précédent qui avait déjà été poussé:

git checkout master
git reset --hard e3f1e37
git push --force origin e3f1e37:master

La principale différence par rapport à la réponse acceptée est le hachage de validation "e3f1e37:" avant master dans la commande push.

jkovacs
la source
1
Ne fonctionne pas:remote: error: denying non-fast-forward refs/heads/master (you should pull first)
m0skit0
@ m0skit0 comme le dit le message you should pull first:)
intuitivepixel
La réponse à cela est sur stackoverflow.com/a/10544328/1019307 - git config receive.denynonfastforwards falsemais en fait, je l'ai défini manuellement dans mon référentiel git local que j'ai en ce /opt/gitque j'ai créé pour jouer avec les idées ici. Je ne sais pas comment ou si cela peut être fait pour bitbucket, github etc ... Et @intuitivepixel qui est inutile car il inverse ce que vous essayez de réaliser avec la réinitialisation matérielle.
HankCa du
Salut @jkovacs, je ne veux pas que de nouveaux changements dans master soient supprimés. Je veux juste pousser ce hachage de validation "e3f1e37" vers le maître d'origine. Est-ce possible en sautant la 2ème commande git reset --hard "e3f1e37"?
KarenAnne
Salut @jkovacs, je viens de confirmer que je peux sauter la 2ème étape. :)
KarenAnne
2

En supposant que votre branche est appelée masterici et à distance, et que votre télécommande est appelée, originvous pouvez faire:

git reset --hard <commit-hash>
git push -f origin master

Cependant, vous devez éviter de le faire si quelqu'un d'autre travaille avec votre référentiel distant et a retiré vos modifications. Dans ce cas, il serait préférable de revenir sur les commits que vous ne voulez pas, puis de pousser comme d'habitude.

Mahmoud Zaher
la source
1

Depuis que j'ai eu une situation similaire, j'ai pensé partager ma situation et comment ces réponses m'ont aidé (merci à tous).

J'ai donc décidé de travailler localement en modifiant mon dernier commit chaque fois que je voulais enregistrer ma progression sur la branche principale (je sais, j'aurais dû me diversifier, m'engager sur ce point, continuer à pousser et fusionner plus tard avec le master).

Un soir tard, dans la peur paranoïaque de perdre ma progression vers une défaillance matérielle ou quelque chose hors de l'éther, j'ai décidé de pousser le maître à l'origine. Plus tard, j'ai continué à modifier ma branche principale locale et quand j'ai décidé qu'il était temps de pousser à nouveau, j'ai été confronté à différentes branches principales et j'ai découvert que je ne pouvais pas modifier l'origine / en amont ( duh! ) Comme je peux les branches de développement local.

Je n'ai donc pas vérifié le maître localement car j'étais déjà après un commit. Le Maître était inchangé. Je n'avais même pas besoin de réinitialiser --hard, mon commit actuel était OK.

Je viens de forcer le push vers l'origine, sans même spécifier quel commit je voulais forcer sur master car dans ce cas, c'est ce que HEAD est. Vérifié git diff master..origin/masterdonc il n'y avait pas de différences et c'est tout. Tout est réparé. Merci! (Je sais, je suis un débutant git, veuillez pardonner!).

Donc, si vous êtes déjà d'accord avec votre branche maître localement, juste:

git push --force origin master
git diff master..origin/master
Paul-Sebastian Manole
la source