102 votes

Ne peut pas pousser les changements après avoir utilisé git reset --hard

J'ai commis une erreur et j'ai soumis des modifications à git que je n'aurais pas dû soumettre. Après avoir effectué la validation, j'ai poussé mes modifications. J'ai ensuite utilisé les commandes suivantes pour essayer de réinitialiser mes modifications.

 git reset --hard head

Maintenant je veux pousser cette 'réinitialisation' vers le dépôt distant avec cette commande :

git push MyBranch

Mais je reçois cette erreur :

remote: error: denying non-fast-forward refs/heads/branch (you should pull first)

J'ai essayé d'utiliser cette commande sans succès :

git push -f "origin" 

Des idées sur ce que je peux faire ?

175voto

VonC Points 414372
git push -f origin myBranch 

devrait fonctionner (à condition de savoir que cela peut être dangereux si maBranch a déjà été récupérée par d'autres dans leur propre dépôt)

Depuis 2012, vous avez également :

  • git push --force-with-lease (Git 1.8.5+ T3 2013) qui est plus sûr, et
  • git push --force-if-includes (Git 2.30+, T1 2021), qui tente de s'assurer que ce qui est poussé de force a été créé après avoir examiné le commit à la pointe de la référence distante qui s'apprête à être remplacée de force.

Remarque : si votre dépôt distant ('origin') a sa configuration définie sur

receive.denyNonFastForwards true

cela refusera toute poussée non fast-forward (même lorsqu'elle est forcée).
Voir "Y a-t-il un moyen de configurer un dépôt git pour refuser 'git push --force'?".


L'utilisateur OP user654019 rapporte

J'ai réussi à résoudre le problème cette fois en définissant denyNonFastForwards sur false et en utilisant -f pour forcer la poussée

Si l'utilisateur n'avait pas accès au dépôt, il devrait :

  • réinitialiser le HEAD local à sa position d'origine (voir "Récupérer après git reset --hard?") :
    git reset HEAD@{1}
  • faire un nouveau commit qui annule votre fusion, comme décrit dans le livre ProGit, avec git revert :
    git revert -m 1 HEAD~ (dans votre cas)

Par exemple :

$ git revert -m 1 [sha_of_C8]
Un seul commit a été annulé.
[master 88edd6d] Annuler "Merge branch 'jk/post-checkout'"
 1 fichier modifié, 0 insertions(+), 2 suppressions(-)

annuler une fusion

Une discussion complète sur la façon d'annuler une fusion peut être trouvée ici.

L'idée reste de générer uniquement des commits nouveaux, y compris un annulant les changements introduits par le commit de fusion.
Vous pouvez ensuite pousser ce nouveau commit, comme un changement fast-forward.

26voto

ralphtheninja Points 24346

Vous devez spécifier la référence que vous voulez pousser :

git push -f origin MyBranch

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