<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
```
::::
Aquest lloc web utilitza galetes per millorar l'experiència de l'usuari