Che cosa fa esattamente la “u”? “Git push -u origine master” vs “git push origine master”

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 inserito correttamente, aggiungi il riferimento di upstream (tracciamento), usato da git-pull (1) senza argomenti e altri comandi. Per ulteriori informazioni, consultare branch..merge in git-config (1).

Ecco il branch..merge di git config :

branch..merge

Definisce, insieme al branch..remote , il ramo upstream per il ramo specificato. Indica a git fetch / git pull quale branch to merge e può anche influenzare git push (vedi push.default). Quando nel ramo , dice a git fetch il refspec predefinito da marcare per l’unione in FETCH_HEAD. Il valore è gestito come la parte remota di un refspec e deve corrispondere a un ref che viene prelevato dal remoto dato da "branch..remote" . Le informazioni di unione vengono utilizzate da git pull (che in un primo momento chiama git fetch) per cercare il ramo predefinito per l’unione. Senza questa opzione, git pull defaults per unire il primo refspec recuperato. Specifica più valori per ottenere un’unione di polpo. Se si desidera installare git pull in modo che si unisca in da un altro ramo nel repository locale, è ansible puntare il branch..merge al ramo desiderato e utilizzare l’impostazione speciale. (un punto) per il branch..remote .

Ho installato correttamente un repository remoto con github e ho spinto con successo il mio primo commit con:

 git push -u origin master 

Quindi, ho involontariamente spinto con successo il mio secondo commit nel mio repository remoto usando:

 git commit -m '[...]' 

Tuttavia, pensando erroneamente che avrei dovuto spingere di nuovo verso l’ origin dal master , ho eseguito:

 # note: no -u git push origin master 

Cosa ha fatto? Non sembrava avere alcun effetto. Ho “annullato” git push -u origin master ?

La chiave è “argument-less git-pull”. Quando si esegue una git pull da un ramo, senza specificare un remoto o un ramo di origine, git esamina il branch..merge per sapere da dove estrarre. git push -u imposta queste informazioni per il ramo che stai spingendo.

Per vedere la differenza, usiamo un nuovo ramo vuoto:

 $ git checkout -b test 

Per prima cosa, 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 (eg 'git pull  '). 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 =  merge =  [remote ""] url =  fetch =  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 che git pull funzioni come previsto senza specificare il remoto o il ramo.

Aggiornamento: suggerimenti bonus:

  • Come menziona Mark in un commento, oltre a git pull questa impostazione influisce anche sul comportamento predefinito di git push . Se hai l’abitudine di usare -u per acquisire il ramo remoto che intendi monitorare, ti consiglio di impostare il tuo valore di configurazione push.default a upstream .
  • git push -u HEAD sposterà il ramo corrente su un ramo con lo stesso nome su (e imposta anche il tracciamento in modo da poter fare git push dopo).
 git push -u origin master 

Equivale a:

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

Fai l’ultima dichiarazione se dimentichi il -u !

Oppure potresti costringerlo:

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

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

In termini più semplici:

Tecnicamente, il flag -u aggiunge un riferimento di tracciamento al server upstream a cui si sta spingendo.

Ciò che è importante qui è che questo ti permette di fare un git pull senza fornire altri argomenti. Ad esempio, una volta git push -u origin master un git push -u origin master , puoi in seguito chiamare git pull e git saprà che in realtà si trattava di git pull origin master .

Altrimenti, dovresti digitare l’intero comando.

Tutti i comandi necessari di git bash 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 tutti i rami e i loro commit:

 git show-branch