87 votes

Git non-transfert rapide rejeté

J'ai l'impression que cette question a été posée de nombreuses fois, mais la solution est généralement "J'ai supprimé le répertoire et refait mon travail avec un nouveau checkout". J'ai fait un commit et un push mais j'ai réalisé que je me suis référé au mauvais numéro de ticket dans le message du commit. J'ai donc cherché sur SO une solution rapide solution et j'ai fini par taper ce qui suit dans le terminal :

$ git reset --soft HEAD^
$ git commit -m "... correct message ..."

Le seul problème est que je reçois le message d'erreur suivant :

To prevent you from losing history, non-fast-forward updates were rejected
Merge the remote changes before pushing again.  See the 'Note about
fast-forwards' section of 'git push --help' for details.

J'utilise le modèle git-flow et je travaille sur la branche de développement. Comment puis-je fusionner les choses pour que git soit à nouveau satisfait ?

173voto

Brian Campbell Points 101107

Si vous poussez un commit sur le serveur, puis de réécriture qui s'engagent localement (avec git reset, git rebase, git filter-branch, ou de toute autre version de l'histoire de manipulation), et ensuite poussé qui réécrit commettre sauvegarder sur le serveur, vous aurez vis de n'importe qui d'autre qui avait tiré. Voici exemple, disons que vous avez commis, et l'a poussé vers le serveur.

- *- *- <--Master

- *- *- <-- Origin/master

Maintenant, vous décidez de réécrire, dans la façon dont vous l'avez mentionné, de réinitialiser et de ré-engager. Notez que cela laisse une balançant commettre Une, qui finira par être nettoyée comme il n'est pas accessible.

-*-*-
\
 A' <-- master

- *- *- <-- Origin/master

Si quelqu'un d'autre, disons que Fred, abat master depuis le serveur pendant que vous faites cela, ils ont une référence à Un, ils peuvent commencer à travailler à partir de:

- *- *- '<--Master

- *- *- <-- Origin/master

-*-*-A-B <-- fred/master

Maintenant, si vous avez été en mesure de pousser votre Un' origin/master, qui permettrait de créer un non-rapide-vers l'avant, il n'y aurait pas Un de son histoire. Donc, si Fred a essayé de tirer de nouveau, il avait soudain besoin de fusion et de re-présenter l'Un commit:

- *- *- '<--Master

- *- *- <-- Origin/master

-*-*-A-B-\ 
 \ * <-- fred/master
Un'--/

Si Fred arrive à faire ce constat, il pourrait faire un rebase, ce qui pourrait les empêcher de commettre Un de réapparaître à nouveau. Mais il faudrait qu'il s'en aperçoivent, et n'oubliez pas de le faire; et si vous avez plus d'une personne qui a tiré Un vers le bas, ils ont tous à rebase afin d'éviter d'obtenir le supplément d'Un commit dans l'arbre.

Donc, il n'est généralement pas une bonne idée de changer l'histoire sur les pensions de titres que d'autres personnes de tirer à partir d'. Toutefois, si vous arrive de savoir que personne d'autre ne tirant que de pensions de titres (par exemple, c'est votre propre repo, ou vous n'avez qu'un autre développeur qui travaille sur le projet qui vous permet de coordonner facilement avec), vous pouvez forcer la mise à jour en cours d'exécution:

git push -f

ou

git push origin +master

Ces ignorer la vérification pour un non-avance rapide push, et de mettre à jour ce qui est sur le serveur de votre nouveau Une " révision, l'abandon de la révision de sorte qu'il finira par être nettoyée.

52voto

Alan Haggai Alavi Points 34260

Force git push :

git push origin +develop

14voto

Tony Points 743

Vous pourriez avoir à faire un git pull qui peut fusionner automatiquement des éléments pour vous. Ensuite, vous pouvez à nouveau commiter. Si vous avez des conflits, vous serez invité à les résoudre.

Gardez à l'esprit que vous devez spécifier de quelle branche tirer si vous n'avez pas mis à jour votre gitconfig pour spécifier...

Par exemple :

git pull origin develop:develop

7voto

Nguyen Minh Binh Points 6438

J'utilisais EGit et j'ai également rencontré ce problème. J'ai juste essayé de rebase la branche actuelle et ça a marché.

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