<div class="page"> <div class="cover text-center"> <img class="mx-auto" src=/itb/images/logo_mislata.png alt="logo"> # GitFlow en un projecte <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ó Aquest exemple vol il·lustrar com es pot utilitzar el model de ramificació GitFlow en un projecte on múltiples persones treballen sobre un mateix projecte. ## Configuració inicial Per començar, crearem un nou repositori de Git en el sistema que actuarà com a repositori remot. Crearem aquest repositori en el directori __gitflow_example/remot__, on farem un primer commit per tal de tindre un punt de partida. ```shell joapuiib@FP:~ $ mkdir -p ~/gitflow_example/remot joapuiib@FP:~ $ cd ~/gitflow_example/remot joapuiib@FP:~/gitflow_example/remot $ git init Initialized empty Git repository in /home/joapuiib/gitflow_example_remot/.git/ joapuiib@FP:~/gitflow_example/remot (main) $ echo "# Gitflow example" >> README.md joapuiib@FP:~/gitflow_example/remot (main) $ git add README.md joapuiib@FP:~/gitflow_example/remot (main) $ git commit -m "1. Primer commit" [main (root-commit) 8e70293] 1. Primer commit 1 file changed, 1 insertion(+) create mode 100644 README.md joapuiib@FP:~/gitflow_example/remot (main) $ git lga * 8e70293 - (1 minute ago) 1. Primer commit - Joan Puigcerver (HEAD -> main) ``` A més, crearem la branca `develop` que actuarà com a branca de desenvolupament. ```shell joapuiib@FP:~/gitflow_example/remot (main) $ git branch develop joapuiib@FP:~/gitflow_example/remot (main) $ git lga * 8e70293 - (1 minute ago) 1. Primer commit - Joan Puigcerver (HEAD -> main, develop) ``` ## Configuració dels repositoris locals Ara que tenim el repositori remot configurat, crearem tres repositoris locals que actuaran com a repositoris dels desenvolupadors: __anna__, __pau__ i __mar__. ```shell joapuiib@FP:~ $ cd ~/gitflow_example joapuiib@FP:~/gitflow_example $ git clone remot anna Cloning into 'anna'... done. joapuiib@FP:~/gitflow_example $ git clone remot pau Cloning into 'pau'... done. joapuiib@FP:~/gitflow_example $ git clone remot mar oning into 'mar'... done. joapuiib@FP:~/gitflow_example $ tree . . ├── anna │   └── README.md ├── mar │   └── README.md ├── pau │   └── README.md └── remot └── README.md 5 directories, 4 files ``` Cadascun dels repositoris locals té una còpia del repositori remot, i cada desenvolupador pot començar a treballar de manera independent. Consultem l'estat del repositori d'Anna: ```shell joapuiib@FP:~/gitflow_example $ cd anna joapuiib@FP:~/gitflow_example/anna (main) $ git lga * 8e70293 - (1 minute ago) 1. Primer commit - Joan Puigcerver (HEAD -> main, origin/main, origin/develop, origin/HEAD) ``` Podem veure que el repositori d'Anna té les branques `main`, `develop` configurades. ## Desenvolupament de funcionalitats Cada desenvolupador començarà a treballar en una nova funcionalitat. - Anna treballarà en la funcionalitat `feature/readme`, que consistirà a afegir una descripció del projecte al README. - Pau treballarà en la funcionalitat `feature/license`, que consistirà a afegir una llicència al projecte. - Mar treballarà en la funcionalitat `feature/author`, que consistirà a afegir el nom de l'autors del projecte al README. A partir d'aquest moment, cada desenvolupador treballarà en el seu propi repositori, en la seua pròpia branca de funcionalitat de manera independent i concurrent. ::: note És important que cada desenvolupador treballe en una única branca per funcionalitat, i que una mateixa branca no es compartisca entre desenvolupadors. Si existeix la necessitat de compartir una branca, segurament siga perque la funcionalitat no està ben definida i segurament es podrà dividir en diverses funcionalitats més xicotetes. ::: ### Desenvolupament de la funcionalitat `feature/readme` Anna començarà a treballar en la seua funcionalitat `feature/readme` en el seu repositori local. ```shell anna@FP:~/gitflow_example/anna (main) $ git checkout develop Switched to branch 'develop' branch 'develop' set up to track 'origin/develop'. anna@FP:~/gitflow_example/anna (develop) $ git checkout -b feature/readme Switched to a new branch 'feature/readme' anna@FP:~/gitflow_example/anna (feature/readme) $ echo "Aquest projecte és un exemple de com utilitzar GitFlow" >> README.md anna@FP:~/gitflow_example/anna (feature/readme) $ git add README.md anna@FP:~/gitflow_example/anna (feature/readme) $ git commit -m "README: Afegida descripció del projecte" [feature/readme 0fb88ef] README: Afegida descripció del projecte 1 file changed, 1 insertion(+) anna@FP:~/gitflow_example/anna (feature/readme) $ git push -u origin feature/readme Enumerating objects: 5, done. Counting objects: 100% (5/5), done. Delta compression using up to 12 threads Compressing objects: 100% (2/2), done. Writing objects: 100% (3/3), 338 bytes | 338.00 KiB/s, done. Total 3 (delta 0), reused 0 (delta 0), pack-reused 0 To /home/joapuiib/gitflow_example/remot * [new branch] feature/readme -> feature/readme branch 'feature/readme' set up to track 'origin/feature/readme'. anna@FP:~/gitflow_example/anna (feature/readme) $ git lga * 0fb88ef - (1 minute ago) README: Afegida descripció del projecte - Anna (HEAD -> feature/readme, origin/feature/readme) * 8e70293 - (1 minute ago) 1. Primer commit - Joan Puigcerver (origin/main, origin/develop, origin/HEAD, main, develop) ``` ### Desenvolupament de la funcionalitat `feature/license` Pau començarà a treballar en la seua funcionalitat `feature/license` en el seu repositori local. ```shell pau@FP:~/gitflow_example/pau (main) $ git checkout develop Switched to branch 'develop' branch 'develop' set up to track 'origin/develop'. pau@FP:~/gitflow_example/pau (main) $ git checkout -b feature/license Switched to a new branch 'feature/license' pau@FP:~/gitflow_example/pau (feature/license) $ echo "Llicència: CC BY-NC-SA 4.0 DEED - Reconeixement-NoComercial-CompartirIgual 4.0 Internacional" >> LICENSE pau@FP:~/gitflow_example/pau (feature/license) $ echo "More info: https://creativecommons.org/licenses/by-nc-sa/4.0/deed.ca " >> LICENSE pau@FP:~/gitflow_example/pau (feature/license) $ git add LICENSE pau@FP:~/gitflow_example/pau (feature/license) $ git commit -m "LICENSE: Afegida llicència" [feature/license b1265b9] LICENSE: Afegida llicència 1 file changed, 2 insertions(+) pau@FP:~/gitflow_example/pau (feature/license) $ git push -u origin feature/license Enumerating objects: 4, done. Counting objects: 100% (4/4), done. Delta compression using up to 12 threads Compressing objects: 100% (3/3), done. Writing objects: 100% (3/3), 442 bytes | 442.00 KiB/s, done. Total 3 (delta 0), reused 0 (delta 0), pack-reused 0 To /home/joapuiib/gitflow_example/remot * [new branch] feature/license -> feature/license branch 'feature/license' set up to track 'origin/feature/license'. pau@FP:~/gitflow_example/pau (feature/license) $ git lga * b1265b9 - (1 minute ago) LICENSE: Afegida llicència - Pau (HEAD -> feature/license, origin/feature/license) * 8e70293 - (1 minute ago) 1. Primer commit - Joan Puigcerver (origin/main, origin/develop, origin/HEAD, main, develop) ``` ### Desenvolupament de la funcionalitat `feature/author` Mar començarà a treballar en la seua funcionalitat `feature/author` en el seu repositori local. ```shell mar@FP:~/gitflow_example/mar (main) $ git checkout develop Switched to branch 'develop' branch 'develop' set up to track 'origin/develop'. mar@FP:~/gitflow_example/mar (main) $ git checkout -b feature/author Switched to a new branch 'feature/author' mar@FP:~/gitflow_example/mar (feature/author) $ echo "## Autors" >> README.md mar@FP:~/gitflow_example/mar (feature/author) $ echo "Anna, Pau i Mar" >> README.md mar@FP:~/gitflow_example/mar (feature/author) $ git add README.md mar@FP:~/gitflow_example/mar (feature/author) $ git commit -m "README: Afegits autors" [feature/author f853946] README: Afegits autors 1 file changed, 2 insertions(+) mar@FP:~/gitflow_example/mar (feature/author) $ git push -u origin feature/author Enumerating objects: 5, done. Counting objects: 100% (5/5), done. Writing objects: 100% (3/3), 305 bytes | 305.00 KiB/s, done. Total 3 (delta 0), reused 0 (delta 0), pack-reused 0 To /home/joapuiib/gitflow_example/remot * [new branch] feature/author -> feature/author branch 'feature/author' set up to track 'origin/feature/author'. mar@FP:~/gitflow_example/mar (feature/author) $ git lga * f853946 - (1 minute ago) README: Afegits autors - Mar (HEAD -> feature/author, origin/feature/author) * 8e70293 - (1 minute ago) 1. Primer commit - Joan Puigcerver (origin/main, origin/develop, origin/HEAD, main, develop) ``` ## Integració de les funcionalitats Cada desenvolupador ha acabat la seua funcionalitat i ha publicat la seua branca en el repositori remot. No obstant això, cadascun d'ells no veu les funcionalitats dels altres desenvolupadors i tampoc les ha integrades a la branca `develop`. En aquest punt, l'estat del repositori remot és el següent: ```shell joapuiib@FP:~/gitflow_example/remot (main) $ git lga * f853946 - (3 minutes ago) README: Afegits autors - Mar (feature/author) | * cc8c388 - (5 minutes ago) LICENSE: Afegida llicència - Pau (feature/license) |/ | * 9e34bb0 - (10 minutes ago) README: Afegida descripció del projecte - Anna (feature/readme) |/ * 0fb88ef - (24 minutes ago) 1. Primer commit - Joan Puigcerver (HEAD -> main, develop) joapuiib@FP:~/gitflow_example/remot (main) $ ls README.md joapuiib@FP:~/gitflow_example/remot (main) $ cat README.md # Gitflow example ``` Podem observar que les branques `feature/readme`, `feature/license` i `feature/author` estan publicades en el repositori remot, però no estan integrades a la branca `develop`. ### Integració de la funcionalitat `feature/readme` Anem a assumir que Anna ha segut la primera en acabar la seua funcionalitat, i per tant, desitja integrar la seua funcionalitat a la branca `develop`. El procés que ha de seguir Anna és el següent: - Comprovar si hi han hagut noves modificacions del repositori remot amb `git fetch`. - Actualitzar la branca `develop` amb les últimes modificacions del repositori remot amb `git pull`. - Assegurar-se que la branca `feature` està actualitzada amb les últimes modificacions de `develop` amb `git rebase` per mantenir una història lineal. - Integrar la branca `feature` a `develop` amb `git merge`. - Publicar la branca `develop` en el repositori remot amb `git push`. 1. Comprovem si hi han hagut noves modificacions del repositori remot. ```shell anna@FP:~/gitflow_example/anna (feature/readme) $ git fetch remote: Enumerating objects: 8, done. remote: Counting objects: 100% (8/8), done. remote: Compressing objects: 100% (4/4), done. remote: Total 6 (delta 1), reused 0 (delta 0), pack-reused 0 Unpacking objects: 100% (6/6), 630 bytes | 630.00 KiB/s, done. From /home/joapuiib/gitflow_example/remot * [new branch] feature/author -> origin/feature/author * [new branch] feature/license -> origin/feature/license anna@FP:~/gitflow_example/anna (feature/readme) $ git lga * f853946 - (7 minutes ago) README: Afegits autors - Mar (origin/feature/author) | * cc8c388 - (9 minutes ago) LICENSE: Afegida llicència - Pau (origin/feature/license) |/ | * 9e34bb0 - (15 minutes ago) README: Afegida descripció del projecte - Anna (HEAD -> feature/readme, origin/feature/readme) |/ * 0fb88ef - (29 minutes ago) 1. Primer commit - Joan Puigcerver (origin/main, origin/develop, origin/HEAD, main, develop) ``` 2. Actualitzem la branca `develop` amb les últimes modificacions del repositori remot. En aquest cas, no hi han hagut modificacions, per tant, no es realitzarà cap canvi. ```shell anna@FP:~/gitflow_example/anna (feature/readme) $ git checkout develop Switched to branch 'develop' anna@FP:~/gitflow_example/anna (develop) $ git pull Already up to date. ``` 3. Assegurem-nos que la branca `feature` està actualitzada amb les últimes modificacions de `develop`. En aquest cas, la branca `feature` està actualitzada amb `develop`, i no es realitzarà cap canvi. ```shell anna@FP:~/gitflow_example/anna (develop) $ git checkout feature/readme Switched to branch 'feature/readme' anna@FP:~/gitflow_example/anna (feature/readme) $ git rebase develop Current branch feature/readme is up to date. ``` 4. Integrem la branca `feature` a `develop`. ```shell anna@FP:~/gitflow_example/anna (feature/readme) $ git checkout develop Switched to branch 'develop' anna@FP:~/gitflow_example/anna (develop) $ git merge feature/readme Updating 0fb88ef..9e34bb0 Fast-forward README.md | 1 + 1 file changed, 1 insertion(+) anna@FP:~/gitflow_example/anna (develop) $ git lga * f853946 - (7 minutes ago) README: Afegits autors - Mar (origin/feature/author) | * cc8c388 - (9 minutes ago) LICENSE: Afegida llicència - Pau (origin/feature/license) |/ | * 9e34bb0 - (15 minutes ago) README: Afegida descripció del projecte - Anna (HEAD -> develop, feature/readme, origin/feature/readme) |/ * 0fb88ef - (29 minutes ago) 1. Primer commit - Joan Puigcerver (origin/main, origin/develop, origin/HEAD, main) ``` 5. Publiquem la branca `develop` en el repositori remot. ```shell anna@FP:~/gitflow_example/anna (develop) $ git push Total 0 (delta 0), reused 0 (delta 0), pack-reused 0 To /home/joapuiib/gitflow_example/remot 0fb88ef..9e34bb0 develop -> develop anna@FP:~/gitflow_example/anna (develop) $ git lga * f853946 - (7 minutes ago) README: Afegits autors - Mar (origin/feature/author) | * cc8c388 - (9 minutes ago) LICENSE: Afegida llicència - Pau (origin/feature/license) |/ | * 9e34bb0 - (15 minutes ago) README: Afegida descripció del projecte - Anna (HEAD -> develop, origin/develop, feature/readme, origin/feature/readme) |/ * 0fb88ef - (29 minutes ago) 1. Primer commit - Joan Puigcerver (origin/main, origin/HEAD, main) ``` En aquest punt, la funcionalitat `feature/readme` ha sigut integrada a la branca `develop`. Anna pot continuar treballant en una nova funcionalitat. ### Integració de la funcionalitat `feature/license` Uns minuts després, Pau ha acabat la seua funcionalitat i desitja integrar-la a la branca `develop`. El procés que ha de seguir Pau és el següent: 1. Comprovar si hi han hagut noves modificacions del repositori remot amb `git fetch`. ```shell pau@FP:~/gitflow_example/pau (feature/license) $ git fetch remote: Enumerating objects: 8, done. remote: Counting objects: 100% (8/8), done. remote: Compressing objects: 100% (3/3), done. remote: Total 6 (delta 1), reused 0 (delta 0), pack-reused 0 Unpacking objects: 100% (6/6), 539 bytes | 539.00 KiB/s, done. From /home/joapuiib/gitflow_example/remot 0fb88ef..9e34bb0 develop -> origin/develop * [new branch] feature/author -> origin/feature/author * [new branch] feature/readme -> origin/feature/readme pau@FP:~/gitflow_example/pau (feature/license) $ git lga * f853946 - (7 minutes ago) README: Afegits autors - Mar (origin/feature/author) | * cc8c388 - (9 minutes ago) LICENSE: Afegida llicència - Pau (HEAD -> feature/license, origin/feature/license) |/ | * 9e34bb0 - (15 minutes ago) README: Afegida descripció del projecte - Anna (origin/develop, origin/feature/readme) |/ * 0fb88ef - (29 minutes ago) 1. Primer commit - Joan Puigcerver (origin/main, origin/HEAD, main, develop) ``` ::: info Per seguir el tutorial, Mar ha de fer un `git fetch` abans que Pau haja publicat la seua funcionalitat. Aquest és un bon moment per fer-ho. ::: 2. Actualitzar la branca `develop` amb les últimes modificacions del repositori remot. En aquest cas, la branca `develop` no està actualitzada i cal integrar els canvis del repositori remot. ```shell pau@FP:~/gitflow_example/pau (feature/license) $ git checkout develop Switched to branch 'develop' pau@FP:~/gitflow_example/pau (develop) $ git pull Updating 0fb88ef..9e34bb0 Fast-forward README.md | 1 + 1 file changed, 1 insertion(+) pau@FP:~/gitflow_example/pau (develop) $ git lga * f853946 - (7 minutes ago) README: Afegits autors - Mar (origin/feature/author) | * cc8c388 - (9 minutes ago) LICENSE: Afegida llicència - Pau (feature/license, origin/feature/license) |/ | * 9e34bb0 - (15 minutes ago) README: Afegida descripció del projecte - Anna (HEAD -> develop, origin/develop, origin/feature/readme) |/ * 0fb88ef - (29 minutes ago) 1. Primer commit - Joan Puigcerver (origin/main, origin/HEAD, main) ``` 3. Assegurar-se que la branca `feature` està actualitzada amb les últimes modificacions de `develop`. En aquest cas, la branca `feature` no està actualitzada amb `develop`, i és necessari actualitzar-la. ```shell pau@FP:~/gitflow_example/pau (develop) $ git checkout feature/license Switched to branch 'feature/license' pau@FP:~/gitflow_example/pau (feature/license) $ git rebase develop Successfully rebased and updated refs/heads/feature/license. pau@FP:~/gitflow_example/pau (feature/license) $ git lga * ec201eb - (9 minutes ago) LICENSE: Afegida llicència - Pau (HEAD -> feature/license) * f853946 - (7 minutes ago) README: Afegits autors - Mar (origin/feature/author) | * cc8c388 - (9 minutes ago) LICENSE: Afegida llicència - Pau (origin/feature/license) |/ | * 9e34bb0 - (15 minutes ago) README: Afegida descripció del projecte - Anna (origin/develop, origin/feature/readme) |/ * 0fb88ef - (29 minutes ago) 1. Primer commit - Joan Puigcerver (origin/main, origin/HEAD, main) ``` ::: warning La branca `feature/license` ha sigut modificada per tal de mantenir una història lineal amb un rebase. No obstant, la branca `origin/feature/license` encara apunta a l'antiga versió de la branca. En aquest cas, caldrà forçar la publicació de la branca `feature/license` en el repositori remot amb `git push -f`. ::: ```shell pau@FP:~/gitflow_example/pau (feature/license) $ git push -f Enumerating objects: 4, done. Counting objects: 100% (4/4), done. Delta compression using up to 12 threads Compressing objects: 100% (3/3), done. Writing objects: 100% (3/3), 449 bytes | 449.00 KiB/s, done. Total 3 (delta 0), reused 0 (delta 0), pack-reused 0 To /home/joapuiib/gitflow_example/remot + cc8c388...ec201eb feature/license -> feature/license (forced update) pau@FP:~/gitflow_example/pau (feature/license) $ git lga * ec201eb - (9 minutes ago) LICENSE: Afegida llicència - Pau (HEAD -> feature/license, origin/feature/license) * f853946 - (7 minutes ago) README: Afegits autors - Mar (origin/feature/author) | * 9e34bb0 - (15 minutes ago) README: Afegida descripció del projecte - Anna (develop, origin/develop, origin/feature/readme) |/ * 0fb88ef - (29 minutes ago) 1. Primer commit - Joan Puigcerver (origin/main, origin/HEAD, main) ``` 4. Integrem la branca `feature` a `develop`. ```shell pau@FP:~/gitflow_example/pau (feature/license) $ git checkout develop Switched to branch 'develop' pau@FP:~/gitflow_example/pau (develop) $ git merge feature/license Updating 9e34bb0..ec201eb Fast-forward LICENSE | 2 ++ 1 file changed, 2 insertions(+) pau@FP:~/gitflow_example/pau (develop) $ git lga * ec201eb - (9 minutes ago) LICENSE: Afegida llicència - Pau (HEAD -> develop, feature/license, origin/feature/license) * f853946 - (7 minutes ago) README: Afegits autors - Mar (origin/feature/author) | * 9e34bb0 - (15 minutes ago) README: Afegida descripció del projecte - Anna (origin/develop, origin/feature/readme) |/ * 0fb88ef - (29 minutes ago) 1. Primer commit - Joan Puigcerver (origin/main, origin/HEAD, main) ``` 5. Publiquem la branca `develop` en el repositori remot. ```shell pau@FP:~/gitflow_example/pau (develop) $ git push Total 0 (delta 0), reused 0 (delta 0), pack-reused 0 To /home/joapuiib/gitflow_example/remot 9e34bb0..ec201eb develop -> develop pau@FP:~/gitflow_example/pau (develop) $ git lga * ec201eb - (9 minutes ago) LICENSE: Afegida llicència - Pau (HEAD -> develop, origin/develop, feature/license, origin/feature/license) * f853946 - (7 minutes ago) README: Afegits autors - Mar (origin/feature/author) | * 9e34bb0 - (15 minutes ago) README: Afegida descripció del projecte - Anna (origin/feature/readme) |/ * 0fb88ef - (29 minutes ago) 1. Primer commit - Joan Puigcerver (origin/main, origin/HEAD, main) ``` La funcionalitat `feature/license` ha sigut integrada a la branca `develop` i Pau pot continuar treballant en una nova funcionalitat. ### Integració de la funcionalitat `feature/author` Finalment, Mar ha acabat la seua funcionalitat i desitja integrar-la a la branca `develop`. El procés que hauria de seguir Mar és el mateix que el seguit per els seus companys. No obstant això, anem a assumir que Mar ha realitzat el primer pas (`git fetch`) abans que Pau haja publicat la seua funcionalitat. No anem a detallar el procés, ja que és el mateix que el seguit per Anna i Pau. El resultat final (sense haver incorporat els canvis de Pau) serà el següent: ```shell mar@FP:~/gitflow_example/mar (develop) $ git lga * f853946 - (7 minutes ago) README: Afegits autors - Mar (HEAD -> develop, feature/author, origin/feature/author) * 9e34bb0 - (15 minutes ago) README: Afegida descripció del projecte - Anna (origin/develop, origin/feature/readme) | * ec201eb - (9 minutes ago) LICENSE: Afegida llicència - Pau (origin/feature/license) |/ * 0fb88ef - (29 minutes ago) 1. Primer commit - Joan Puigcerver (origin/main, origin/HEAD, main) ``` El resultat pareix correcte, ja que la funcionalitat `feature/author` ha sigut integrada a la branca `develop` i manté la història lineal. L'únic problema (que Mar no sap encara), és que la branca `origin/develop` ha segut actualitzada per Pau. Si Mar intenta publicar la seua branca `develop` en el repositori remot, obtindrà un error. ```shell mar@FP:~/gitflow_example/mar (develop) $ git push To /home/joapuiib/gitflow_example/remot .red{ ! [rejected] develop -> develop (non-fast-forward) error: failed to push some refs to '/home/joapuiib/gitflow_example/remot'} .yellow{hint: Updates were rejected because the tip of your current branch is behind hint: its remote counterpart. If you want to integrate the remote changes, hint: use 'git pull' before pushing again. hint: See the 'Note about fast-forwards' in 'git push --help' for details.} mar@FP:~/gitflow_example/mar (develop) $ git lga * f853946 - (7 minutes ago) README: Afegits autors - Mar (HEAD -> develop, feature/author, origin/feature/author) | * ec201eb - (9 minutes ago) LICENSE: Afegida llicència - Pau (origin/develop, origin/feature/license) |/ * 9e34bb0 - (15 minutes ago) README: Afegida descripció del projecte - Anna (origin/feature/readme) * 0fb88ef - (29 minutes ago) 1. Primer commit - Joan Puigcerver (origin/main, origin/HEAD, main) ``` ::: question Com es pot solucionar aquest problema? Hi ha 2 opcions. ::: ::: solution "Solució 1: pull --rebase" Mar pot actualitzar la branca `develop` amb les últimes modificacions del repositori remot amb `git pull --rebase` per mantenir una història lineal. ```shell mar@FP:~/gitflow_example/mar (develop) $ git pull --rebase Successfully rebased and updated refs/heads/develop. mar@FP:~/gitflow_example/mar (develop) $ git lga * f853946 - (7 minutes ago) README: Afegits autors - Mar (HEAD -> develop) * ec201eb - (9 minutes ago) LICENSE: Afegida llicència - Pau (origin/develop, origin/feature/license) | * f853946 - (7 minutes ago) README: Afegits autors - Mar (feature/author, origin/feature/author) |/ * 9e34bb0 - (15 minutes ago) README: Afegida descripció del projecte - Anna (origin/feature/readme) * 0fb88ef - (29 minutes ago) 1. Primer commit - Joan Puigcerver (origin/main, origin/HEAD, main) ``` La branca `develop` està actualitzada, però no la branca `feature/author`. Ho podem sincronitzar amb un `git branch -f` i `git push -f`. ```shell mar@FP:~/gitflow_example/mar (develop) $ git branch -f feature/author develop mar@FP:~/gitflow_example/mar (develop) $ git push -f origin feature/author mar@FP:~/gitflow_example/mar (develop) $ git lga * f853946 - (7 minutes ago) README: Afegits autors - Mar (HEAD -> develop, origin/develop, feature/author, origin/feature/author) * ec201eb - (9 minutes ago) LICENSE: Afegida llicència - Pau (origin/develop, origin/feature/license) * 9e34bb0 - (15 minutes ago) README: Afegida descripció del projecte - Anna (origin/feature/readme) * 0fb88ef - (29 minutes ago) 1. Primer commit - Joan Puigcerver (origin/main, origin/HEAD, main) ``` ::: ::: solution "Solució 2: reset --hard i repetir el procés" Una altra opció és moure la branca `develop` al commit `origin/develop` amb `git reset --hard` i repetir el procés de rebase i merge. Aquesta opció té més passes, però és més segura. ```shell mar@FP:~/gitflow_example/mar (develop) $ git reset --hard origin/develop * ec201eb - (9 minutes ago) LICENSE: Afegida llicència - Pau (HEAD -> develop, origin/develop, origin/feature/license) | * f853946 - (7 minutes ago) README: Afegits autors - Mar (feature/author, origin/feature/author) |/ * 9e34bb0 - (15 minutes ago) README: Afegida descripció del projecte - Anna (origin/feature/readme) * 0fb88ef - (29 minutes ago) 1. Primer commit - Joan Puigcerver (origin/main, origin/HEAD, main) ``` I es repeteix el procés de `rebase` i `merge` de la branca `feature/author`. Estat final: ```shell mar@FP:~/gitflow_example/mar (develop) $ git lga * f853946 - (7 minutes ago) README: Afegits autors - Mar (HEAD -> develop, origin/develop, feature/author, origin/feature/author) * ec201eb - (9 minutes ago) LICENSE: Afegida llicència - Pau (origin/develop, origin/feature/license) * 9e34bb0 - (15 minutes ago) README: Afegida descripció del projecte - Anna (origin/feature/readme) * 0fb88ef - (29 minutes ago) 1. Primer commit - Joan Puigcerver (origin/main, origin/HEAD, main) ``` ::: ## Possibles problemes ::: warning Si dos desenvolupadors modifiquen els mateixos fitxers, pot ser que un d'ells haja de resoldre conflictes durant el `rebase` o el `merge`. ::: :::: danger Si un desenvolupador no actualitza la branca `develop` abans de publicar la seua funcionalitat, tindrà problemes per publicar la branca `develop` en el repositori remot. En aquest cas, un `git pull` crearà un commit de merge, que no és desitjable. ::: tip En cas d'equivocar-se, es pot desfer el commit de merge amb `git reset --hard origin/develop`. ::: Aquest és el comportament per defecte de Git, però es pot canviar amb la configuració perquè `git pull` faça un rebase en lloc d'un merge. ```bash git config --global pull.rebase true ``` No obstant, no és convenient confiar en aquesta configuració, ja que pot ser que en altres dispositius no estiga configurada i ens porte problemes. :::: ::: danger __MAI__{.red} publiqueu forçosament la branca `develop`, si vos dóna problemes, heu de fer un `git fetch` i integrar els canvis de manera lineal. ::: ## Conclusió En aquest exemple hem vist una aplicació de l'estratègia GitFlow en un projecte senzill, que permet a diversos desenvolupadors treballar de manera independent i concurrent en diverses funcionalitats.