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)