839 votes

Comment puis-je pousser modifié s'engager à la distance repo git?

Quand j'ai travaillé un peu avec mon code source, je fais mon truc habituel commettre et puis je l'ai pousser à une distance de repo. Mais ensuite, j'ai remarqué que j'ai oublié d'organiser mon importations dans le code source. Je fais donc de la modifier de commande pour remplacer la précédente livraison:

> git commit --amend

Malheureusement, la validation ne peut pas être poussé vers le dépôt. Il est rejeté comme ceci:

> git push origin
To //my.remote.repo.com/stuff.git/
 ! [rejected]        master -> master (non-fast forward)
error: failed to push some refs to '//my.remote.repo.com/stuff.git/'

Que dois-je faire? (Je peux accéder à la télécommande repo)

320voto

Charles Bailey Points 244082

Ce que vous voyez est un git dispositif de sécurité. git refuse de mettre à jour la branche à distance avec votre succursale parce que votre succursale de la tête de s'engager n'est pas un descendant direct de l'actuel chef de commit de la branche que vous êtes le pousser à.

Si ce n'était pas le cas, alors deux personnes en le poussant vers la même référentiel, à la même époque ne serait pas savoir qu'il y avait un nouveau commit à venir dans le même temps, et celui qui a poussé dernier perdrait le travail de la précédente poussoir sans que l'une d'entre eux cette réalisation.

Si vous savez que vous êtes la seule personne qui pousse et vous souhaitez faire une modification de commettre ou de pousser un commit qui serpente le dos de la direction générale, vous pouvez "forcer" git pour la mise à jour de la branche distante en utilisant le commutateur-f.

git push -f origin master

Même cela peut ne pas fonctionner comme git permet à des dépôts distants de refuser non-fastforward pousse à l'extrême fin à l'aide de la variable de config 'recevoir.denynonfastforwards'. Si c'est le cas, le rejet de la raison ressemblera à ceci (notez la distance rejeté " partie):

 ! [remote rejected] master -> master (non-fast forward)

Pour contourner ce problème, vous devez modifier soit le dépôt distant de config ou comme un sale hack vous pouvez la supprimer et la recréer la direction générale ainsi:

git push origin :master
git push origin master

En général, le dernier paramètre git push utilise le format <local_ref>:<remote_ref>local_ref est le nom de la branche sur le dépôt local et remote_ref est le nom de la branche sur le dépôt distant. Cette commande paire utilise deux abréviations. :master a une valeur null local_ref qui signifie pousser un null branche sur le côté distant master, c'est à dire supprimer la branche distante. Un nom de branche sans : moyen de pousser la branche locale avec le nom donné à la branche à distance avec le même nom. master dans cette situation est l'abréviation de l' master:master.

124voto

mipadi Points 135410

Réponse courte: Ne poussez pas modifié s'engage à un public de pensions.

Réponse longue: quelques commandes Git, comme git commit --amend et git rebase, en fait réécrire l'histoire graphique. C'est très bien aussi longtemps que vous n'avez pas publié vos modifications, mais une fois que vous faites, vous ne devriez pas être curage autour de l'histoire, parce que si quelqu'un a déjà eu vos modifications, puis, quand ils essaient de tirer de nouveau, elle peut échouer. Au lieu de modifier un commit, vous devriez juste faire un nouveau commit avec les changements.

Toutefois, si vous avez vraiment, vraiment envie de pousser une version modifiée de s'engager, vous pouvez le faire comme ceci:

$ git push origin +master:master

Le premier + signe de la force de la pousser à se produire, même s'il n'a pas dans un "fast-forward" s'engager. (Un fast-forward commettre se produit lorsque les modifications sont en train de pousser êtes un descendant direct des changements déjà dans le public des pensions.)

36voto

bara Points 817

J'ai résolu en supprimant mon local modifiée de s'engager et d'en ajouter de nouveaux changements sur le dessus:

# rewind to commit before conflicting
git reset --soft HEAD~1
# pull the remote version
git pull
# add the new commit on top
git add ...
git commit
git push

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