Cosa fa esattamente la "u"? "Git push -u origin master" vs "git push origin master"


335

Sono apparentemente terribile nell'usare git, nonostante i miei migliori tentativi di capirlo.

Da kernel.org per git push:

-u

--set-monte

Per ogni ramo aggiornato o inviato correttamente, aggiungi il riferimento upstream (tracking), usato da git-pull (1) senza argomenti e altri comandi. Per ulteriori informazioni, vedere branch.<name>.mergein git-config (1).

Ecco branch.<name>.mergeda git config:

branch.<name>.merge

Definisce, insieme a branch.<name>.remote, il ramo a monte per il ramo dato. Indica a git fetch / git pull quale ramo unire e può anche influenzare git push (vedi push.default). In branch <name>, dice a git fetch il refspec predefinito da contrassegnare per l'unione in FETCH_HEAD. Il valore viene gestito come la parte remota di un refspec e deve corrispondere a un riferimento che viene recuperato dal telecomando fornito da "branch.<name>.remote". Le informazioni di unione vengono utilizzate da git pull (che inizialmente chiama git fetch) per cercare il ramo predefinito per l'unione. Senza questa opzione, git pull ha come impostazione predefinita unire il primo refspec recuperato. Specificare più valori per ottenere un'unione di polpo. Se desideri configurare git pull in modo che si fonda <name>da un altro ramo nel repository locale, puoi puntarebranch.<name>.mergeal ramo desiderato e utilizzare l'impostazione speciale. (un periodo) per branch.<name>.remote.

Ho configurato correttamente un repository remoto con github e ho inviato con successo il mio primo commit con:

git push -u origin master

Quindi, inconsapevolmente, ho inviato il mio secondo commit al mio repository remoto usando:

git commit -m '[...]'

Tuttavia, pensando erroneamente che avrei dovuto spingere di nuovo originda a master, ho corso:

# note: no -u
git push origin master

Che cosa ha fatto? Non sembrava avere alcun effetto. Ho "annullato" git push -u origin master?


45
I'm apparently terrible at using git, despite my best attempts to understand it.- Non ho mai avuto qualcuno che mi ricreasse così bene.
Do

Risposte:


336

La chiave è "git-pull senza argomenti". Quando fai un git pullda un ramo, senza specificare un telecomando o un ramo di origine, git osserva l' branch.<name>.mergeimpostazione per sapere da dove estrarre. git push -uimposta queste informazioni per il ramo che stai spingendo.

Per vedere la differenza, usiamo un nuovo ramo vuoto:

$ git checkout -b test

Innanzitutto, spingiamo senza -u:

$ git push origin test
$ git pull
You asked me to pull without telling me which branch you
want to merge with, and 'branch.test.merge' in
your configuration file does not tell me, either. Please
specify which branch you want to use on the command line and
try again (e.g. 'git pull <repository> <refspec>').
See git-pull(1) for details.

If you often merge with the same branch, you may want to
use something like the following in your configuration file:

    [branch "test"]
    remote = <nickname>
    merge = <remote-ref>

    [remote "<nickname>"]
    url = <url>
    fetch = <refspec>

See git-config(1) for details.

Ora se aggiungiamo -u:

$ git push -u origin test
Branch test set up to track remote branch test from origin.
Everything up-to-date
$ git pull
Already up-to-date.

Si noti che le informazioni di tracciamento sono state impostate in modo da git pullfunzionare come previsto senza specificare il telecomando o il ramo.

Aggiornamento: suggerimenti bonus:

  • Come Mark menziona in un commento, oltre a git pullquesta impostazione influisce anche sul comportamento predefinito di git push. Se hai l'abitudine di utilizzare -uper acquisire il ramo remoto che intendi tracciare, ti consiglio di impostare il push.defaultvalore di configurazione su upstream.
  • git push -u <remote> HEADspingerà il ramo corrente su un ramo con lo stesso nome <remote>(e imposterà anche il monitoraggio in modo da poterlo fare git pushsuccessivamente).

4
git push <remote> <branch>rende le cose inequivocabili . Se si lascia il telecomando o Branch Git ricade sulle impostazioni di configurazione del ramo, che sono impostate per voi git push -u.
dahlbyk,

2
@dahlbyk Sono andato avanti e ti ho indicato come risposta, ma quel commento mi confonde in qualche modo. Nella tua risposta, hai dimostrato che git era confuso dopo git push origin test(che non ha -u). Hai quindi mostrato che git push -u origin test rimuove l'ambiguità. C'è un errore di battitura o sto solo diventando di nuovo denso?
ClosingCowboy,

1
Penso che stiamo parlando l'un l'altro. :) Quando dico git push <remote> <branch>non è ambiguo, intendo quello relativo al git pushquale si basa sulla configurazione del ramo. Allo stesso modo, git pull <remote> <branch>è inequivocabile e git pullsi basa sulla configurazione del ramo. Dopo aver premuto -u, entrambi git pushe git pullfunzioneranno come previsto.
dahlbyk,

10
@dahlbyk: la tua risposta va bene, ma nei tuoi commenti sopra ripeti un malinteso comune su git push- a meno che non ti imposti push.default, git pushusi solo la configurazione del ramo a monte per decidere su quale telecomando premere, non il ramo remoto da aggiornare.
Mark Longair,

1
La migliore pratica per git è git push origin mastere la stessa per l'altro lato IE. git pull origin master.. Quindi, se supponiamo che il ramo cambi, allora puoi git push origin branch_namee lo stesso con l'altro lato IE. git pull origin branch_name
Arpit Vaishnav,

87
git push -u origin master

… equivale a:

git push origin master ; git branch --set-upstream master origin/master

Fai l'ultima affermazione, se dimentichi il -u!

Oppure potresti forzarlo:

git config branch.master.remote origin
git config branch.master.merge refs/heads/master

Se lasci che il comando lo faccia per te, sceglierà i tuoi errori come se scrivessi un ramo inesistente o no git remote add; anche se potrebbe essere quello che vuoi. :)


1
BTW masterè solo un esempio :)
sabgenton,

Ok il secondo bit è ormai svalutato nelle versioni più recenti di: git branch master -u origin/masteri dettagli @ stackoverflow.com/a/2286030/790359
sabgenton

2
Se si dimentica di utilizzare l' -uopzione, digitare git push -uimmediatamente sarà OK.
zeekvfu,

1
Le versioni più recenti di git indicano che --setup-upstreamsaranno deprecate: The --set-upstream flag is deprecated and will be removed. Consider using --track or --set-upstream-to
Bill Hoag,

--set-upstream è deprecato, ora funziona:git branch --set-upstream-to=origin/master master
Alberto Perez,

43

In termini più semplici:

Tecnicamente, il -uflag aggiunge un riferimento di tracciamento al server upstream a cui stai spingendo.

Ciò che è importante qui è che questo ti consente di fare un git pullsenza fornire ulteriori argomenti. Ad esempio, una volta fatto un git push -u origin master, puoi in seguito chiamare git pulle git saprà che in realtà intendevi git pull origin master.

Altrimenti, dovresti digitare l'intero comando.


1
Quindi, se imposto la -ubandiera su orgin masterogni tiro successivo, si riferirà ad esso. E se voglio cambiare il git pullcomportamento che dovrei eseguire git push -u origin some_other_branche git pullora farò riferimento some_other_branch? Grazie!
Toma Tomov,

1
possiamo anche usare "git push" invece di "git push origin master"?
cegprakash,

Sì, puoi @cegprakash. Tuttavia, avresti inizialmente fatto ungit push -u origin master
Adépòjù Olúwáségun

-11

Tutti i comandi git bash necessari per spingere e tirare in Github:

git status 
git pull
git add filefullpath

git commit -m "comments for checkin file" 
git push origin branch/master
git remote -v 
git log -2 

Se vuoi modificare un file, allora:

edit filename.* 

Per vedere tutte le filiali e i loro commit:

git show-branch

4
Penso che tu abbia risposto al di fuori della portata della domanda.
Adépòjù Olúwáségun,
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.