2009-09-25 7 views
9

J'ai essayé de pousser mon (premier!) Git comme celui-ci d'abord:Pourquoi "git push helloworld + master: master" au lieu de "git push helloworld"?

$ git push helloworld 

mais je m'y suis ce retour:

To [email protected]:helloworld.git 
! [rejected]  HEAD -> master (non-fast forward) error: 
failed to push some refs to '[email protected]:helloworld 
git' 

Je trouve another StackOverflow question à propos de "commits modifié" et a essayé une suggestion à partir de là sans vraiment savoir si cela m'aiderait:

[email protected] /c/test/helloworld (master) 
$ git push helloworld +master:master 

Cela a fonctionné!

Mais je ne sais pas pourquoi il résolu mon problème :(

Quelqu'un pourrait-il expliquer pourquoi cela fonctionne, mais « git push helloworld » ne fonctionne pas?

+1

Ajout d'une autre solution, en réponse à votre commentaire. – VonC

Répondre

18

Il semble que vous avez réécrit votre histoire (SHA-1 associée à votre livraison) dans la branche master

Cela signifie que vous ne pouvez pousser plus en mode avance rapide

les forces maître + le pousser à se faire:..
par Si vous avez l'option leading +, vous pouvez dire à git de mettre à jour l'adresse <dst> même si la mise à jour n'est pas une avance rapide.

Remarque: cela peut être négatif si quelqu'un d'autre a déjà cloné votre référentiel, car il ne sera plus capable de tirer votre branche principale sans conflit.
Voir aussi SO answer for more.


Note: comme mentionné by Junio C. Hamano:

Il existe deux mécanismes de sécurité indépendants:

  • la sécurité de fin d'émission peut être remplacée par "git push --force" et/ou en utilisant un refspec préfixé par un '+');

  • la sécurité de l'extrémité réceptrice peut être remplacée par la variable de configuration receive.denynonfastworwards du référentiel dans lequel vous insérez.

Ce dernier par défaut « dangereux », mais si la sécurité est activée dans le référentiel, forçant du côté émetteur ne le désactiver. IOW, les deux extrémités doivent être d'accord pour permettre le comportement dangereux.


Comme mentionné dans le Git FAQ, un cours d'action possible est:

La raison la plus probable est que vous devez tirer de la télécommande d'abord. Vous pouvez voir quels changements le côté distant a en récupérant d'abord, puis en vérifiant le journal.Par exemple,

$ git fetch origin 
$ git log master..origin/master 

la liste de tous les changements du côté distant a que votre côté ne fonctionne pas. Si vous voulez une représentation graphique, utilisez gitk --left-right master...origin/master.
Les flèches vers la gauche correspondent aux modifications que vous souhaitez effectuer, les flèches situées à droite correspondent aux modifications effectuées sur le côté distant.

Autre solution (qui est ce que vous avez fait):

$ git push origin +branchname 

Cela forcera la mise à jour. Si vous n'êtes pas autorisé, alors parfois cela fonctionnera:

$ git push origin :branchname 
$ git push origin +branchname 

-à-dire, supprimer la branche à distance d'abord (ce qui est souvent autorisée), puis re-pousser le « nouveau » (ou peut-être rembobiné) branche.

Soyez averti que si vous rembobinez des branches, d'autres pourraient avoir des problèmes lors du tirage.
Il y a une chance qu'ils fusionnent dans la branche qu'ils ont récupérée avec le nouveau que vous avez publié, gardant effectivement les changements dont vous essayez de vous débarrasser.
Cependant, ce ne seront que leurs copies qui auront les mauvaises révisions. Pour cette raison, les branches de rembobinage sont considérées comme légèrement antisociales. Néanmoins, c'est souvent approprié.

+0

Ceci est un dépôt privé git juste pour apprendre les ficelles du métier - je ne m'inquiète donc pas des conflits avec les autres. Ce que je voudrais faire est de supprimer ce dépôt et de le faire correctement la prochaine fois. Qu'aurais-je dû faire au lieu de "+ maître: maître" après avoir reçu le message "[rejeté]"? –

+0

C'était tout. Merci beaucoup! Je l'ai refait de zéro mais cette fois-ci j'ai tiré d'abord et ça a marché. Quelle étrange bizarrerie! Dans Mercurial, je n'ai jamais eu à faire quelque chose comme ça quand je suis en train de mettre en place un nouveau projet. –

+0

hg push a un drapeau de force pour la même raison. Si vous changez l'histoire (via mq ou autre), vous devrez forcer cette poussée. – Dustin

Questions connexes