====== Git Merge ====== El //merge// és la operació més delicada quan parlem de [[Git]] i de qualsevol [[VCS]]. Us poso unes instruccions útils per comprovar els canvis en les branques a combinar, abans de que es barregi el codi i doni possibles conflictes. De fet, encara que no hi hagi conflictes sempre és delicat barrejar codi, i convé revisar tots els canvis que s'estan introduint a la branca ''main'' o de integració. {{tag> #Daw #DawMp08 #DawMp08Uf4 #DawMp08Uf04 #DawMp05 #DawMp05Uf2 #DawMp05Uf02 #Dam #DamMp05 #DamMp05Uf2 #DamMp05Uf02 #Ciber #CiberMp03 #Ceti #CetiMp03 git cvs vcs versions subversion svn DevOps }} ===== Què és un merge o fusió de branques? ===== En un sistema de control de versions o [[VCS]] es solen fer branques per evitar que les modificacions de diversos developers o equips interfereixin les unes amb les altres. Es sol fer una branca per resoldre un error o //bug// (//hotfix//) o per implementar una funcionalitat (//feature//). Un cop resolt, es fa un //merge// o fusió entre la branca escindida i la branca de integració. {{ https://ioc.xtec.cat/materials/FP/Recursos/ActivityUtil/documents_fp_docencia_activitats_cib_m03_cib_m03_u2/documents_fp_docencia_activitats_cib_m03_cib_m03_u2_cib_m03_u2l1_oa1_2/img/fpce/cib/m03/u2/a1/cib_m03_u2_006_n2.png?400 }} El moment de fusionar el codi és delicat. Pot donar conflicte (una línia en la que hi ha canvis en les 2 branques a fusionar). I si no dona conflicte, la barreja de codi pot provocar errors en funcionalitats abans resoltes. **Conclusió: sempre s'ha de revisar quins seran els canvis abans de fer el //merge//.** \\ ===== Comprovar els canvis ===== Posem que tenim la branca ''main'' i en derivem una altra branca de nom ''feature''. ==== Comparar branques directament ==== Comprovar els canvis és senzill amb aquesta instrucció: $ git diff main...feature O equivalent: $ git diff $(git merge-base main feature) feature \\ ==== Alternativa: fer un merge sense commit ==== Assegura’t d’estar a la branca destí ''main'' i que l’arbre de treball estigui net: $ git checkout main $ git merge --no-commit --no-ff feature Els paràmetres son: * ''--no-commit'': no fa el commit automàtic. * ''--no-ff'': força un merge commit encara que es pogués fer fast-forward, perquè puguis veure’l. Ara inspecciona: $ git status # veure fitxers modificats i conflictes $ git diff --cached # canvis que s'afegirien al merge commit $ git diff --cached --stat # resum de fitxers i línies $ git diff # canvis no staged (si n'hi ha) Si hi ha conflictes, ''git status'' mostrarà ''Unmerged paths'' i ''git diff'' et mostrarà els marcadors de conflicte. Quan ja ho hagis vist, desfés-ho tot: $ git merge --abort O bé, si no hi ha conflictes i vols confirmar el merge, simplement: $ git commit \\ ===== Efectuar els canvis sobre la branca d'integració o main =====