<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 ```