Salta el contingut
 

Merge squash

Joan Puigcerver Ibáñez

Llicència: CC BY-NC-SA 4.0

(Reconeixement - NoComercial - CompartirIgual) 🅭

Fusió en un únic commit (git merge --squash)

L'opció --squash de l'ordre git merge permet fusionar els canvis d'una branca en una altra amb un únic commit.

De vegades, el treball en una branca genera molts commits xicotets (micro-commits) que no aporten informació rellevant. Amb aquesta opció, tots aquests commits es fusionen en un de sol, i així s'evita omplir l'historial d'informació innecessària.

Aquesta opció és especialment útil en la fusió de branques de funcionalitat, que es presenta en el bloc següent, Estratègies de ramificació.

Internament, git merge --squash aplica tots els canvis de la branca especificada en l'Àrea de preparació (Staging Area), però no fa el commit, que cal fer manualment.

La sintaxi és la següent:

git merge --squash <branca>
  • <branca>: branca els canvis de la qual es volen incorporar en la branca actual.

Documentació oficial: git merge --squash – Git

Funcionament de git merge --squash Funcionament de git merge --squash

Figura 1. Funcionament de git merge --squash.

Preparació del repositori

El repositori dels exemples es prepara amb les ordres següents:

setup_squash.sh
#!/bin/bash

# Elimina el repositori si existeix
if [ -d ~/git_squash ]; then
    rm -rf ~/git_squash
fi

mkdir -p ~/git_squash
cd ~/git_squash
git init
git branch -m main
echo "# Git merge --squash" > README.md
git add README.md
git commit -m "Commit inicial"
git checkout -b canvis
echo "- Canvi A" >> README.md
git commit -a -m "Canvi A"
echo "- Canvi B" >> README.md
git commit -a -m "Canvi B"
echo "- Canvi C" >> README.md
git commit -a -m "Canvi C"
git lga
jpuigcerver@fp:~ $ mkdir -p ~/git_squash
jpuigcerver@fp:~ $ cd ~/git_squash
jpuigcerver@fp:~/git_squash $ git init
Initialized empty Git repository in ~/git_squash/.git/
jpuigcerver@fp:~/git_squash (main) $ git branch -m main
jpuigcerver@fp:~/git_squash (main) $ echo "# Git merge --squash" > README.md
jpuigcerver@fp:~/git_squash (main) $ git add README.md
jpuigcerver@fp:~/git_squash (main) $ git commit -m "Commit inicial"
[main (root-commit) 863c0b2] Commit inicial
 1 file changed, 1 insertion(+)
 create mode 100644 README.md
jpuigcerver@fp:~/git_squash (main) $ git checkout -b canvis
Switched to a new branch 'canvis'
jpuigcerver@fp:~/git_squash (canvis) $ echo "- Canvi A" >> README.md
jpuigcerver@fp:~/git_squash (canvis) $ git commit -a -m "Canvi A"
[canvis b460f08] Canvi A
 1 file changed, 1 insertion(+)
jpuigcerver@fp:~/git_squash (canvis) $ echo "- Canvi B" >> README.md
jpuigcerver@fp:~/git_squash (canvis) $ git commit -a -m "Canvi B"
[canvis 58d9407] Canvi B
 1 file changed, 1 insertion(+)
jpuigcerver@fp:~/git_squash (canvis) $ echo "- Canvi C" >> README.md
jpuigcerver@fp:~/git_squash (canvis) $ git commit -a -m "Canvi C"
[canvis 824cb01] Canvi C
 1 file changed, 1 insertion(+)
jpuigcerver@fp:~/git_squash (canvis) $ git lga
* 824cb01 - (0 seconds ago) Canvi C - Joan Puigcerver (HEAD -> canvis)
* 58d9407 - (0 seconds ago) Canvi B - Joan Puigcerver
* b460f08 - (0 seconds ago) Canvi A - Joan Puigcerver
* 863c0b2 - (0 seconds ago) Commit inicial - Joan Puigcerver (main)

Crea el nou repositori en una carpeta independent per evitar problemes amb els exemples i exercicis anteriors.

Exemple: git merge --squash

Es fusionen tots els canvis de la branca canvis en la branca principal main.

jpuigcerver@fp:~/git_squash (canvis) $ git checkout main
Switched to branch 'main'
jpuigcerver@fp:~/git_squash (main) $ git merge --squash canvis
Updating 863c0b2..824cb01
Fast-forward
Squash commit -- not updating HEAD
 README.md | 3 +++
 1 file changed, 3 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 commit -m "Canvis A, B i C"
[main 00b7e27] Canvis A, B i C
 1 file changed, 3 insertions(+)
jpuigcerver@fp:~/git_squash (main) $ git lga
* 824cb01 - (0 seconds ago) Canvi C - Joan Puigcerver (canvis)
* 58d9407 - (0 seconds ago) Canvi B - Joan Puigcerver
* b460f08 - (0 seconds ago) Canvi A - Joan Puigcerver
| * 00b7e27 - (0 seconds ago) Canvis A, B i C - Joan Puigcerver (HEAD -> main)
|/  
* 863c0b2 - (0 seconds ago) Commit inicial - Joan Puigcerver

S'observa que tots els canvis de la branca canvis s'han incorporat en la branca main amb un únic commit.

📌 Aquest document pot quedar desactualitzat després d’imprimir-lo. Pots consultar la versió més recent a la pàgina web.
🌿 Abans d’imprimir aquest document, considera si és realment necessari. Redueix el consum de paper i ajuda a protegir el nostre entorn.