J'ai l'impression que cette question a été posée à plusieurs reprises, mais la solution est généralement «J'ai supprimé le répertoire et refait mon travail avec une nouvelle caisse». J'ai fait un commit et un push mais j'ai réalisé que je faisais référence au mauvais numéro de ticket dans le message de commit. J'ai donc cherché une solution rapide sur SO 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 j'obtiens 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 develop. Comment puis-je fusionner les choses pour rendre git heureux à nouveau?
git
version-control
rynmrtn
la source
la source
Réponses:
Force
git push
:la source
receive.denyNonFastForwards
de la réponse de Brian Campbell :+
ou--force
peut ne pas être suffisamment énergique, selon la façon dont ils - qui qu'ils soient - ont configuré leur référentiel Git.Si vous appuyez sur une validation au serveur, puis réécriture qui engagent localement (avec
git reset
,git rebase
,git filter-branch
ou toute autre manipulation de l' histoire), puis poussé que réécrite commettre de nouveau sur le serveur, vous bousiller toute autre personne qui avait tiré. Voici un exemple; disons que vous avez validé A et que vous l'avez poussé vers le serveur.Vous décidez maintenant de réécrire A, comme vous l'avez mentionné, de réinitialiser et de réengager. Notez que cela laisse un commit suspendu, A, qui sera finalement récupéré car il n'est pas accessible.
Si quelqu'un d'autre, disons Fred, sort
master
du serveur pendant que vous faites cela, il aura une référence à A, à partir de laquelle il pourra commencer à travailler:Maintenant, si vous pouviez pousser votre A 'à l'origine / maître, ce qui créerait une avance non rapide, il n'aurait pas A dans son histoire. Donc, si Fred essayait à nouveau de tirer, il devrait soudainement fusionner et réintroduire le commit A:
Si Fred remarque cela, alors il pourrait faire un rebase, ce qui empêcherait le commit A de réapparaître. Mais il devrait le remarquer et se souvenir de le faire; et si vous avez plus d'une personne qui a abaissé A, elles devraient toutes rebaser pour éviter d'avoir le commit A supplémentaire dans l'arbre.
Donc, ce n'est généralement pas une bonne idée de changer l'historique d'un repo dont d'autres personnes tirent. Si, cependant, vous savez que personne d'autre ne tire de ce dépôt (par exemple, c'est votre propre dépôt privé, ou vous n'avez qu'un seul autre développeur travaillant sur le projet avec lequel vous pouvez vous coordonner facilement), alors vous pouvez forcer mettre à jour en exécutant:
ou
Ceux-ci ignoreront à la fois la vérification d'une poussée non rapide et mettront à jour ce qui se trouve sur le serveur avec votre nouvelle révision A ', abandonnant la révision A afin qu'elle soit finalement ramassée.
Il est possible que les poussées forcées soient entièrement désactivées avec l'
receive.denyNonFastForwards
option config. Cette option est activée par défaut sur les référentiels partagés. Dans ce cas, si vous voulez vraiment, vraiment forcer un push, la meilleure option est de supprimer la branche et de la recréer, avecgit push origin :master; git push origin master:master
. Cependant, l'denyNonFastForwards
option est activée pour une raison, qui est décrite ci-dessus; sur un référentiel partagé, cela signifie que désormais, tous ceux qui l'utilisent doivent s'assurer qu'ils rebasent sur le nouvel historique.Sur un référentiel partagé, il est généralement préférable de simplement pousser de nouveaux commits par-dessus 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.la source
+develop
sa commande - donc le chèque lui revient. Vous avez quand même un nombre astronomique de points: Pgit push --force
receive.denyNonFastForwards
option de configuration. Cette option est activée par défaut sur les référentiels partagés. Dans ce cas, si vous voulez vraiment, vraiment forcer un push, la meilleure option est de supprimer la branche et de la recréer, avecgit push origin :remote_A; git push origin local_A:remote_A
. Mais lisez ce que j'ai écrit ci-dessus pour expliquer pourquoi c'est une mauvaise idée de faire ce type de flux de travail sur un référentiel partagé. Vous ne devriez essayer de faire cela que si vous avez quelque chose qui pose de sérieux problèmes dans le commit que vous essayez de vous débarrasser ou de réécrire.Vous devrez peut-être faire un
git pull
, qui PEUT fusionner automatiquement des trucs pour vous. Ensuite, vous pouvez vous engager à nouveau. Si vous avez des conflits, il vous demandera de les résoudre.Gardez à l'esprit que vous devez spécifier la branche à partir de laquelle extraire si vous n'avez pas mis à jour votre gitconfig pour spécifier ...
Par exemple:
la source
! [rejected] develop -> develop (non-fast-forward)
git push origin develop
)J'utilisais EGit et j'ai également rencontré ce problème. Je viens d'essayer
rebase
la branche actuelle et cela a fonctionné.la source