Come posso trasferire facilmente un ramo Git locale su un telecomando con un nome diverso?


175

Mi chiedevo se c'è un modo semplice per spingere e tirare un ramo locale con un ramo remoto con un nome diverso senza specificare sempre entrambi i nomi.

Per esempio:

$ git clone myrepo.git
$ git checkout -b newb
$ ...
$ git commit -m "Some change"
$ git push origin newb:remote_branch_name

Ora, se qualcuno aggiorna remote_branch_name, posso:

$ git pull

E tutto è unito / avanzato. Tuttavia, se apporto modifiche al mio "newb" locale, non posso:

$ git push

Invece, devo:

% git push origin newb:remote_branch_name

Sembra un po 'sciocco. Se git-pullutilizza git-config branch.newb.mergeper determinare da dove estrarre, perché non potrebbe git-pushavere un'opzione di configurazione simile? C'è una bella scorciatoia per questo o dovrei solo continuare a lungo?

Risposte:


93

Sicuro. Basta impostare il tuopush.default per upstreamspingere i rami verso i loro flussi verso l'alto (che è lo stesso da cui pulltrarrà, definito da branch.newb.merge), piuttosto che spingere i rami verso quelli corrispondenti nel nome (che è l'impostazione predefinita per push.default, matching).

git config push.default upstream

Si noti che questo era chiamato tracking non upstreamprima di Git 1.7.4.2, quindi se stai usando una versione precedente di Git, usa trackinginvece. L' push.defaultopzione è stata aggiunta in Git 1.6.4, quindi se hai una versione precedente a quella, non avrai affatto questa opzione e dovrai specificare esplicitamente il ramo su cui eseguire il push.


Questo è stato! Questo vale per tutti i rami che stanno monitorando, ma va bene. Grazie!
jmacdonagh,

Sarei interessato a sapere se esiste una scorciatoia per il nome della filiale che ho verificato. Potrei solo sapere git push buildserver .:test_thisdove .deve essere il nome della filiale locale che non conosco necessariamente. Potrei cercarlo, certo, ma se ci fosse una mano corta, come il punto, per quello, sarebbe bello.
Federico Nord,

2
@FrederickNord HEADè la scorciatoia che stai cercando. HEADè ciò che punta al ramo attualmente estratto o direttamente a un particolare commit se si ha una testa staccata.
Brian Campbell,

Grazie! Ciò ha risolto l' Updates were rejected because a pushed branch tip is behind its remoteerrore per me. Il mio repository locale era aggiornato, ma i nomi erano semplicemente diversi.
canhazbits

171

Quando fai il push iniziale aggiungi il parametro -u :

git push -u origin my_branch:remote_branch

Le spinte successive andranno dove vuoi.

MODIFICARE:

Come da commento, questo crea solo pull.

git branch --set-upstream

dovrebbe farlo.


7
-uimposta solo l'upstream, che secondo la domanda, è già impostato. Ha bisogno di set push.defaultper upstremal fine di ottenere pushil rispetto all'impostazione monte, dal momento che per impostazione predefinita solo pullfa.
Brian Campbell,

2
Questo non sembra funzionare - almeno non su mai versioni di git
Thomas Watson il

git branch --set-upstream deve solo essere impostato il pull setup "pushRemote".
wheredidthatnamecomeda

Non penso git branch --set-upstreamsia necessario. Nota: my git --versionè 2.17.1.
Gabriel Staples

15

Il comando di Adam è ora obsoleto. Puoi usare:

git branch --set-upstream-to origin/my_remote_branch my_local_branch

per impostare il ramo a monte di my_local_brancha origin/my_remote_branch.


6
Puoi fornire un link a supporto delle informazioni che condividi su -u sono deprecate? I documenti dell'ultima versione relativa a push su git-scm.com sembrano suggerire che sia attuale. Grazie in anticipo - potrebbe essere molto utile per i lettori seguire per ulteriori informazioni.
Kay V,

Concordo con @KayV, in particolare che ho ricevuto questo messaggio quando ho provato a creare un nuovo ramo remoto con un nome diverso dal mio ramo locale: 'Se stai pianificando di inviare un nuovo ramo locale che seguirà il suo omologo remoto, potresti voler utilizzare "git push -u" per impostare la configurazione upstream mentre si preme ".
FBB,

0

Ecco il processo che ha funzionato per me.

git clone original-repo-url
git remote rename origin upstream
git remote add origin new-repo-url

Ora il tuo nuovo repository sarà "origine" e il repository originale è "a monte". Confermare eseguendo git remote -v. (Nota a margine: l'Upstream viene utilizzato per recuperare dal repository originale, al fine di mantenere la copia locale sincronizzata con il progetto a cui si desidera contribuire, e l'origine viene utilizzata per estrarre e spingere poiché è possibile contribuire al proprio repository).

git push origin master

Ora il master del tuo nuovo repository remoto (su Github) sarà sincronizzato con il master originale, ma non avrà alcun ramo delle funzionalità.

git rebase upstream/branch-name
git push origin master

Rebase è una fusione intelligente. Quindi premere di nuovo su master e vedrai il ramo di funzionalità selezionato come master sul nuovo repository.

Opzionale:

git remote rm upstream
git remote add upstream new-repo-url

0

Ho incontrato lo stesso problema per un po 'di tempo ormai. Finalmente ho una serie di dichiarazioni, quindi non devo farlo git push origin local:remoteogni volta. Ho seguito questi:

git branch --set-upstream-to origin/remote_branch_name
git config push.default upstream
git push

Dopo aver impostato upstream su un ramo remoto con nome diverso (1a riga) e averlo impostato come predefinito (2a riga), la 3a riga ora obbedirà a queste regole e passerà all'upstream impostato.

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.