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