Git non accéléré rejeté

Je pense que cette question a été posée à plusieurs resockets, mais la solution est généralement “J’ai supprimé le répertoire et refait mon travail avec une nouvelle commande.” J’ai fait un commit et je me suis rendu compte que je me référais au mauvais numéro de ticket dans le message de validation. J’ai donc regardé SO pour une solution rapide 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 twig développement. Comment puis-je fusionner les choses pour rendre git heureux à nouveau?

Force git push :

 git push origin +develop 

Si vous poussez une validation sur le serveur et que vous réécrivez ensuite la validation locale (avec git reset , git rebase , git filter-branch ou toute autre manipulation de l’historique), puis que vous réinscrivez le commit réécrit sur le serveur, vous visser tout le monde qui avait tiré. Voici un exemple Dites que vous avez commis un A et que vous l’avez poussé vers le serveur.

 - * - * - A <- master

 - * - * - A <- origine / maître

Maintenant, vous décidez de réécrire A, comme vous l'avez mentionné, en le réinitialisant et en le réengageant. Notez que cela laisse un commit en suspens, A, qui sera éventuellement récupéré car il n'est pas accessible.

 -*-*-UNE
     \
      A '<- maître

 - * - * - A <- origine / maître

Si quelqu'un d'autre, disons Fred, retire master du serveur pendant que vous faites cela, il aura une référence à A, à partir de laquelle il pourrait commencer à travailler:

 - * - * - A '<- master

 - * - * - A <- origine / maître

 - * - * - AB <- fred / master

Maintenant, si vous pouviez pousser votre A 'vers son origine / maître, ce qui créerait un non-avance rapide, il n'y aurait pas de A dans son histoire. Donc, si Fred essayait de tirer à nouveau, il devrait soudainement fusionner et réintroduirait le commit A:

 - * - * - A '<- master

 - * - * - A <- origine / maître

 -*-*-UN B-\ 
     \ * <- fred / master
      UNE'--/

Si Fred le remarque, alors il pourrait faire un rebase, ce qui empêcherait que le commit A réapparaisse à nouveau. Mais il devrait le remarquer et se rappeler de le faire; et si vous avez plusieurs personnes qui ont tiré A vers le bas, elles devront toutes se reballer afin d’éviter d’obtenir un commit A supplémentaire dans l’arborescence.

Donc, ce n'est généralement pas une bonne idée de changer l'histoire sur un repo que d'autres personnes tirent. Si, toutefois, vous savez que personne d'autre ne tire de ce repository (par exemple, c'est votre propre repo privé ou si vous n'avez qu'un seul développeur travaillant sur le projet avec lequel vous pouvez vous coordonner facilement), vous pouvez forcer mise à jour en cours d'exécution:

 git push -f 

ou

 git push origin +master 

Celles-ci ignoreront à la fois la vérification d'une poussée sans avance rapide et mettront à jour ce qui se trouve sur le serveur avec votre nouvelle révision A ', en abandonnant la révision A pour qu'elle soit finalement récupérée.

Il est possible que les poussées forcées soient entièrement désactivées avec l'option de configuration receive.denyNonFastForwards . Cette option est activée par défaut sur les référentiels partagés. Dans ce cas, si vous voulez vraiment forcer un push, la meilleure option est de supprimer la twig et de la recréer, avec git push origin :master; git push origin master:master git push origin :master; git push origin master:master . Cependant, l'option denyNonFastForwards est activée pour une raison décrite ci-dessus; sur un référentiel partagé, cela signifie que maintenant, tous ceux qui l'utilisent doivent s'assurer qu'ils se réintègrent dans le nouvel historique.

Sur un référentiel partagé, il est généralement préférable de simplement append de nouveaux commits pour résoudre le problème que vous rencontrez; vous pouvez utiliser git revert pour générer des commits qui annuleront les modifications des commits précédents.

Vous devrez peut-être faire un git pull , ce qui peut automatiquement fusionner des choses pour vous. Ensuite, vous pouvez vous engager à nouveau. Si vous avez des conflits, vous serez invité à les résoudre.

Gardez à l’esprit que vous devez spécifier la twig à partir de laquelle vous avez mis à jour votre gitconfig pour spécifier …

Par exemple:

 git pull origin develop:develop 

J’utilisais EGit et j’ai également fait face à ce problème. Juste essayé de rebase la twig actuelle et ça a fonctionné.