2011-11-17 15 views
24

vorrei spingere il mio ramo corrente (HP1) congit push: obiettivo fissato per il ramo

git push 

e non

git push origin hp1:team/hp1 

Il ramo a distanza esiste già.

mie sedi locali:

develop 
master 
* hp1 

git spettacolo remota origine mi dice:

Remote branches: 
    develop tracked 
    master tracked 
    team/h2 tracked 
    team/hp1 tracked 
    team/n1 tracked 
Local branches configured for 'git pull': 
    develop merges with remote develop 
    master merges with remote master 
    hp1 merges with remote team/hp1 
Local refs configured for 'git push': 
    master pushes to master (up to date) 

Ho già provato

git branch --set-upstream hp1 origin/team/hp1 

e

git branch --set-upstream hp1 refs/remotes/origin/team/hp1 

ma entrambi non funzionano.

Il mio collega ha una filiale locale chiamata come ramo remoto (team/hp1) e il codice sopra funziona per lui. Ottiene alla fine un ulteriore

Local refs configured for 'git push': 
    develop pushes to develop (up to date) 
    master pushes to master (up to date) 
    team/hp1 pushes to team/hp1 (up to date) 

Quindi forse puoi dirmi cosa c'è che non va e come risolverlo.

EDIT mia configurazione:

[core] 
    repositoryformatversion = 0 
    filemode = true 
    bare = false 
    logallrefupdates = true 
[remote "origin"] 
    fetch = +refs/heads/*:refs/remotes/origin/* 
    url = ***@***:***.git 
[branch "master"] 
    remote = origin 
    merge = refs/heads/master 
[branch "hp1"] 
    remote = origin 
    merge = refs/heads/team/hp1 

risposta

40

Prima di tutti , Quando si spinge per la prima volta, fare:

git push -u origin hp1:team/hp1 

Chi opzione -u:

-u
--set-monte

Per ogni tralcio che è fino a data o spinto con successo, aggiungi riferimento upstream (tracciamento), usato da git-pull senza argomenti (1) e altri comandi. Per ulteriori informazioni, vedere branch..merge in git-config (1).

Nota dal manuale che, di per sé, non determinerà cosa succede quando si esegue git push la volta successiva. Quando fai git pull mentre sei in questo ramo, lo preleverà dall'upstream che hai impostato. Ma quando si preme, si spingerà a un ramo di corrispondenza (in questo caso HP1 e non di squadra/HP1)

Per funzionare, è necessario impostare il valore di configurazione per push.defaultupstream.Una volta impostata che, quando si preme da un ramo (basta fare git push), che spingerà al monte come detto da branch.<name>.merge

Quindi fare:

git config push.default upstream 

Circa push.default:

push.default

Definisce la spinta azione git deve avere se non refspec è dato sulla riga comando, non refspec è configurato in remoto, un nd no refspec è implicito da una qualsiasi delle opzioni fornite sulla riga di comando. Possibili valori :

niente - non spingere nulla.

corrispondenza: consente di premere tutti i rami corrispondenti. Tutti i rami che hanno lo stesso nome in entrambe le estremità sono considerati corrispondenti. Questo è l'impostazione predefinita.

upstream - spingere il ramo corrente nel relativo ramo upstream.

tracking - sinonimo deprecato per upstream.

corrente: consente di spostare il ramo corrente in un ramo con lo stesso nome.

+0

thx, ottima spiegazione! Inoltre, capisco ora, perché funziona per il mio collega senza impostare il push.default – m1schka

+0

Un altro valore per push.default è semplice - come upstream, ma si rifiuta di premere se il nome del ramo upstream è diverso da quello locale. – CodeKid

2

Utilizzare l'-u opzione per git push:

$ git push -u origin hp1:team/hp1 

Poi, dopo di che, si può fare:

$ git push 
+0

ottimo consiglio! grazie!! –

+2

per me, cambia semplicemente la configurazione per 'git pull', la configurazione' git push' è sempre la stessa (nessuna destinazione push impostata per il ramo hp1) – m1schka

+0

Puoi pubblicare il tuo file di configurazione? – mipadi

3

(marzo 2012): Attenzione: che la politica "a monte" potrebbe diventare quello di default presto
(qualche tempo dopo git1.7.10 +)
:

Vedi "Please discuss: what "git push" should do when you do not say what to push?"

nell'attuale impostazione (ovvero push.default=matching), git push senza L'argomento ut spingerà tutti i rami che esistono localmente e remotamente con lo stesso nome.
Questo di solito è appropriato quando uno sviluppatore spinge al proprio repository pubblico, ma può essere fonte di confusione se non pericoloso quando si utilizza un repository condiviso.

La proposta è modifica il difetto di 'upstream', cioè solo spingere il ramo corrente e spingerla al ramo git pull tirerebbe da.
Un altro candidato è 'current'; questo spinge solo il ramo corrente al ramo remoto con lo stesso nome.

Ciò che è stato detto fino ad ora può essere visto in questa discussione:

http://thread.gmane.org/gmane.comp.version-control.git/192547/focus=192694

precedenti discussioni rilevanti includono:

di partecipare alla discussione, inviare i messaggi a: [email protected]

+0

git 2.0 cambierà il comportamento predefinito per git push, ma solo per la modalità "semplice" che non penso possa fare ciò che desideri. Vedi https://www.kernel.org/pub/software/scm/git/docs/git-config.html –

+0

@AlexanderBird Sì, hai ragione. L'ho documentato da allora: http://stackoverflow.com/a/10002469/6309, http://stackoverflow.com/a/13751847/6309. – VonC

0

Di seguito consentirà a non avere per specificare -u ${branch_name} per la prima git push.

git config "branch.${branch_name}.remote" origin 
git config "branch.${branch_name}.merge" "refs/heads/${branch_name}" 

Certo, è molto più di battitura, ma non quando è in uno script che imposta di uno spazio di lavoro. Inoltre, non spinge prematuramente il ramo sul repository remoto.