84 votes

Comment faire en sorte qu'un commit plus ancien devienne HEAD ?

J'ai réalisé que j'avais fait des erreurs sur HEAD, j'ai consulté un commit plus ancien et j'ai commencé à coder à partir de là. Lorsque je tente un push, on me dit que mon commit actuel est en retard et que je dois fusionner avec HEAD. Git recommande "git pull". Cependant, HEAD contient le code que je veux ignorer. Comment résoudre ce problème ?

Organigramme :

-------- HEAD (bad) ---------------------- + (behind conflict, requires
     \                                    /   merge with HEAD, which is
      \------- Current commit (good) ----/    bad and needs to be ignored)

112voto

radtek Points 506

Voici ce que vous pouvez faire :

git checkout <branch-to-modify-head>
git reset --hard <commit-hash-id-to-put-as-head>
git push -f

Si vous ne forcez pas le push, git affichera cette erreur : Les mises à jour ont été rejetées car la pointe de votre branche actuelle est en retard.

Notez que cela va altérer votre historique git, donc une autre façon de faire est de revenir sur chaque commit que vous ne voulez pas. De cette façon, vous conservez votre historique :

git revert commit-id

Santé

28voto

meagar Points 85475

Si votre dépôt n'est pas utilisé par d'autres personnes, vous pouvez en toute sécurité faire ce qui suit git push -f pour écraser la branche distante.

19voto

Elena Points 542

Je procède de la manière suivante :

git reset --hard <commit-SHA>
git push origin HEAD:<name-of-remote-branch>

C'est la façon dont git recommande et fait git push -f pourrait être un peu problématique pour tous les autres membres de l'équipe de développement

11voto

igronus Points 129

La seule chose qui a fonctionné pour moi :

git checkout <OLD_COMMIT>
git branch temp
git checkout temp
git branch -f master temp
git checkout master
git branch -d temp

9voto

Mike Monkiewicz Points 907

ANeves a raison, "git push -f" ne fonctionne que si vous êtes la seule personne à utiliser le dépôt. Ce n'est pas une solution acceptable pour la plupart des gens.

Voici l'historique des livraisons :

---A-B < HEAD (bad)
    \
     C < my_branch (good)

Il contient les solutions que vous recherchez : Comment écraser, plutôt que fusionner, une branche sur une autre branche dans Git ?

Pour résumer,

git checkout my_branch
git merge -s ours HEAD

Cela va écraser tous les changements sur la branche HEAD, et vous donner ce qui suit :

--A-B-D < HEAD, my_branch (both good)
   \ /
    C

Dans ce cas, D est identique à C, mais ses parents sont différents.

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