Salta el contingut

MP08 - UF4: Git flow i les seves branques

Exemple de git flow

Com hem vist anteriorment, per a treballar amb el git-flow cal tenir en compte que se sol treballar amb diverses branques sobre un sol projecte. Aquesta estratègia de ramificació utilitza dues branques principals (master o main i develop) i diverses branques de suport (feature, release, hotfix i support) que a diferència de les branques principals, aquestes últimes sempre tenen un temps de vida limitat, ja que seran eventualment eliminades.

El gran avantatge de git flow ** és que ens simplifica la gestió de generar noves branques i fer les fusions. Git flow conté unes comandes especials que fan la crida a les comandes bàsiques de git, de manera que amb una sola comanda git flow es realitzen diverses comandes de git. Anem a veure-ho amb un exemple des de zero.

Treballarem des de dos ordinadors diferents, o bé des del mateix, però tenint el projecte en dos directoris diferents. En el meu cas, executaré les comandes des del directori C:\DAW\MP08\projecteFlow1 i des del directori C:\DAW\MP08\projecteFlow2 simulant que estic desenvolupant sobre el mateix projecte dues característiques diferents.

Els passos que realitzarem seran els següents:

Creació del repositori al Github

Creem un repositori al Github anomenat projecteFlow. Aquest repositori està buit. En el meu cas, l'accés al repositori és https://github.com/nbuisac/projecteFlow.git.

Git hub

Git hub

Com podem veure en les instruccions que ens proposa, tenim l'opció de crear un nou repositori en la línia de comandes o bé pujar un repositori que ja tinguem. Obrirem un CMD al nostre PC, crearem el projecte i el pujarem amb les següents comandes.

mkdir C:\DAW\MP08\projecteFlow1
cd C:\DAW\MP08\projecteFlow1
mkdir projecteFlow
cd projecteFlow
echo "# projecteFlow" >> README.md
git flow init

Si sona error és perquè possiblement ens falta configurar algun paràmetre

Possiblement ens doni un error ja que no tenim configurades les variables user.email i user.name. Nosaltres les configurarem només pel projecte local, no com a variable global del sistema, de la següent forma:

git config --local user.email "you@example.com"
git config --local user.name "Your Name"

i ja podem tornar a executar la comanda

git flow init

La comanda git flow init ens farà una sèrie de preguntes per a inicialitzar el nom de les branques. Podeu canviar el nom de master per main si voleu (al repositori creat segurament li hem especificat que la branca inicial és main). Jo treballaré amb main. La meva execució ha estat la següent:

C:\DAW\MP08\projecteFlow1\projecteFlow>git flow init
Initialized empty Git repository in C:/DAW/MP08/projecteFlow1/projecteFlow/.git/
No branches exist yet. Base branches must be created now.
Branch name for production releases: [master] main
Branch name for "next release" development: [develop]

How to name your supporting branch prefixes?
Feature branches? [feature/]
Bugfix branches? [bugfix/]
Release branches? [release/]
Hotfix branches? [hotfix/]
Support branches? [support/]
Version tag prefix? []
Hooks and filters directory? [C:/DAW/MP08/projecteFlow1/projecteFlow/.git/hooks]

Una vegada hem creat la base del repositori fixeu-vos que per defecte no estem a la branca master sinó a la branca develop

C:\...\>git branch
* develop
  main

Ara ja podem afegir-hi un document i fer el primer commit i el primer push.

git add README.md
git commit -m "Commit de creacio del projecte"
git remote add origin https://github.com/nbuisac/projecteFlow.git
git push --all
Aquesta primera vegada hem fet un push --all i així hem pujat les dues branques a la vegada.

Una vegada fet el push podem veure com està el nostre repositori. Hi tenim les dues branques però...

Vigila amb el push

Compte amb el push, ja que sempre l'hem de fer cap a la branca on estem, cal saber la branca de la qual en faig el push

Inici de treball del segon lloc de treball

Per a treballar des del segon lloc de treball cal preparar-ne l'entorn (arbre de directoris)

mkdir C:\DAW\MP08\projecteFlow2
cd C:\DAW\MP08\projecteFlow2

i descarregar el repositori ja pujat en el nou lloc

git clone https://github.com/nbuisac/projecteFlow.git
i ens respondrà

Cloning into 'projecteFlow'...
remote: Enumerating objects: 5, done.
remote: Counting objects: 100% (5/5), done.
remote: Compressing objects: 100% (2/2), done.
remote: Total 5 (delta 0), reused 5 (delta 0), pack-reused 0
Receiving objects: 100% (5/5), done.

Ara ja tenim el repositori descarregat, però ens ha creat un directori anomenat projecteFlow com el repositori. Per tant, per a treballar amb el repositori entrarem al directori que ens ha creat.

cd projecteFlow
COMPTE: Si entrem dins el directori ens pot semblar que no tenim res, però en realitat tenim:

  • Un directori .git ocult amb tot el contingut que necessita el git,

  • tot i que no veiem cap fitxer, això és degut al fet que estem a la branca main. Si canviem a la branca develop, veurem el fitxer README.md.

Cal entrar i treballar amb la branca develop.

git branch develop

A partir d'ara ja podem treballar amb el repositori, però vigilant amb els push. A cada directori s'ha de treballar en una branca diferent.

Cada característica nova hauria de residir a la seva pròpia branca, que es pot enviar al repositori central per fer una còpia de seguretat/col·laboració. Però, en lloc de ramificar-se de la branca principal, main, les branques de característiques són una subbranca de features. Quan s'ha completat una funció, es torna a fusionar amb el desenvolupament. Les característiques no haurien d'interaccionar directament amb la branca main.

Creació d'una nova feature

Per a crear una nova característica al nostre projecte crearem una nova branca a feature.

Abans de continuar amb el Projecte2 ...

Cal especificar que treballem amb el git flow fent un git flow init.

També cal especificar les variables user.email i user.name

git config --local user.email "you@example.com"
git config --local user.name "Your Name"

Abans de continuar amb el Projecte2 ...

Cal actualitzar cadascuna de les branques amb el que hi ha al repositori, una vegada fet el init.

git switch develop
git pull origin develop

Per a crear amb git flow una branca dins de la branca features utilitzarem

git flow feature start feature_branch

- A new branch 'feature/feature_branch' was created, based on 'develop'
- You are now on branch 'feature/feature_branch'

Now, start committing on your feature. When done, use:

     git flow feature finish feature_branch
D'aquesta manera, hem creat la branca anomenada feature_branch dins la branca feature
C:...>git branch
  develop
* feature/feature_branch
  master
Ara anirem treballant amb aquesta branca, per exemple afegint un nou fitxer o modificant els que tenim.
echo "Afegim una feature nova" >> README.md
echo "Nova caracteristica" > FT1.txt
Comprovem l'estat
git status

On branch feature/feature_branch
Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git restore <file>..." to discard changes in working directory)
        modified:   README.md

Untracked files:
  (use "git add <file>..." to include in what will be committed)
        FT1.txt

no changes added to commit (use "git add" and/or "git commit -a")
Afegim els fitxers nous i validem els canvis
git add FT1.txt
git add README.md
git commit -m "Nova feature afegida"
El resultat ens diu que ja és correcte
[feature/feature_branch 917d473] Nova feature afegida
 2 files changed, 3 insertions(+), 1 deletion(-)
 create mode 100644 FT1.txt
i ara podem fer la fusió i tornar a develop amb una sola comanda
git flow feature finish feature_branch
Switched to branch 'develop'
Your branch is up to date with 'origin/develop'.
Updating 209a904..917d473
Fast-forward
 FT1.txt   | 1 +
 README.md | 3 ++-
 2 files changed, 3 insertions(+), 1 deletion(-)
 create mode 100644 FT1.txt
Deleted branch feature/feature_branch (was 917d473).

Summary of actions:
- The feature branch 'feature/feature_branch' was merged into 'develop'
- Feature branch 'feature/feature_branch' has been locally deleted
- You are now on branch 'develop'
Comprovem on estem i l'estat
git branch
* develop
  master

C:\DAW\MP08\projecteFlow1\projecteFlow>git status
On branch develop
Your branch is ahead of 'origin/develop' by 1 commit.
  (use "git push" to publish your local commits)

nothing to commit, working tree clean
i ara ja podem fer el push tal com ens recorda la mateixa comanda
git push
Enumerating objects: 6, done.
Counting objects: 100% (6/6), done.
Delta compression using up to 8 threads
Compressing objects: 100% (3/3), done.
Writing objects: 100% (4/4), 374 bytes | 374.00 KiB/s, done.
Total 4 (delta 0), reused 0 (delta 0), pack-reused 0
remote: . Processing 1 references
remote: Processed 1 references in total
To http://daw.institutmontilivi.cat:3000/nbuisac/projecteFlow.git
   209a904..917d473  develop -> develop

Comprovem i veiem que no tenim res a fer...

git status
On branch develop
Your branch is up to date with 'origin/develop'.

nothing to commit, working tree clean

Abans de treballar una nova branca

Abans de generar una nova branca per a treballar cal assegurar-nos que tenim la darrera versió del que tenim al repositori extern. Per aixó caldria descarregar el que hi ha i barrejar-ho amb el que tenim. En teoria, un git fetch seguit d'un git merge. Per a fer-ho d'una sola vegada farem ús de la comanda git pull.

git log
commit 209a904b6a8f39e8dd68128246b663984f89b852 (HEAD -> develop, origin/develop, origin/HEAD, feature)
Author: Narcis Buisac <nbuisac@institutmontilivi.cat>
Date:   Thu Jan 20 13:13:27 2022 +0100

    Commit de creacio del projecte

commit d247279fba9c7b371628f5ff8b18f5c49ff819a5 (origin/main)
Author: Narcis Buisac <nbuisac@institutmontilivi.cat>
Date:   Thu Jan 20 13:11:56 2022 +0100

    Initial commit
No tenim la darrera versió (potser ni ho sabem) per tant ...

git pull
remote: Counting objects: 4, done.
remote: Compressing objects: 100% (3/3), done.
remote: Total 4 (delta 0), reused 0 (delta 0)
Unpacking objects: 100% (4/4), 354 bytes | 23.00 KiB/s, done.
From http://daw.institutmontilivi.cat:3000/nbuisac/projecteFlow
   209a904..917d473  develop    -> origin/develop
Updating 209a904..917d473
Fast-forward
 FT1.txt   | 1 +
 README.md | 3 ++-
 2 files changed, 3 insertions(+), 1 deletion(-)
 create mode 100644 FT1.txt
Se'ns han afegit els nous canvis que hi havia al repositori i ara
git status
On branch develop
Your branch is up to date with 'origin/develop'.

nothing to commit, working tree clean
que no tenim res pendent podem veure com el log s'ha modificat, ja que incorpora els canvis del núvol.

git log
commit 917d47392ca511964cc42d2ad5bc291545e8d39a (HEAD -> develop, origin/develop, origin/HEAD)
Author: Narcis Buisac <nbuisac@institutmontilivi.cat>
Date:   Thu Jan 20 14:02:15 2022 +0100

    Nova feature afegida

commit 209a904b6a8f39e8dd68128246b663984f89b852 (feature)
Author: Narcis Buisac <nbuisac@institutmontilivi.cat>
Date:   Thu Jan 20 13:13:27 2022 +0100

    Commit de creacio del projecte

commit d247279fba9c7b371628f5ff8b18f5c49ff819a5 (origin/main)
Author: Narcis Buisac <nbuisac@institutmontilivi.cat>
Date:   Thu Jan 20 13:11:56 2022 +0100

    Initial commit
Ara ja estem a punt de començar amb la nostra característica determinada (feature) o resolució d'errors (hotfix) o versió de llançament (release).

Encara fem proves o ...

Podem anar fent proves amb els repositoris o bé començar a treballar. Compte no perdeu res.

Per a tenir la versió final a la branca main caldrà anar fusionant les branques acabades...

git switch develop
git merge feature
git switch main
git merge develop
Updating d247279..917d473
Fast-forward
 FT1.txt   | 1 +
 README.md | 2 ++
 2 files changed, 3 insertions(+)
 create mode 100644 FT1.txt
 create mode 100644 README.md
Si ara mirem l'estat veurem que només ens cal pujar-lo al repositori
git status
On branch main
Your branch is ahead of 'origin/main' by 2 commits.
  (use "git push" to publish your local commits)

nothing to commit, working tree clean
Fem el push i ja estem.
git push
Total 0 (delta 0), reused 0 (delta 0), pack-reused 0
To https://github.com/nbuisac/projecteFlow.git
   88a4221..3ed9f03  main -> main