<div class="page">
<div class="cover text-center">
<img class="mx-auto" src=/itb/images/logo_mislata.png alt="logo">
# 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ó
Fins aquest moment, hem utilitzat l'eina `merge` per fusionar dues branques. També hem utilitzat `rebase` per canviar la base d'una branca
i poder incorporar canvis d'aquesta manera. A més, si combinem les dues eines, es poden fusionar branques __mantenint una història lineal__.
No obstant això, aquestes no són les uniques maneres de fusionar o incorporar canvis d'una branca a una altra.
En aquest material veurem l'opció `--squash` de l'eina `merge`, que permet combinar tots canvis realitzats en una branca (en múltiples _commits_)
en ún únic _commit_.
Aquesta manera de fusionar les branques té els seus avantatges i desavantatges.
Per un costat, fusionar tota una branca en un únic _commit_ ens pot servir per simplificar la història del repositori, però
a la vegada és pert la informació de què ha segut modificat en cada _commit_.
Aquesta eina és útil per fusionar una branca la qual pensem que s'han realitzat massa _commits_
amb canvis no significatius en tots d'ells.
La sintaxi és:
```bash
git merge --squash <branch_name>
```
::: docs
Documentació oficial sobre `merge --squash`:
- https://git-scm.com/docs/git-merge#Documentation/git-merge.txt---squash
:::
Aquesta opció incorpora tots els canvis de la branca especificada en l'_Àrea de Preparació_ o _Staging Area_
en la branca actual. En aquest moment, podem realitzar un nou _commit_ amb els canvis
incorporats.
És importat indicar que aquest _commit_ no està vinculat de cap manera en la branca d'on s'han incorporat els canvis.
## Repositori d'exemple
::: tip
Podeu copiar i pegar les ordres següents a __Git Bash__
per inicialitzar un repositori amb l'estructura dels exemples.
:::
Tots els exemples es realitzaran a partir d'un repositori amb la següent estructura:
```bash
mkdir ~/git_squash
cd ~/git_squash
git init
echo "# Git Squash" >> README.md
git add README.md
git commit -m "Added README.md"
git branch -m main
git branch canvis
git checkout canvis
echo "1. Primer canvi" >> README.md
git commit -a -m "1. Primer canvi"
echo "2. Segon canvi" >> README.md
git commit -a -m "2. Segon canvi"
echo "3. Tercer canvi" >> README.md
git commit -a -m "3. Tercer canvi"
echo "4. Quart canvi" >> README.md
git commit -a -m "4. Quart canvi"
git checkout main
```
```shell
jpuigcerver@FP:~/git_squash (main) $ git lga
* 4548cc8 - (1 second ago) 4. Quart canvi - Joan Puigcerver (canvis)
* 76a12d4 - (1 second ago) 3. Tercer canvi - Joan Puigcerver
* caf87c2 - (1 second ago) 2. Segon canvi - Joan Puigcerver
* f78b546 - (1 second ago) 1. Primer canvi - Joan Puigcerver
* bce067c - (1 second ago) Added README.md - Joan Puigcerver (HEAD -> main)
jpuigcerver@FP:~/git_squash (main) $ git status
On branch main
nothing to commit, working tree clean
jpuigcerver@FP:~/git_squash (main) $ cat README.md
# Git Squash
1. Primer canvi
2. Segon canvi
3. Tercer canvi
4. Quart canvi
```
## Exemple
En aquest cas, s'han realitzat 4 _commits_ en la branca `canvis`.
Volem incorporar els canvis a la branca `main`, però creguem
que els _commits_ no tenen canvis suficientment significatius
per tindre un propi _commit_.
Per tant, incorporarem els canvis a la branca `main` en un únic _commit_ mitjançant l'opció `--squash`:
```shell
jpuigcerver@FP:~/git_squash (main) $ git status
On branch main
nothing to commit, working tree clean
jpuigcerver@FP:~/git_squash (main) $ cat README.md
# Git Squash
jpuigcerver@FP:~/git_squash (main) $ git merge --squash canvis
Updating bce067c..4548cc8
Fast-forward
Squash commit -- not updating HEAD
README.md | 4 .green{++++}
1 file changed, 4 insertions(+)
jpuigcerver@FP:~/git_squash (main) $ git status
On branch main
Changes to be committed:
(use "git restore --staged <file>..." to unstage)
modified: README.md
jpuigcerver@FP:~/git_squash (main) $ git diff --staged
diff --git a/README.md b/README.md
index 9b90a90..670917b 100644
--- a/README.md
+++ b/README.md
@@ -1 +1,5 @@
# Git Squash
+1. Primer canvi
+2. Segon canvi
+3. Tercer canvi
+4. Quart canvi
jpuigcerver@FP:~/git_squash (main) $ git commit -m "Merge squash branch 'canvis'"
[main 72034c3] Merge squash branch 'canvis'
1 file changed, 4 insertions(+)
jpuigcerver@FP:~/git_squash (main) $ git lga
* 72034c3 - (1 second ago) Merge squash branch 'canvis' - Joan Puigcerver (HEAD -> main)
| * 4548cc8 - (6 minutes ago) 4. Quart canvi - Joan Puigcerver (canvis)
| * 76a12d4 - (6 minutes ago) 3. Tercer canvi - Joan Puigcerver
| * caf87c2 - (6 minutes ago) 2. Segon canvi - Joan Puigcerver
| * f78b546 - (6 minutes ago) 1. Primer canvi - Joan Puigcerver
|/
* bce067c - (6 minutes ago) Added README.md - Joan Puigcerver
jpuigcerver@FP:~/git_squash (main) $ cat README.md
# Git Squash
1. Primer canvi
2. Segon canvi
3. Tercer canvi
4. Quart canvi
```
Aquest lloc web utilitza galetes per millorar l'experiència de l'usuari