Git Forking Workflow

Intro

Nel modello di sviluppo fork-based gli sviluppatori, invece di farsi un proprio branch sul repository principale, effettuano una fork dell'intero repository sul proprio account di GitHub, su cui andranno a pushano le modifiche. Quando poi si vogliono integrare le proprie modifiche dal proprio repository GitHub a quello principale, si andra' ad effettuare una pull request da interfaccia web. NB: questo vale sia per i contributori esterni, sia per qualsiasi core developer.

Di seguito descriveremo dettagliatamente i passaggi da effettuare per Gasista Felice.

Fork

Dopo aver effettuato l'accesso su Github, andare sul seguente repository da browser: https://github.com/befair/gasistafelice e cliccare su “Fork”.

Fatto questo, il repository gasistafelice apparirà sulla propria pagina personale di Github.

Cambiare i riferimenti di origin all'interno del file di config (.git/config) nel seguente modo:

[remote "origin"]
url = git@github.com:tuo_nick_github/gasistafelice.git
fetch = +refs/heads/*:refs/remotes/origin/*

Aggiungendo un nuovo remote che punta al repository ufficiale:

[remote "upstream"]
url = git@github.com:befair/gasistafelice.git
fetch = +refs/heads/*:refs/remotes/origin/*

Mi posiziono all'interno del master del mio repository in locale.

$ git checkout master

Effettuo un merge del mio branch master con quello del repository ufficiale (upstream → git@github.com:befair/gasistafelice.git)

$ git pull upstream master

Mi sposto sul mio branch in locale di sviluppo (in questo caso, my-dev-branch)

$ git checkout my-dev-branch

Effettuo un rebase (un import) del mio branch (my-dev-branch) con il master, quindi: - importo le nuove modifiche del master - riapplico i miei commit piu' recenti dopo quelli importati dal master

$ git rebase master

In caso di problemi fixare a mano eventuali conflitti, come segnalato (e come si fa normalmente).

$ git push origin my-dev-branch:master

Effettuo un push di my-dev-branch sul branch master di origin (origin → git@github.com:tuo_nick_github/gasistafelice.git) In questo modo pusherò il mio branch di sviluppo sul mio repository online.

Pull Request

Per effettuare una PULL REQUEST bisogna andare sul repository ufficiale (befair/gasistafelice.git) e cliccare su “Pull Request” dal menù a destra. Ci verrà chiesto di selezionare su quale branch del repository effettuare la request.

Nota: Se la pull request non viene integrata subito e vengono fatte altre modifiche in upstream (repository principale) incompatibili con la pull request (ad esempio se vengono modificati gli stessi file), lo sviluppatore dovra' fare nuovamente il rebase:

$ git checkout master
$ git pull upstream master
$ git checkout my-dev-branch
$ git rebase master
(risolvo conflitti e ricommitto, come suggerisce Git stesso)

Di conseguenza, se ora rieffettiamo la push verso l'origin (il proprio repository forkato):

$ git push origin my-dev-branch:master

Viene riportato un conflitto, e bisognera' aggiungere –force per forzare l'operazione:

$ git push origin my-dev-branch:master --force

A questo punto, rieffettuare la pull request

Appendice: chiavi SSH per accesso su GitHub

Generare una chiave SSH:

$ ssh-keygen -t rsa -b 4096

Stampare (e copiare) la chiave pubblica appena generata (in genere):

$ cat ~/.ssh/id_rsa.pub

Dall'interfaccia di Github, aggiungere la chiave appena copiata alle proprie chiavi SSH. In questo modo si evitera' di dover digitare nick/password ogni qualvolta si vuole fare una push sul proprio repository.