Come si fa a spingere solo un singolo ramo Git (e nessun altro ramo)?


247

Sto lavorando su un repository git locale. Ci sono due rami mastere feature_x.

Voglio spingere feature_xnel repository remoto, ma non voglio spingere le modifiche sul masterramo.

Un git push origin feature_xdal mio feature_xramo ( feature_xramo esiste già sul telecomando) funzionerà?

Non voglio provare questo sulla mia scatola, perché non posso spingere al master in questo momento.


Dai un'occhiata qui: remoto e qui: spingi un ramo su github Sembra che funzioni.
al.

Risposte:


376

Sì, basta fare quanto segue

git checkout feature_x
git push origin feature_x

54
Con git moderno dovresti essere in grado di semplicemente "git push origin HEAD", o anche "git push HEAD" per spingere solo il ramo attualmente estratto.
Jakub Narębski,

2
È necessario effettuare il checkout su feature_x?
hd.

5
sì, perché se sei sul master tenterebbe di inviare il ramo master locale al ramo feature_x remoto. per non dover prima fare il checkout dovresti fare "git push origin feature_x: feature_x"
cpjolicoeur,

1
@cpjolicoeur Ho visto in altre domande (es: qui ) che stanno facendo git push -u origin <branch-name>. Tuttavia non l'hai menzionato. È necessario ?
riroo,

3
@miss_R l' -uopzione su un git-pushcomando imposterà il riferimento a monte per tracciare il ramo appena spinto. Ciò renderà cose come git-pullsu quel ramo in futuro già sapere da quale ramo estrarre senza specificarlo. Non è necessario come opzione per inviare un singolo ramo, ma è ampiamente utilizzato perché molte persone vogliono fare in modo che il ramo locale tenga traccia del ramo remoto che stanno spingendo.
cpjolicoeur,

74

Per impostazione predefinita git pushaggiorna tutti i rami remoti. Ma puoi configurare git per aggiornare solo il ramo corrente a monte.

git config push.default upstream

Significa che git aggiornerà solo il ramo corrente (estratto) quando esegui git push.

Altre opzioni valide sono:

  • nothing: Non inviare nulla (errore) a meno che non venga esplicitamente fornito un refspec . Questo è principalmente pensato per le persone che vogliono evitare errori essendo sempre esplicite.
  • matching: Spingere tutti i rami con lo stesso nome su entrambe le estremità. (opzione predefinita prima della versione 1.7.11)
  • upstream: Spingere il ramo corrente sul ramo a monte. Questa modalità ha senso solo se si sta spingendo nello stesso repository da cui normalmente si preleva (ovvero flusso di lavoro centrale ). Non è necessario avere lo stesso nome per la filiale locale e remota.
  • tracking: Obsoleto, utilizzare upstreaminvece.
  • current: Sposta il ramo corrente sul ramo remoto con lo stesso nome sull'estremità ricevente. Funziona in flussi di lavoro sia centrali che non centrali.
  • simple: [disponibile dalla versione 1.7.11] nel flusso di lavoro centralizzato, funziona come upstreamcon una sicurezza aggiuntiva per rifiutare di spingere se il nome del ramo a monte è diverso da quello locale. Quando si spinge verso un telecomando diverso dal telecomando da cui si estrae normalmente, lavorare come current. Questa è l'opzione più sicura ed è adatta per i principianti. Questa modalità è diventata l'impostazione predefinita in Git 2.0.

2
Grazie, currentera quello che stavo cercando, per impostazione predefinita git pushnel fooramo lo spingerò al origin/fooramo.
Dorian,

@Dorian grazie, sono d'accordo che currentha più senso come impostazione predefinita.
Zoltán,

@Dorian, @ Zoltán - Sento che simpleha più senso come valore predefinito. Ho aggiornato la risposta con "quando usare cosa". Dai un'occhiata.
Karthik Bose,

1
Nota: dalla versione 2 di git il valore predefinito è cambiato in simple.
Danijel,

8

Aggiornamento secondario in aggiunta alla risposta di Karthik Bose : puoi configurare git a livello globale, in modo che influisca su tutte le aree di lavoro in modo che si comportino in questo modo:

git config --global push.default upstream

a monte non è stato riconosciuto come impostazione valida per me, ho dovuto mettere 'corrente' invece
cavalletta

-2

Supponiamo quindi che tu abbia un branch branch locale, un remote chiamato origin e un branch / origin remoto / master.

Per spingere il contenuto di foo su origin / master, devi prima impostarlo a monte:

git checkout foo
git branch -u origin/master

Quindi puoi spingere in questo ramo usando:

git push origin HEAD:master

Nell'ultimo comando è possibile aggiungere --force per sostituire l'intera cronologia di origine / master con quella di pippo.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.