Sincronizzazione e più repo

Fetch, pull e push

Pull

Tre modalità, scelte dal menu a tendina: predefinita, solo fast-forward oppure rebase. Le modifiche locali vengono messe automaticamente in stash e ripristinate attorno al pull, così un albero sporco non ti blocca.

Un branch che non traccia nulla

git pull è un fetch seguito da un merge, e il merge deve sapere in cosa unire — l'upstream del branch. Un branch creato in locale, o preso senza tracking, non ne ha. Il fetch riesce comunque, scorre un lungo elenco di ref origin/* aggiornate, e poi git si ferma con "There is no tracking information for the current branch". Non è stato fatto pull di niente e niente si è rotto: la seconda metà semplicemente non aveva un bersaglio.

Gitcito legge quell'errore e offre la riparazione come pulsante, scegliendo quale in base al fatto che il remoto porti già il branch:

È sul remoto Collega e fai pull — imposta l'upstream su <remoto>/<branch> ed esegue il pull che avevi chiesto. Annullabile con ⌘Z, che toglie di nuovo il tracking.
Non c'è ancora Fai push del branch — un push normale, che imposta l'upstream strada facendo.

Il remoto proposto è origin se c'è, altrimenti il primo dell'elenco. In quale caso ti trovi si legge dalle ref di tracking, non dalla rete: la risposta rispecchia il fetch appena eseguito.

Push

I force push usano sempre --force-with-lease — la variante sicura, che rifiuta se il remote si è mosso da quando hai guardato l'ultima volta. Fare un push forzato su un branch protetto chiede conferma (l'elenco sta nell'ingranaggio delle impostazioni del repository).

La conferma che un branch protetto pretende prima di un force push

Nessun remote

Push, pull e fetch hanno bisogno di una destinazione. Un repository senza nessuno — un git init appena fatto, un clone a cui è stato tolto origin — faceva sì che quei pulsanti non facessero nulla, o che un fetch vuoto contasse come successo. Ora aprono Aggiungi remoto, con un avviso, così puoi incollare un URL o creare il repo sull'host. Aggiungerlo termina l'azione iniziata: un push pubblica il branch corrente, un pull recupera e poi fa pull, un fetch recupera soltanto.

L'auto-fetch in background resta zitto quando non c'è nulla da recuperare. Non apre un dialogo a orologeria.

Più di un remote

Il pulsante Push punta all'upstream del branch. La freccia accanto, quando un repository ha più di un remote, offre anche:

Push su un remote Scegli un singolo remote — un fork, un mirror, una destinazione di deploy
Push su tutti gli N remote Un push per remote, in ordine
Push di tutti i tag su git push <remote> --tags, ogni tag locale in un colpo solo

Le stesse due azioni stanno anche sulla riga di ciascun remote nella barra laterale, che di solito è dove ti trovi quando ti viene la domanda.

Un rifiuto non annulla il resto. Pubblicare su un fork e sul suo upstream è esattamente il caso in cui un lato rifiuta e l'altro dovrebbe comunque passare, quindi ogni remote riferisce separatamente: i successi vengono nominati in un unico toast, e ogni fallimento ne ottiene uno proprio con la motivazione di git.

Solo il primo remote dell'elenco imposta l'upstream del branch. Un branch ha un solo upstream, e l'ultimo remote su cui hai fatto push non è automaticamente quello che vuoi far tracciare.

Entrambe le strade eseguono gli stessi controlli di un push normale — la conferma per il branch protetto e la protezione sui segreti. Pubblicare su due remote è il doppio dell'esposizione, non metà della prudenza.

Branch su cui non sei

git pull muove solo HEAD, ed è per questo che quasi tutti i client ti fanno fare il checkout di un branch prima di poterlo aggiornare. Gitcito no: clic destro su un branch locale — nella sidebar o sul badge nel grafo — e trovi Pulla <branch> e Pusha <branch>, che agiscono su quel branch.

Pulla <branch> Porta in fast-forward la ref locale al suo upstream, senza checkout. Il working tree non viene toccato. Annullabile con ⌘Z: l'undo rimette il branch dov'era.
Pusha <branch> Un push normale di quel branch, con le stesse protezioni per branch protetti e segreti del pulsante in barra.

Il pull è disattivato per un branch che non traccia nulla: non c'è da dove tirare. Sul branch su cui sei, entrambi ricadono sul pull normale, che aggiorna anche il working tree.

Il limite da conoscere: un branch che è divergito dal suo upstream viene rifiutato, con un messaggio che lo dice. Riconciliare una divergenza è un merge o un rebase, e servono entrambi un working tree — quel caso costa ancora un checkout. Il force push di un branch su cui non sei viene offerto quando il remoto rifiuta; la strada "pull e riprova" no, per lo stesso motivo.

Fetch

Fetch ha un pulsante tutto suo nella barra degli strumenti, accanto a Pull. Recupera da ogni remoto e fa prune, così le tue ref origin/* e tutti i contatori avanti/indietro sono aggiornati — e non tocca né il tuo branch né la working tree. È quello da usare quando vuoi vedere cosa hanno fatto gli altri senza muovere il tuo lavoro.

C'è anche un auto-fetch in background a un intervallo che imposti tu (Impostazioni → Generali). Passa il mouse sul pulsante Fetch e l'età compare sotto — 4 min fa — in ambra appena un fetch supera i quindici minuti. Non occupa mai spazio nella barra, perché risponde a una domanda che ti fai solo mentre allunghi la mano verso il pulsante. Si legge da FETCH_HEAD, quindi un git fetch lanciato in un terminale conta come uno lanciato qui.

Un fetch che trova storia riscritta lo dice: un toast nomina il branch, e la sua riga guadagna un marcatore che apre cos'è cambiato da esattamente al commit che puntava prima.

Molti repository insieme

  • Una scheda di gruppo può fare Fetch su tutti / Pull su tutti per l'intero sottoalbero.
  • Mission control lo fa su tutta l'area di lavoro, e può fare pull solo sui repository che sono davvero indietro.

Remote

Aggiungi, modifica, rimuovi e recupera i singoli remote dalla barra laterale. Le righe dei branch portano badge di presenza per remote, così vedi a colpo d'occhio quali remote hanno una copia di un branch.

Fetch, pull o push senza remote apre lo stesso dialogo Aggiungi remoto, invece di riuscire a vuoto. Vedi fetch, pull e push.

Vedi anche: Mission control · Hosting e pull request

Migliora questa traduzione su GitHub