108 votes

Comment forcer un push réinitialisé vers le dépôt distant ?

Notre branche principale à distance s'est étonnamment embrouillée. Le code de développement actuel est sur la branche principale avec les derniers commits. De toute évidence, le code de développement n'est pas prêt pour la branche principale.

Alors sur mon dépôt local, j'ai fait un reset à la dernière balise, git reset --hard (Tag). La branche principale est maintenant correcte sur mon dépôt local. Maintenant, lorsque j'essaie de pousser les modifications sur le dépôt distant, git push origin master, j'obtiens une erreur :

à (EMPLACEMENT DU DÉPÔT GIT DISTANT)
 ! [rejected]        master -> master (non-fast-forward)
erreur: impossible de pousser certaines références vers '(EMPLACEMENT DU DÉPÔT GIT DISTANT)'
Pour éviter que vous ne perdiez de l'historique, les mises à jour non fast-forward ont été rejetées
Fusionnez les modifications à distance (par exemple, 'git pull') avant de pousser à nouveau.  Voir la section 'Note sur les fast-forwards' de 'git push --help' pour plus de détails.

Donc après avoir regardé autour, j'ai découvert l'option --force. J'ai donc fait une poussée forcée sur le dépôt distant, git push --force origin master, et j'ai encore eu une erreur :

Total 0 (delta 0), réutilisé 0 (delta 0)
à (EMPLACEMENT DU DÉPÔT GIT DISTANT)
 ! [remote rejected] master -> master (non-fast-forward)
erreur: impossible de pousser certaines références vers '(EMPLACEMENT DU DÉPÔT GIT DISTANT)'

Je ne peux pas faire de pull sur master, car il contient du code de développement qui ne peut pas être sur master.

166voto

svick Points 81772

Le message signifie que vous n'êtes pas autorisé à effectuer un push non fast-forward.

Votre dépôt distant a très probablement denyNonFastforwards = true dans sa configuration. Si vous changez cela, git push --force devrait fonctionner.

Pour modifier le paramètre, vous devez avoir accès à la machine avec le dépôt distant. De là, faites git config receive.denynonfastforwards false.

17voto

richo Points 3238

La télécommande ne permet pas les avances rapides non rapides.

Votre meilleure option est de git revert tous les commits qui ne devraient pas être là et d'être plus prudent à l'avenir.

git revert [commit] créera un nouveau commit qui annulera ce que [commit] a fait.

13voto

Chris Ledet Points 6543

Essayez d'utiliser le drapeau -f et de le placer après le nom de la branche distante.

git push origin master -f

13voto

emery Points 107

Étapes pour activer définitivement la poussée forcée dans le style suivant

git push -f myrepo my-branch

Éditez le fichier nommé "config" dans le dossier se terminant par ".git" sur votre dépôt distant

Dans la sortie de la ligne de commande de git de la poussée échouée, cherchez la ligne qui dit quelque chose comme :

error: failed to push some refs to 'ssh://user@some-remote-server.mycompany.com/srv/git/myrepo.git

puis

ssh user@some-remote-server.mycompany.com
cd /srv/git/myrepo.git
vi config

Définissez "denyNonFastforwards" sur false

Dans "config", définissez

[receive]
        denyNonFastforwards = false

Maintenant vous pouvez pousser depuis votre machine locale avec -f

git push -f myrepo my-branch

3voto

La meilleure solution est de supprimer la branche distante et de la renvoyer :

git push origin master --delete
git push origin master

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