<div class="page"> <div class="cover text-center"> <img class="mx-auto" src=/itb/images/logo_mislata.png alt="logo"> # GitFlow i squash <div class="text-end fit-content ms-auto my-3 mt-auto pt-3"> <p><strong>Autor:</strong> Joan Puigcerver Ibáñez</p> <p><strong>Correu electrònic:</strong> j.puigcerveribanez@edu.gva.es</p> <p><strong>Curs:</strong> 2024/2025</p> </div> <div> <p class="fw-bold mb-0">Llicència: BY-NC-SA</p> <p class="d-none d-md-block">(Reconeixement - No Comercial - Compartir Igual)</p> <a href="https://creativecommons.org/licenses/by-nc-sa/4.0/deed.ca" target="_blank"> <img class="mx-auto" src="/itb/images/license.png" alt="Licence"/> </a> </div><!--license--> </div><!--cover--> </div><!--page--> {:toc} ## Introducció A __GitFlow__, les branques `feature` es creen a partir de la branca `develop` i es tornen a fusionar amb aquesta quan s'han completat. En el material anterior, hem vist com es pot mantindre una història linial neta i ordenada utilitzant `rebase` i `merge`. ```mermaid --- title: Example GitFlow amb rebase i merge --- %%{init: { 'theme': 'forest' } }%% gitGraph commit id:"0" branch develop branch feature/one checkout feature/one commit id:"1" commit id:"3" checkout develop merge feature/one branch feature/two checkout feature/two commit id:"4" commit id:"2" checkout develop merge feature/two checkout main merge develop ``` Aquesta tècnica és útil per mantenir una història neta i ordenada, però en ocasions, pot passar que una branca de funcionalitat conté molts _commits_ xicotets que no aporten informació rellevant a la història del projecte. En aquest cas, es pot utilitzar la tècnica __`squash`__ per combinar tots els canvis realitzats en una branca en un únic commit. ## Squash __`merge squash`__ és una manera de realitzar un `merge`, que consisteix en combinar tots els commits realitzats en una branca en un __únic commit__. Es pot fer un `squash` amb l'ordre: ``` git merge --squash <branch> ``` Aquesta tècnica és útil si volem conservar la història neta i concisa, sense emmagatzemar commits que no aporten informació rellevant. Per exemple, si tenim una _branca de funcionalitat_ que conté molts _commits_ xicotets, podem agrupar-los en un únic commit amb una descripció més general dels canvis realizats. D'aquesta manera és més fàcil seguir la història del projecte. Aquesta tècnica també es útil quan es crea una __Pull Request__, ja que ens ajuda a proporcionar una vista més concisa dels canvis realitzats en una branca, sense haver de incloure tots els commits de manera individual. No obstant, quan realitzes un `squash`, es perd l'historial dels _commits_ realitzats en la branca, ja que tots els canvis es combinen en un únic commit. :::: example En aquest cas, tenim dues branques de funcionalitat `feature/A` i `feature/B` que volem fusionar amb la branca `develop`. S'utilitza `merge --squash` per combinar tots els _commits_ realitzats en cada branca en un únic commit a la branca `develop`. Una vegada fusionades les branques `feature/*` es poden eliminar, ja que ja no són necessàries. ::: info - El _commit_ __Merged feature/A__ conté tots els canvis realitzats en la branca `feature/A`. - El _commit_ __Merged feature/B__ conté tots els canvis realitzats en la branca `feature/B`. ::: ```mermaid --- title: Example GitFlow amb squash --- %%{init: { 'theme': 'forest' } }%% gitGraph commit id:"0" branch develop branch feature/A branch feature/B checkout feature/A commit id:"1" checkout feature/B commit id:"2" checkout feature/A commit id:"3" checkout feature/B commit id:"4" checkout develop commit id:"Merged feature/A" commit id:"Merged feature/B" checkout main merge develop ``` :::: ## Resolució de conflictes Quan es realitza un `merge --squash`, es poden produir conflictes. A GitFlow es considera una bona pràctica __no resoldre els conflictes a la branca `develop`__, per tant, hauríem de resoldre els conflictes a la branca de funcionalitat i després fusionar-la amb `develop`. Per fer-ho, tenim dues alternatives: - `rebase`: Canviar la base de la branca de funcionalitat a `develop` i resoldre els conflictes. :::: example En aquest cas, s'ha realitzat un `rebase` de la branca `feature/B` amb la branca `develop` per resoldre els conflictes. ```mermaid --- title: Resolució de conflictes amb rebase i squash --- %%{init: { 'theme': 'forest' } }%% gitGraph commit id:"0" branch develop branch feature/A checkout feature/A commit id:"1" commit id:"3" checkout develop commit id:"Merged feature/A" branch feature/B checkout feature/B commit id:"2" commit id:"4" checkout develop commit id:"Merged feature/B" checkout main merge develop ``` :::: - `merge`: Fusionar la branca `develop` amb la branca de funcionalitat i resoldre els conflictes. :::: example En aquest cas, s'ha realitzat un `merge` de la branca `develop` a `feature/B` per resoldre els conflictes. ```mermaid %%{init: { 'theme': 'forest' } }%% gitGraph commit id:"0" branch develop branch feature/A branch feature/B checkout feature/A commit id:"1" checkout feature/B commit id:"2" checkout feature/A commit id:"3" checkout feature/B commit id:"4" checkout develop commit id:"Merged feature/A" checkout feature/B merge develop id: "Resolució de conflictes" checkout develop commit id:"Merged feature/B" checkout main merge develop ``` ::::