2009-05-06 16 views
18

Che cosa potrebbe causare un 'git push' per provare e impegnarsi in due rami? Ho una mia filiale su cui sto lavorando, che è sul repository condiviso ... e un master branch. In questo momento volevo solo spingere al mio ramo personale che andava bene, ma ha anche cercato di spingere al master e mi ha rifiutato. Sembrava qualcosa di simile:Perché git spinge verso due rami in questo push git?

foo$ git push 
Counting objects: 38, done. 
Delta compression using 2 threads. 
Compressing objects: 100% (19/19), done. 
Writing objects: 100% (21/21), 9.73 KiB, done. 
Total 21 (delta 14), reused 0 (delta 0) 
To ssh://example.com/project.git 
    8184634..86b621e mybranch -> mybranch 
! [rejected]  master -> master (non-fast forward) 
error: failed to push some refs to 'ssh://example.com/project.git' 

mio config si presenta così:

remote.origin.url=ssh://example.com/project.git 
remote.origin.fetch=+refs/heads/*:refs/remotes/origin/* 
branch.master.remote=origin 
branch.master.merge=refs/heads/master 
branch.mybranch.remote=origin 
branch.mybranch.merge=refs/heads/mybranch 

Esko nota che sta spingendo ad entrambi perché sono nel mio config. Cosa succede se voglio spingere ad entrambi, solo non simultaneamente? Quando ho il mybranch verificato e io spingo, voglio chiaramente spingere mybranch e non padroneggiare. Ci sono momenti in cui eseguo il checkout di master, modifica codice e voglio commettere/spingere anche questo. C'è un modo per entrambi di coesistere?

risposta

26

Quando si utilizza git push senza argomenti, spingerà tutte le sezioni locali che hanno un ramo remoto corrispondente con lo stesso nome. Dal momento che il repository locale ha filiali master e mybranch, e anche il repository remoto ha filiali master e mybranch, quindi Git spingerà entrambi.

Se si vuole spingere un solo ramo, si può dire a Git esplicitamente che quale ramo si vuole spingere: git push origin mybranch

Se si vuole spingere master, è possibile correggere tale errore dal primo tirando da maestro. Git si lamenta del fatto che l'unione non è veloce, perché qualcun altro ha spinto un commit a dominare dall'ultima volta che hai estratto il master.

+0

Cosa devo fare se voglio spingere ciascuno di essi, non solo al contemporaneamente?Ci sono momenti in cui voglio spingere solo mybranch, e ci sono momenti in cui unirò mybranch al master e voglio spingere il master. Che cosa si fa in questo caso? – Coocoo4Cocoa

+0

È sempre possibile nominare esplicitamente il ramo che si desidera premere, utilizzando il modulo "git push ". Vedi http://www.kernel.org/pub/software/scm/git/docs/git-push.html –

+0

Le versioni più recenti di git ti consentono di specificare questo comportamento. – Dustin

3

Se si desidera premere solo il ramo corrente, è possibile utilizzare "git push ORIGIN HEAD" o anche "git push HEAD" (con git moderno).

Il comportamento di default se non refspec per spinta (refspec che avete definito per recuperare nella vostra configurazione, ma non per spinta) è quello di spingere corrispondenti rif. Da git-push(1):

git push [...] [<repository><refspec> ...]

<refspec> ...

Il special refspec: (o +: per consentire aggiornamenti non veloci) indirizza git a premere i rami "corrispondenti": per ogni ramo che esiste sul lato locale, il lato remoto viene aggiornato se esiste già una diramazione dello con lo stesso nome sul lato remoto. Questa è la modalità di funzionamento predefinita se non viene trovata alcuna refspec esplicito (che non è né sulla riga di comando né ...

+0

Quando eseguo "git push" con un nuovo (er) git (ad esempio 1.6.3.1), ricevo un avvertimento enorme, dicendo che dovrei impostare push.default o il repository dovrebbe configurare push refspecs. Non posso per la vita di me capire come fare la seconda cosa. Google non è stato utile. (Mi piacerebbe configurare il repository, perché i potenziali pusher ai miei repository saranno confusi/infastiditi con il big fat warning, e non voglio che debbano configurare nulla dopo "git clone ...") – asjo

+2

Configurare (configurare) il telecomando. .push, dove potrebbe essere nel tuo caso 'origine', e da utilizzare per il mirror mirror push to bare repository sarebbe "+ refs/heads/*: refs/heads/*" (e lo stesso per i tag) –