Finora abbiamo parlato di Git come un sistema che funziona principalmente sulla nostra macchina. È vero però che Git è un sistema che offre il meglio di sé quando usiamo server remoti per gestire il nostro lavoro, magari da più postazioni. Ci vengono subito in mente due piattaforme principali si social coding: una è GitHub che è il regno dell’open source e l’altra è BitBucket che è sicuramente molto diffusa per quanto riguarda la gestione dei repository di lavoro privati. Queste due piattaforme offrono gratuitamente il primo approccio ad un sistema remoto per usare Git fin da subito, anche per sperimentare.
Ciò non toglie che quando lo riterrete necessario potrete installare Git su un server privato in tutta autonomia! Esistono molte altre aziende che offrono l’hosting Git, più o meno gratuito e con svariate funzionalità aggiuntive.
Quando Git è stato creato, oramai più di 10 anni fa, il suo scopo principale fu quello di ospitare lo sviluppo del kernel Linux, un progetto che unisce centinaia di sviluppatori da tutto il mondo. Oggi il progetto è hostato su GitHub. Abbiamo già visto come clonare un repository Git in una precedente lezione, ora vediamo come sincronizzare il nostro lavoro locale con il repository remoto.
Visualizzare i server remoti
Ogni repository può avere dei server remoti che fungono da sorgenti/destinazioni. Per visualizzare quali sono, basta eseguire il comando git remote -v :
$ git remote -v origin https://lucamurante@bitbucket.org/macrubato3.git (fetch) origin https://lucamurante@bitbucket.org/macrubato3.git (push)
Nel nostro caso, stiamo utilizzando un repository privato ospitato su BitBucket. Possiamo notare che i server hanno un nome (origin) e un URL che può essere http o ssh a seconda del sistema. Sono inoltre divisi in (fetch) e (push) . Quelli abilitati al push permettono l’invio di modifiche, mentre fetch significa che possiamo scaricare dati da quel server. I server remoti in Git servono come riferimento per le azioni che facciamo su quel repository, questo vuol dire che non siamo continuamente collegati ad essi: è il bello di Git!
Aggiungere o rimuovere un repository remoto
Per aggiungere una connessione ad un repository remoto, utilizziamo il comando
git remote add <nome> <url>
Il <nome> che diamo al server ci servirà per avere una scorciatoia per altri comandi, come quello per rimuovere un server:
git remote rm <nome>
Consiglio: spesso i sistemi di social coding come BitBucket forniscono questo comando già pronto da incollare ed eseguire.
git fetch
Questo comando scarica i commit dal server remoto senza intaccare il lavoro in locale. Quando eseguiamo git fetch , i commit remoti vengono salvati come un ramo remoto (remote branch) e non vanno ad intaccare i branch locali. Questo comando ci serve, nella maggior parte dei casi per guardare lo stato del progetto. Difatti, se volessimo integrare il lavoro remoto nel nostro repository locale, dovremmo eseguire un comune git merge . I rami remoti sono quindi un metodo sicuro che non intacca i nostri file in locale. Per scaricare tutti i rami remoti usiamo il comando
git fetch <remote>
In alternativa possiamo indicare esplicitamente un ramo per scaricare solo quello:
git fetch <remote> <ramo>
git pull
Fare il merge di codice remoto nel repository locale è uno dei task più diffusi per chi lavora con Git in modo collaborativo. Abbiamo già visto git fetch , che può essere seguito da git merge . Il comando git pull li unisce in un unico comando:
git pull <remote>
Scarica la copia remota del ramo attuale e ne effettua immediatamente il merge con quello locale. Questo è il modo principale per sincronizzare la copia locale del repository con quello generale remoto. È la base del social coding ed è il pattern di collaborazione più diffuso.
git push
Quando abbiamo fatto diversi commit e siamo pronti per caricare il nostro lavoro sul repository remoto, dobbiamo lanciare il comando git push. È un po’ la controparte del comando git fetch e va usato in modo analogo:
git push <remote> <ramo>
Questo trasferisce tutti i commit locali che ancora non sono presenti nel server remoto. Piccolo consiglio: se abbiamo creato dei tag, essi non vengono automaticamente spediti al repository remoto, ma dobbiamo farlo esplicitamente con l’opzione –tags:
git push <remote> --tags