Mercoledì, 10 Luglio 2013 00:00

Memento per collaborare su Github

Scritto da
Vota questo articolo
(0 Voti)

Collaborare su github è molto stimolante! Collaborare bene e usare github appieno è...semplice se sai come farlo!

Il primo passo per collaborare su github è creare un fork del progetto al quale si intende partecipare. Una volta effettuato il fork su github è necessario farne il clone sul proprio computer. Facciamo un esempio partendo dal repository per la documentazione italiana di symfony garak/symfony-docs-it. Il mio fork è lucasaba/symfony-docs-it.

luca@ermes:~/workspace$ git clone Questo indirizzo email è protetto dagli spambots. È necessario abilitare JavaScript per vederlo.:lucasaba/symfony-docs-it.git
Cloning into 'symfony-docs-it'...
remote: Counting objects: 5974, done.
remote: Compressing objects: 100% (2689/2689), done.
remote: Total 5974 (delta 3366), reused 5725 (delta 3238)
Ricezione degli oggetti: 100% (5974/5974), 6.88 MiB | 923 KiB/s, done.
Risoluzione dei delta: 100% (3366/3366), done.
luca@ermes:~/workspace$

Fin qui la parte semplice. Entrando dentro il mio nuovo repository, posso vedere alcune informazioni:


luca@ermes:~/workspace$ cd symfony-docs-it/ luca@ermes:~/workspace/symfony-docs-it$ git branch * 2.2 luca@ermes:~/workspace/symfony-docs-it$ git remote -v origin Questo indirizzo email è protetto dagli spambots. È necessario abilitare JavaScript per vederlo.:lucasaba/symfony-docs-it.git (fetch) origin Questo indirizzo email è protetto dagli spambots. È necessario abilitare JavaScript per vederlo.:lucasaba/symfony-docs-it.git (push) luca@ermes:~/workspace/symfony-docs-it$

Da qui si evince che ho due aree di lavoro: una ramo locale che si chiama 2.2 ed un repository remoto che si chiama origin. Mi manca ancora un riferimento al repository originale. Questo repository lo chiamerò, di norma, upstream.

luca@ermes:~/workspace/symfony-docs-it$ git remote add upstream Questo indirizzo email è protetto dagli spambots. È necessario abilitare JavaScript per vederlo.:garak/symfony-docs-it.git
luca@ermes:~/workspace/symfony-docs-it$ git remote -v
origin	Questo indirizzo email è protetto dagli spambots. È necessario abilitare JavaScript per vederlo.:lucasaba/symfony-docs-it.git (fetch)
origin	Questo indirizzo email è protetto dagli spambots. È necessario abilitare JavaScript per vederlo.:lucasaba/symfony-docs-it.git (push)
upstream	Questo indirizzo email è protetto dagli spambots. È necessario abilitare JavaScript per vederlo.:garak/symfony-docs-it.git (fetch)
upstream	Questo indirizzo email è protetto dagli spambots. È necessario abilitare JavaScript per vederlo.:garak/symfony-docs-it.git (push)
luca@ermes:~/workspace/symfony-docs-it$

Ricapitolando: ho un ramo di sviluppo (2.2), un mio repository (origin) e il repository principale del progetto (upstream).

Per tenere allineata il proprio spazio di lavoro con il repository originale, si usano i seguenti comandi:

luca@ermes:~/workspace/symfony-docs-it$ git fetch upstream
remote: Counting objects: 162, done.
remote: Compressing objects: 100% (80/80), done.
remote: Total 123 (delta 88), reused 77 (delta 43)
Ricezione degli oggetti: 100% (123/123), 30.05 KiB, done.
Risoluzione dei delta: 100% (88/88), completed with 31 local objects.
Da github.com:garak/symfony-docs-it
 * [nuovo branch]    2.0        -> upstream/2.0
 * [nuovo branch]    2.1        -> upstream/2.1
 * [nuovo branch]    2.2        -> upstream/2.2
 * [nuovo branch]    2.3        -> upstream/2.3
 * [nuovo branch]    master     -> upstream/master
luca@ermes:~/workspace/symfony-docs-it$ git rebase upstream/2.2
First, rewinding head to replay your work on top of it...
Fast-forwarded 2.2 to upstream/2.2.
luca@ermes:~/workspace/symfony-docs-it$

Il comando fetch upstream scarica tutti gli eventuali aggiornamenti da upstream. Il comando rebase upstream/2.2 aggiorna il mio ramo locale 2.2 con tutte le eventuali modifiche effettuate su upstream. Si noti che il comando fetch upstream ha registrato la presenza dei rami di upstream. Per aggiornare un ramo differente dall'attuale con le modifiche di upstream, si procede come segue:

luca@ermes:~/workspace/symfony-docs-it$ git checkout -b 2.0 upstream/2.0
Branch 2.0 set up to track remote branch 2.0 from upstream.
Switched to a new branch '2.0'
luca@ermes:~/workspace/symfony-docs-it$ git branch
  2.2
* 2.0
luca@ermes:~/workspace/symfony-docs-it$

Il comando crea un ramo 2.0 locale che contiene il codice di upstream/2.0.

Supponiamo di voler fare una modifica sul ramo 2.0. A questo punto dovremo creare un nuovo ramo a partire dal 2.0:

luca@ermes:~/workspace/symfony-docs-it$ git status
# Sul branch 2.2
nothing to commit, working directory clean
luca@ermes:~/workspace/symfony-docs-it$ git log -n 1
commit 43a5e9ec9a0fe06f9539b41fc009df7d189b90cc
Author: Massimiliano Arione <###@gmail.com>
Date:   Tue Jul 9 15:07:24 2013 +0200

    fix minore
luca@ermes:~/workspace/symfony-docs-it$ git checkout 2.0
Si è passati al branch '2.0'
luca@ermes:~/workspace/symfony-docs-it$ git log -n 1
commit 49cc6584b4e29c888e9219a7fc7041997ce2cb50
Author: Massimiliano Arione <###@gmail.com>
Date:   Thu Dec 13 13:52:14 2012 +0100

    correzioni su 2.0

Giusto per test, controllo i log di git sui rami 2.0 e 2.3. Ora, a partire dal ramo 2.0 faccio un nuovo ramo sul quale andrò a fare le mie modifiche:

luca@ermes:~/workspace/symfony-docs-it$ git checkout -b modifica-su-2.0
Switched to a new branch 'modifica-su-2.0'
luca@ermes:~/workspace/symfony-docs-it$ git log -n 1
commit 49cc6584b4e29c888e9219a7fc7041997ce2cb50
Author: Massimiliano Arione <###@gmail.com>
Date:   Thu Dec 13 13:52:14 2012 +0100

    correzioni su 2.0
luca@ermes:~/workspace/symfony-docs-it$

Il comando git log -n 1 è servito solo a verificare che il nuovo ramo si basi effettivamente sul ramo upstream/2.0. Si può procedere a questo punto con le modifiche.

Una volta terminate le modifiche è necessario verificare che il proprio ramo di sviluppo (modifica-su-2.0) sia al passo con il il ramo upstream/2.0. Per fare questo sarà necessario fare un nuovo fetch dell'upstream e, sucessivamente, fare il merge delle eventuali modifiche:

luca@ermes:~/workspace/symfony-docs-it$ git fetch upstream
remote: Counting objects: 14, done.
remote: Compressing objects: 100% (2/2), done.
remote: Total 8 (delta 6), reused 8 (delta 6)
Unpacking objects: 100% (8/8), done.
Da github.com:garak/symfony-docs-it
43a5e9e..67ace03 2.2 -> upstream/2.2
98fbded..d999e87 2.3 -> upstream/2.3
luca@ermes:~/workspace/symfony-docs-it$ git rebase upstream/2.0
Current branch modifica-su-2.0 is up to date.
luca@ermes:~/workspace/symfony-docs-it$

In questo il ramo modifica-su-2.0 era aggiornato. Ma sono intervenute modifiche sui rami 2.2 e 2.3. Perciò ne approfitto per aggiornare i miei rami.

luca@ermes:~/workspace/symfony-docs-it$ git checkout 2.2
Si è passati al branch '2.2'
luca@ermes:~/workspace/symfony-docs-it$ git rebase upstream/2.2
First, rewinding head to replay your work on top of it...
Fast-forwarded 2.2 to upstream/2.2.
luca@ermes:~/workspace/symfony-docs-it$ git push origin 2.2
Counting objects: 9, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (5/5), done.
Writing objects: 100% (5/5), 489 bytes, done.
Total 5 (delta 4), reused 0 (delta 0)
To Questo indirizzo email è protetto dagli spambots. È necessario abilitare JavaScript per vederlo.:lucasaba/symfony-docs-it.git
   43a5e9e..67ace03  2.2 -> 2.2
luca@ermes:~/workspace/symfony-docs-it$

Ritorniamo al nostro ramo modifica-su-2.0. Buona norma è fare lo squash, ovvero comprimere, i vari commit del proprio ramo in uno unico. Il comando per fare lo squash dei commit è:

git rebase -i HEAD~4

Dove 4, in questo caso, è il numero dei commit da squashare.

Una volta fatto tutto questo non ci rimane che inviare il nuovo ramo su origin:

luca@ermes:~/workspace/symfony-docs-it$ git push origin modifica-su-2.0 
Total 0 (delta 0), reused 0 (delta 0)
To Questo indirizzo email è protetto dagli spambots. È necessario abilitare JavaScript per vederlo.:lucasaba/symfony-docs-it.git
 * [new branch]      modifica-su-2.0 -> modifica-su-2.0
luca@ermes:~/workspace/symfony-docs-it$

In origin verrà creato un nuovo ramo modifica-su-2.0 a partire dal quale, tramite l'interfaccia di Github, potremo richiedere un pull request del nostro codice sul ramo 2.0 di upstream.
Quando e se il nostro PR verrà accettato, per aggiornare il nostro repository, dovremo fare il fetch upstream, il rebase in locale e il push origin 2.0. A questo punto tutti i repository saranno aggiornati.

Riassumendo:

  • git fetch upstream - aggiorna le informazioni da upstream
  • git checkout -b 2.0 upstream/2.0 - crea un nuovo branch basandosi sul codice di upstream
  • git push origin modifica-su-2.0 - crea un nuovo ramo in origin a partire da un ramo locale
  • git rebase upstream/2.0 - aggiorna il codice locale con le modifiche avvenute su di un ramo di upstream (possibili conflitti tra il ramo locale e il ramo di upstream)
Letto 20695 volte Ultima modifica il Venerdì, 13 Dicembre 2013 23:28

Lascia un commento

Assicurati di aver digitato tutte le informazioni richieste, evidenziate da un asterisco (*). Non è consentito codice HTML.

Login Form