Git merge e rebase

Da Andreabont's Wiki.

Dati due branch aventi un commit antenato comune, il problema è fonderli in un unico branch che condivida le modifiche di entrambi rispetto a questo antenenato comune. (Non sempre è un procedimento indolore)
Prendiamo ad esempio i due branch master e devel:

       A---B---C devel
      /
 D---E---F---G master

Il nostro commit in comune è, evidentemente, E. A questo punto possiamo utilizzare due strategie diverse.

Merge

Questo procedimento prende le modifiche avvenute tra la base comune e un commit dato (di solito l'ultimo commit di un branch che si vuole unire) e le si applica ad un altro branch creando un nuovo commit apposito chiamato merge commit.

git checkout master
git merge devel

Oppure

git merge devel master

Nel nostro esempio sarà creato il merge commit H che applicherà le modifiche effettuate in devel al branch master.

       A---B---C devel
      /         \
 D---E---F---G---H master

Strategie di merge

E' possibile risolvere automaticamente i conflitti sui file mantenendo la versione del branch remoto oppure locale.

git merge -X theirs devel # Remoto
git merge -s ours devel   # Locale

Rebase

Questo metodo è completamente differente e consiste nello "spostare" il commit comune in avanti fino all'ultimo commit di un branch. In questo modo viene mantenuta la cronologia.

git checkout devel
git rebase master

Nel nostro esempio sposteremo il commit comune da E a G (ultimo commit del branch master), e applicheremo quindi al branch devel le modifiche portate dai commit F e G:

               A---B---C devel
              /
 D---E---F---G master