From 3a2af813feb25eaa5e5c2830f604fac7e6103a07 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Wed, 16 Oct 2024 15:33:50 +0000 Subject: [PATCH] Deployed c84eb67 with MkDocs version: 1.6.1 --- apunts/050_estrategies_ramificacio/index.html | 63 ++++++++ apunts/051_exemple_ramificacio/index.html | 149 +----------------- files/gitflow/gitflow_example.py | 51 ++++++ search/search_index.json | 2 +- 4 files changed, 123 insertions(+), 142 deletions(-) diff --git a/apunts/050_estrategies_ramificacio/index.html b/apunts/050_estrategies_ramificacio/index.html index d3bb45e..dfb2c32 100644 --- a/apunts/050_estrategies_ramificacio/index.html +++ b/apunts/050_estrategies_ramificacio/index.html @@ -703,6 +703,24 @@ + + +
  • + + + Branques de publicació + + + +
  • + +
  • + + + Branques de correcció + + +
  • @@ -1289,6 +1307,24 @@ + + +
  • + + + Branques de publicació + + + +
  • + +
  • + + + Branques de correcció + + +
  • @@ -1901,6 +1937,33 @@

    Fusió merge --squashBranques de publicació

    +

    Les branques de publicació són branques temporals +que s'utilitzen per a preparar la publicació d'una versió.

    +

    Normalment, el prefix de les branques de publicació és release/.

    +

    Aquestes branques es creen a partir de la branca de desenvolupament develop +i s'utilitzen per a realitzar tasques com:

    + +

    Una vegada acabades aquestes tasques, s'ha fusionar a la branca principal main +i a la branca de desenvolupament develop.

    +

    @TODO: Figura branques de publicació

    +

    Branques de correcció

    +

    Les branques de correcció són branques temporals +que s'utilitzen per a corregir errors crítics en el codi estable del projecte, +quan la seua correcció no pot esperar a la següent versió.

    +

    Normalment, el prefix de les branques de correcció és hotfix/.

    +

    El flux de treball amb aquestes branques és el següent:

    + +

    @TODO: Figura branques de correcció

    Bibliografia

    - - @@ -1351,16 +1327,6 @@ -
  • - - - Branques de publicació - - - - -
  • - -
  • - - - Branques de correcció - - - -
  • - - - - @@ -2425,131 +2377,46 @@

    Integració de feature/author< -

    Branques de publicació

    -

    Les branques de publicació són branques temporals -que s'utilitzen per a preparar la publicació d'una versió.

    -

    Normalment, el prefix de les branques de publicació és release/.

    -

    Aquestes branques es creen a partir de la branca de desenvolupament develop -i s'utilitzen per a realitzar tasques com:

    - -

    Una vegada acabades aquestes tasques, s'ha fusionar a la branca principal main -i a la branca de desenvolupament develop.

    -

    Publicació de la versió 1.0.0

    +

    Publicació de la versió 1.0.0

    Anna és l'encarregada de preparar la publicació de la versió 1.0.0.

    Els passos que ha de seguir són:

    1. Actualitzar la branca develop amb els canvis del remot.

      -
      anna@fp:~/gitflow/anna (develop) $ git checkout develop
      -Switched to branch 'develop'
      -anna@fp:~/gitflow/anna (develop) $ git pull
      -From /home/joapuiib/gitflow/remot
      -   4e753b7..c6f2edb  develop    -> origin/develop
      -Updating 4e753b7..c6f2edb
      -Fast-forward
      - LICENSE | 4 ++++
      - 1 file changed, 4 insertions(+)
      - create mode 100644 LICENSE
      +
      
       
    2. Crear la branca de publicació release/v1.0.0 a partir de la branca develop.

      -
      anna@fp:~/gitflow/anna (develop) $ git checkout -b release/v1.0.0
      -Switched to a new branch 'release/v1.0.0'
      +
      
       
    3. Realitzar les tasques necessàries per a preparar la publicació de la versió 1.0.0.

      -
      anna@fp:~/gitflow/anna (release/v1.0.0) $ echo "1.0.0" > VERSION
      -anna@fp:~/gitflow/anna (release/v1.0.0) $ git add VERSION
      -anna@fp:~/gitflow/anna (release/v1.0.0) $ git commit -m "Versió 1.0.0"
      -[release/v1.0.0 4b893fa] Versió 1.0.0
      - 1 file changed, 1 insertion(+)
      - create mode 100644 VERSION
      -anna@fp:~/gitflow/anna (release/v1.0.0) $ git lga
      -* 4b893fa - (1 second ago) Versió 1.0.0 - Anna (HEAD -> release/v1.0.0)
      -* ee85113 - (6 seconds ago) Merge branch 'feature/authors' - Mar (develop, origin/develop)
      -* 94d2475 - (6 seconds ago) Merge branch 'feature/license' - Pau
      -* 21392d8 - (6 seconds ago) Merge branch 'feature/readme' - Anna
      -* 8402918 - (6 seconds ago) 1. Primer commit - Joan Puigcerver (main, origin/main)
      +
      
       
    4. Crear i publicar una etiqueta amb la versió 1.0.0.

      -
      anna@fp:~/gitflow/anna (release/v1.0.0) $ git tag "v1.0.0"
      -anna@fp:~/gitflow/anna (release/v1.0.0) $ git push origin v1.0.0
      -anna@fp:~/gitflow/anna (release/v1.0.0) $ git lga
      -* 4b893fa - (1 second ago) Versió 1.0.0 - Anna (HEAD -> release/v1.0.0, tag: v1.0.0)
      -* ee85113 - (6 seconds ago) Merge branch 'feature/authors' - Mar (develop, origin/develop)
      -* 94d2475 - (6 seconds ago) Merge branch 'feature/license' - Pau
      -* 21392d8 - (6 seconds ago) Merge branch 'feature/readme' - Anna
      -* 8402918 - (6 seconds ago) 1. Primer commit - Joan Puigcerver (main, origin/main)
      +
      
       
    5. Integrar aquesta branca a la branca de desenvolupament develop i publicar-la.

      -
      anna@fp:~/gitflow/anna (release/v1.0.0) $ git checkout develop
      -Switched to branch 'develop'
      -anna@fp:~/gitflow/anna (develop) $ git merge --ff-only release/v1.0.0
      -Updating 8402918..4b893fa
      -Fast-forward
      - VERSION   | 1 +
      - 1 files changed, 1 insertions(+)
      - create mode 100644 VERSION
      -anna@fp:~/gitflow/anna (develop) $ git push
      -To /home/joapuiib/gitflow/remot
      -   ee84113..4b893fa
      -anna@fp:~/gitflow/anna (develop) $ git lga
      -* 4b893fa - (1 second ago) Versió 1.0.0 - Anna (HEAD -> develop, release/v1.0.0, tag: v1.0.0, origin/develop)
      -* ee85113 - (6 seconds ago) Merge branch 'feature/authors' - Mar
      -* 94d2475 - (6 seconds ago) Merge branch 'feature/license' - Pau
      -* 21392d8 - (6 seconds ago) Merge branch 'feature/readme' - Anna
      -* 8402918 - (6 seconds ago) 1. Primer commit - Joan Puigcerver (main, origin/main)
      +
      
       
    6. Integrar aquesta branca a la branca principal main i publicar els canvis.

      -
      anna@fp:~/gitflow/anna (release/v1.0.0) $ git checkout main
      -Switched to branch 'main'
      -anna@fp:~/gitflow/anna (main) $ git merge --ff-only release/v1.0.0
      -Updating 8402918..4b893fa
      -Fast-forward
      - LICENSE   | 4 ++++
      - README.md | 4 ++++
      - VERSION   | 1 +
      - 3 files changed, 9 insertions(+)
      - create mode 100644 LICENSE
      - create mode 100644 VERSION
      -anna@fp:~/gitflow/anna (main) $ git push
      -To /home/joapuiib/gitflow/remot
      -   e68db39..0cb1dbc  main -> main
      -anna@fp:~/gitflow/anna (main) $ git lga
      -* 4b893fa - (1 second ago) Versió 1.0.0 - Anna (HEAD -> main, develop, release/v1.0.0, tag: v1.0.0, origin/main, origin/develop)
      -* ee85113 - (6 seconds ago) Merge branch 'feature/authors' - Mar
      -* 94d2475 - (6 seconds ago) Merge branch 'feature/license' - Pau
      -* 21392d8 - (6 seconds ago) Merge branch 'feature/readme' - Anna
      -* 8402918 - (6 seconds ago) 1. Primer commit - Joan Puigcerver
      +
      
       
    7. Eliminar la branca de publicació.

      -
      anna@fp:~/gitflow/anna (main) $ git branch -d release/v1.0.0
      -Deleted branch 'release/v1.0.0' (was 4b893fa)
      -anna@fp:~/gitflow/anna (main) $ git lga
      -* 4b893fa - (1 second ago) Versió 1.0.0 - Anna (HEAD -> main, develop, tag: v1.0.0, origin/main, origin/develop)
      -* ee85113 - (6 seconds ago) Merge branch 'feature/authors' - Mar
      -* 94d2475 - (6 seconds ago) Merge branch 'feature/license' - Pau
      -* 21392d8 - (6 seconds ago) Merge branch 'feature/readme' - Anna
      -* 8402918 - (6 seconds ago) 1. Primer commit - Joan Puigcerver
      +
      
       
    -

    Branques de correcció

    diff --git a/files/gitflow/gitflow_example.py b/files/gitflow/gitflow_example.py index 6833df4..6d1235f 100644 --- a/files/gitflow/gitflow_example.py +++ b/files/gitflow/gitflow_example.py @@ -401,3 +401,54 @@ def rm(self, filename): x.x('git lga') print('===================================================') +x.set_file('stdout/release_pull.txt') +x.rm_file() +x.set_user('anna') + +x.run('cd ~/gitflow/') +x.x('cd ~/gitflow/anna') +x.x('git checkout develop') +x.x('git pull --ff-only') +x.x('git lga') + +print('===================================================') +x.set_file('stdout/release_create.txt') +x.rm_file() + +x.x('git checkout -b release/v1.0.0') +x.x('git lga') + +print('===================================================') +x.set_file('stdout/release.txt') +x.rm_file() + +x.x('echo "v1.0.0" > VERSION') +x.x('git add VERSION') +x.x('git commit -m "Publicada versió: v1.0.0"') +x.x('git lga') + +print('===================================================') +x.set_file('stdout/release_tag.txt') +x.rm_file() + +x.x('git tag v1.0.0') +x.x('git lga') + +print('===================================================') +x.set_file('stdout/release_merge_develop.txt') +x.rm_file() + +x.x('git checkout develop') +x.x('git merge --ff-only release/v1.0.0') +x.x('git push') +x.x('git lga') + +print('===================================================') +x.set_file('stdout/release_merge_main.txt') +x.rm_file() + +x.x('git checkout main') +x.x('git merge --ff-only release/v1.0.0') +x.x('git push') +x.x('git push --tags') +x.x('git lga') \ No newline at end of file diff --git a/search/search_index.json b/search/search_index.json index e548e7e..ea34e86 100644 --- a/search/search_index.json +++ b/search/search_index.json @@ -1 +1 @@ -{"config":{"lang":["en"],"separator":"[\\s\\-]+","pipeline":["stopWordFilter"]},"docs":[{"location":"","title":"Inici","text":""},{"location":"#objectius","title":"Objectius","text":""},{"location":"#continguts","title":"Continguts","text":""},{"location":"#dirigit-a","title":"Dirigit a","text":""},{"location":"apunts/","title":"Apunts","text":""},{"location":"apunts/01_introduccio/","title":"Bloc 1: Introducci\u00f3 a Git","text":"","tags":["git add","git commit","git config","git diff","git init","git log","git status","git restore","gitconfig","gitignore"]},{"location":"apunts/01_introduccio/#que-es-git","title":"Qu\u00e8 \u00e9s Git?","text":"

    Git \u00e9s un sistema de control de versions lliure i distribu\u00eft dissenyat per gestionar xicotets i grans projectes amb rapidesa i efici\u00e8ncia. L'objectiu principal de Git \u00e9s controlar i gestionar els canvis realitzats en una enorme quantitat de fitxers d'una manera f\u00e0cil i eficient.

    Git va ser dissenyat en 2005 per Linus Torvalds, creador del kernel del sistema operatiu Linux, i des d'aleshores, s'ha convertit en una eina fonamental i imprescindible en la gesti\u00f3 de codi font en projectes col\u00b7laboratius.

    Git est\u00e0 basat en repositoris, que s'inicialitzen en un directori concret i contenen tota la informaci\u00f3 dels canvis realitzats en tot l'arbre de directoris i fitxers a partir d'aquest directori.

    Els principals objectius i caracter\u00edstiques de Git s\u00f3n:

    ","tags":["git add","git commit","git config","git diff","git init","git log","git status","git restore","gitconfig","gitignore"]},{"location":"apunts/01_introduccio/#installacio","title":"Instal\u00b7laci\u00f3","text":"

    Git est\u00e0 disponible a https://git-scm.com/ per a Windows, macOS i Linux.

    UbuntuWindows
    sudo apt update\nsudo apt install git\n

    Descarrega i executa l'instal\u00b7lador de Git des de https://git-scm.com/

    Una vegada instal\u00b7lat, pots utilitzar la consola Git Bash. \u00c9s una terminal basada l'int\u00e8rpret Bash, que et permetr\u00e0 realitzar les comandes de Git en la consola.

    Per defecte, Git utilitza l'editor ViM, un editor de text per terminal molt potent, per\u00f2 dif\u00edcil i poc intu\u00eftiu per treballar.

    Si desitgeu canviar l'editor per defecte, podeu utilitzar la seg\u00fcent comanda des de la consola:

    git config --global core.editor <editor>\n

    Editors de text

    WindowsLinuxMultiplataforma ","tags":["git add","git commit","git config","git diff","git init","git log","git status","git restore","gitconfig","gitignore"]},{"location":"apunts/01_introduccio/#per-que-la-terminal","title":"Per qu\u00e8 la terminal?","text":"

    En aquest material, utilitzarem la terminal per a interactuar amb Git, per\u00f2 aix\u00f2 no significa que siga l'\u00fanica manera de fer-ho. De fet, pr\u00e0cticament tots els entorns de desenvolupament moderns tenen integraci\u00f3 amb Git, la qual cosa permet realitzar les mateixes operacions que proporciona la terminal, per\u00f2 de manera m\u00e9s visual i intu\u00eftiva.

    No obstant aix\u00f2, \u00e9s important con\u00e9ixer com funcionen les comandes de Git en la terminal, per diferents raons:

    ","tags":["git add","git commit","git config","git diff","git init","git log","git status","git restore","gitconfig","gitignore"]},{"location":"apunts/01_introduccio/#inicialitzacio-dun-repositori-git-init","title":"Inicialitzaci\u00f3 d'un repositori (git init)","text":"

    Per a comen\u00e7ar a utilitzar Git en un projecte, primer cal inicialitzar un repositori en un directori concret.

    git init [<directory>]\n

    Aquesta comanda crea un directori ocult anomenat .git que cont\u00e9 tota la informaci\u00f3 relativa al Repositori Local.

    Documentaci\u00f3

    Documentaci\u00f3 oficial de git init: https://git-scm.com/docs/git-init

    jpuigcerver@fp:~ $ mkdir git_introduccio\njpuigcerver@fp:~ $ cd git_introduccio\njpuigcerver@fp:~/git_introduccio $ ls -a # (1)!\n.  ..\njpuigcerver@fp:~/git_introduccio $ git init\nhint: Using 'master' as the name for the initial branch. This default branch name\nhint: is subject to change. To configure the initial branch name to use in all\nhint: of your new repositoris, which will suppress this warning, call:\nhint:\nhint: git config --global init.dafaultBranch <name>\nhint:\nhint: Names commonly chosen instead of 'master' are 'main', 'trunk' and\nhint: 'development'. The just-created branch can be renamed via this command:\nhint:\nhint: git branch -m <name>\nInitialized empty Git repository in /home/jpuigcerver/git_introduccio/.git/\njpuigcerver@fp:~/git_introduccio (master) $ git branch -m main\njpuigcerver@fp:~/git_introduccio (main) $ ls -a # (2)!\n.  ..  .git/\njpuigcerver@fp:~/git_introduccio (main) $ git status\nOn branch main\n\nNo commits yet\n\nNothing to commit (create/copy files and use \"git add\" to track)\n
    1. L'opci\u00f3 -a mostra tots els fitxers, inclosos els ocults que comencen amb un punt.
    2. S'ha creat el directori ocult .git que cont\u00e9 tota la informaci\u00f3 del repositori.

    L'ordre git status ens mostra l'estat actual del nostre repositori. Podem observar que estem en la branca main i que de moment no s'ha realitzat cap canvi.

    Nota

    S'ha canviat el nom de la branca principal de master a main per a seguir les recomanacions de la comunitat de desenvolupament.

    Vegeu: Regarding Git and Branch Naming

    ","tags":["git add","git commit","git config","git diff","git init","git log","git status","git restore","gitconfig","gitignore"]},{"location":"apunts/01_introduccio/#eliminar-un-repositori","title":"Eliminar un repositori","text":"

    Per a eliminar un repositori de Git, simplement cal eliminar el directori ocult .git.

    rm -rf .git\n
    jpuigcerver@fp:~/git_introduccio (main) $ ls -a\n.  ..  .git\njpuigcerver@fp:~/git_introduccio (main) $ rm -rf .git\njpuigcerver@fp:~/git_introduccio $ git status\nfatal: not a git repository (or any of the parent directories): .git\n

    Perill

    Sigues extremadament cautel\u00f3s amb l'\u00fas de la comanda rm -rf, ja que elimina tots els fitxers, inclsos aquells protegits contra escritura.

    ","tags":["git add","git commit","git config","git diff","git init","git log","git status","git restore","gitconfig","gitignore"]},{"location":"apunts/01_introduccio/#estructura-dun-repositori-de-git","title":"Estructura d'un repositori de Git","text":"

    En aquesta introducci\u00f3, ens centrarem en com funcionen els repositoris de Git d'una manera local, on encara no haurem connectat cap repositori remot.

    Abans que res, hem de con\u00e9ixer l'estructura d'un repositori de Git.

    Figura 1: Components d'un repositori de Git.

    En la figura anterior podem observar el que es coneix com Entorn de desenvolupament o Development Enviorment. Aquesta part est\u00e0 present localment en el teu dispositiu on realitzar\u00e0s els canvis i desenvolupament del teu projecte.

    D'una altra banda, est\u00e0 el Repositori Remot, que normalment s'allotja a un servidor accessible per tots els desenvolupadors.

    Dins de l'Entorn de desenvolupament trobem els seg\u00fcents components:

    ","tags":["git add","git commit","git config","git diff","git init","git log","git status","git restore","gitconfig","gitignore"]},{"location":"apunts/01_introduccio/#flux-de-treball","title":"Flux de treball","text":"

    Quan treballes amb un projecte de Git, els canvis es realitzen sobre el Directori de treball. Aquests canvis poden ser:

    Si executem l'ordre git status, ens mostrar\u00e0 l'estat actual dels fitxers amb els tres estats anteriors de color roig.

    Aquests canvis no formen part del repositori. Abans, cal afegir-los a l'\u00c0rea de preparaci\u00f3 amb la comanda git add, que canviar\u00e0 l'estat dels fitxers Staged (mostrat en color verd amb git status).

    Per \u00faltim, tots els canvis de l'\u00c0rea de preparaci\u00f3 es poden confirmar i fer efectius en el Repositori local amb la comanda git commit.

    Figura 2: Flux de treball en un repositori de Git.

    Info

    La comanda git restore es presenta a l'apartat Descartar canvis.

    Documentaci\u00f3

    Documentaci\u00f3 oficial de:

    ","tags":["git add","git commit","git config","git diff","git init","git log","git status","git restore","gitconfig","gitignore"]},{"location":"apunts/01_introduccio/#afegir-fitxers-a-larea-de-preparacio-git-add","title":"Afegir fitxers a l'\u00c0rea de Preparaci\u00f3 (git add)","text":"

    Afegim el primer fitxer README.md al nostre repositori.

    Info

    \u00c9s recomanable crear un fitxer README.md en tots els projectes per a descriure el seu prop\u00f2sit, com s'utilitza i qualsevol altra informaci\u00f3 rellevant.

    jpuigcerver@fp:~/git_introduccio (main) $ echo \"# 01 - Introducci\u00f3 a Git\" > README.md\njpuigcerver@fp:~/git_introduccio (main) $ echo \"Estem aprenent a utilitzar Git!\" >> README.md\njpuigcerver@fp:~/git_introduccio (main) $ cat README.md\n# 01 - Introducci\u00f3 a Git\nEstem aprenent a utilitzar Git!\njpuigcerver@fp:~/git_introduccio (main) $ git status\nOn branch main\n\nNo commits yet\n\nUntracked files:\n  (use \"git add <file>...\" to include in what will be committed)\n        README.md\n\nNothing added to commit but untracked files present (use \"git add\" to track)\n

    S'ha creat el fitxer README.md i s'ha afegit el seu contingut. Aquest fitxer resideix en el Directori de treball.

    La comanda git status ens mostra que no s'est\u00e0 realitzant cap seguiment del fitxer README.md, que es troba en l'estat Untracked.

    Figura 3: Fitxer sense seguiment (untracked).

    Per afegir els canvis al nostre repositori, el seg\u00fcent pas \u00e9s afegir els canvis a l'\u00c0rea de Preparaci\u00f3 amb l'ordre git add. Aquesta comanda permet especificar quins canvis es desitja afegir.

    Info

    git add <path>\n
    jpuigcerver@FP:~/git_introduccio (main) $ git add README.md\njpuigcerver@FP:~/git_introduccio (main) $ git status\nOn branch main\n\nNo commits yet\n\nChanges to be committed:\n  (use \"git rm --cached <file>...\" to unstage)\n        new file:   README.md\n

    Vegem com el fitxer README.md ha passat a l'estat Staged i est\u00e0 preparat per a ser confirmat.

    Figura 4: Fitxer a l'\u00e0rea de preparaci\u00f3.","tags":["git add","git commit","git config","git diff","git init","git log","git status","git restore","gitconfig","gitignore"]},{"location":"apunts/01_introduccio/#confirmar-canvis-git-commit","title":"Confirmar canvis (git commit)","text":"

    Una vegada afegits tots els canvis a l'\u00c0rea de Preparaci\u00f3, ja podem confirmar-los mitjan\u00e7ant l'ordre git commit.

    git commit [-a] [-m \"<message>\"]\n

    Warning

    Si no s'especifica el missatge amb -m, s'obrir\u00e0 l'editor per defecte(1) per a introduir el missatge del commit.

    1. ViM per defecte. Pot ser configurat:
      git config --global core.editor <editor>\n
    Figura 5: Estat del repositori de Git abans de fer un `commit`.

    Aquesta ordre crea un nou commit, que \u00e9s una instant\u00e0nia de l'estat actual dels fitxers del repositori i que cont\u00e9 tota la informaci\u00f3 relativa als canvis realitzats.

    Cadascun dels commit cont\u00e9 la seg\u00fcent informaci\u00f3:

    Per tant, abans de realitzar un commit, \u00e9s necessari configurar el nom i el correu electr\u00f2nic de l'autor.

    git config --global user.name <name>\ngit config --global user.email <email>\n
    jpuigcerver@FP:~/git_introduccio (main) $ git config --global user.name \"Joan Puigcerver Ib\u00e1\u00f1ez\"\njpuigcerver@FP:~/git_introduccio (main) $ git config --global user.email \"j.puigcerveribanez@edu.gva.es\"\n

    Amb aquesta informaci\u00f3 configurada, ja podem realitzar el nostre primer commit.

    jpuigcerver@FP:~/git_introduccio (main) $ git status\nOn branch main\n\nNo commits yet\n\nChanges to be committed:\n  (use \"git rm --cached <file>...\" to unstage)\n        new file:   README.md\njpuigcerver@FP:~/git_introduccio (main) $ git commit -m \"Added README.md\"\n[main (root-commit) 8e70293] Added README.md\n 1 file changed, 2 insertions(+)\n create mode 100644 README.md\njpuigcerver@FP:~/git_introduccio (main) $ git status\nOn branch main\n\nnothing to commit, working tree clean\n

    Vegem que l'estat del nostre repositori ha canviat i ja no hi ha canvis pendents de confirmar. A m\u00e9s, s'ha creat el primer commit amb el missatge Added README.md i identificador 8e70293.

    Figura 6: Estat del repositori de Git despr\u00e9s de fer un `commit`.

    Podem consultar la informaci\u00f3 del nou commit amb l'ordre git show.

    jpuigcerver@FP:~/git_introduccio (main) $ git show 8e70293\ncommit 8e702933d5dbec9ee71100a1599ae4491085e1aa (HEAD -> main)\nAuthor: Joan Puigcerver Ib\u00e1\u00f1ez <j.puigcerveribanez@edu.gva.es>\nDate:   Fri Oct 13 16:06:59 2023 +0200\n\n    Added README.md\n\ndiff --git a/README.md b/README.md\nnew file mode 100644\nindex 0000000..6d747b3\n--- /dev/null\n+++ b/README.md\n@@ -0,0 +1,2 @@\n+# 01 - Introducci\u00f3 a Git\n+Estem aprenent a utilitzar Git!\n
    ","tags":["git add","git commit","git config","git diff","git init","git log","git status","git restore","gitconfig","gitignore"]},{"location":"apunts/01_introduccio/#diferencies-entre-versions-git-diff","title":"Difer\u00e8ncies entre versions (git diff)","text":"

    Una ferramenta molt \u00fatil de Git \u00e9s git diff, que permet comparar les difer\u00e8ncies entre els canvis realitzats en el Directori de treball o l'\u00c0rea de Preparaci\u00f3 respecte del Repositori local.

    La sintaxi amb les opcions b\u00e0siques es:

    git diff [--staged] [<path>]\n

    Documentaci\u00f3

    Documentaci\u00f3 oficial de git diff: https://git-scm.com/docs/git-diff

    Figura 7: Resum de `git diff`.

    Difer\u00e8ncies entre el Directori de treball i el Repositori local

    Observem les difer\u00e8ncies entre el fitxer README.md del Directori de treball i el Repositori local.

    jpuigcerver@FP:~/git_introduccio (main) $ echo \"Aquesta \u00e9s una l\u00ednia nova\" >> README.md\njpuigcerver@FP:~/git_introduccio (main) $ git status\nOn branch main\n\nChanges not staged for commit:\n  (use \"git add <file>...\" to update what will be committed)\n  (use \"git restore <file>...\" to discard changes in working directory)\n        modified:   README.md\n\nno changes added to commit (use \"git add\" and/or \"git commit -a\")\njpuigcerver@FP:~/git_introduccio (main) $ git diff\ndiff --git a/README.md b/README.md\nindex 6d747b3..f3b3b3e 100644\n--- a/README.md\n+++ b/README.md\n@@ -1,2 +1,3 @@\n # 01 - Introducci\u00f3 a Git\n Estem aprenent a utilitzar Git!\n+Aquesta \u00e9s una l\u00ednia nova\n

    Difer\u00e8ncies entre l'\u00c0rea de Preparaci\u00f3 i el Repositori local

    Observem les difer\u00e8ncies entre el fitxer README.md de l'\u00c0rea de Preparaci\u00f3 i el Repositori local.

    jpuigcerver@FP:~/git_introduccio (main) $ git add README.md\njpuigcerver@FP:~/git_introduccio (main) $ git status\nOn branch main\n\nChanges to be committed:\n  (use \"git restore --staged <file>...\" to unstage)\n        modified:   README.md\n\njpuigcerver@FP:~/git_introduccio (main) $ git diff --staged\ndiff --git a/README.md b/README.md\nindex 6d747b3..f3b3b3e 100644\n--- a/README.md\n+++ b/README.md\n@@ -1,2 +1,3 @@\n # 01 - Introducci\u00f3 a Git\n Estem aprenent a utilitzar Git!\n+Aquesta \u00e9s una l\u00ednia nova\n

    Interpretaci\u00f3 de git diff

    El format de les l\u00ednies de git diff \u00e9s el seg\u00fcent:

    Despr\u00e9s, es mostren les l\u00ednies modificades:

    En l'exemple anterior, s'ha afegit la l\u00ednia Aquesta \u00e9s una l\u00ednia nova al fitxer README.md.

    ","tags":["git add","git commit","git config","git diff","git init","git log","git status","git restore","gitconfig","gitignore"]},{"location":"apunts/01_introduccio/#descartar-canvis-git-restore","title":"Descartar canvis (git restore)","text":"

    Una altra ferramenta \u00fatil de Git \u00e9s git restore, que permet descartar els canvis realitzats en els fitxers del Directori de treball o l'\u00c0rea de Preparaci\u00f3.

    La sintaxi amb les opcions b\u00e0siques \u00e9s:

    git restore [--staged] <path>\n

    Podeu consultar la Figura 2 per a veure un resum del comportament de git restore.

    Documentaci\u00f3

    Documentaci\u00f3 oficial de git restore: https://git-scm.com/docs/git-restore

    Perill

    La comanda git restore descarta els canvis realitzats en els fitxers sense possibilitat de recuperar-los.

    Descartar canvis en l'\u00c0rea de Preparaci\u00f3

    Continuant amb l'exemple anterior, descartem els canvis realitzats en el fitxer README.md de l'\u00c0rea de Preparaci\u00f3.

    jpuigcerver@FP:~/git_introduccio (main) $ git status\nOn branch main\n\nChanges to be committed:\n  (use \"git restore --staged <file>...\" to unstage)\n        modified:   README.md\n\njpuigcerver@FP:~/git_introduccio (main) $ git diff --staged\ndiff --git a/README.md b/README.md\nindex 6d747b3..f3b3b3e 100644\n--- a/README.md\n+++ b/README.md\n@@ -1,2 +1,3 @@\n # 01 - Introducci\u00f3 a Git\n Estem aprenent a utilitzar Git!\n+Aquesta \u00e9s una l\u00ednia nova\njpuigcerver@FP:~/git_introduccio (main) $ git restore --staged README.md\njpuigcerver@FP:~/git_introduccio (main) $ git status\nOn branch main\n\nChanges not staged for commit:\n  (use \"git add <file>...\" to update what will be committed)\n  (use \"git restore <file>...\" to discard changes in working directory)\n        modified:   README.md\n

    Descartar canvis en el Directori de treball

    Descartem els canvis realitzats en el fitxer README.md del Directori de treball.

    Danger

    Aquesta comanda descartar\u00e0 els canvis realitzats en el fitxer README.md sense possibilitat de recuperar-los.

    jpuigcerver@FP:~/git_introduccio (main) $ git status\nOn branch main\n\nChanges not staged for commit:\n  (use \"git add <file>...\" to update what will be committed)\n  (use \"git restore <file>...\" to discard changes in working directory)\n        modified:   README.md\n\nno changes added to commit (use \"git add\" and/or \"git commit -a\")\njpuigcerver@FP:~/git_introduccio (main) $ git diff\ndiff --git a/README.md b/README.md\nindex 6d747b3..f3b3b3e 100644\n--- a/README.md\n+++ b/README.md\n@@ -1,2 +1,3 @@\n # 01 - Introducci\u00f3 a Git\n Estem aprenent a utilitzar Git!\n+Aquesta \u00e9s una l\u00ednia nova\njpuigcerver@FP:~/git_introduccio (main) $ git restore README.md\njpuigcerver@FP:~/git_introduccio (main) $ git status\nOn branch main\n\nnothing to commit, working tree clean\n
    ","tags":["git add","git commit","git config","git diff","git init","git log","git status","git restore","gitconfig","gitignore"]},{"location":"apunts/01_introduccio/#historic-de-canvis-git-log","title":"Hist\u00f2ric de canvis (git log)","text":"

    Git registra tots els canvis confirmats (commit) en el Repositori local. L'hist\u00f2ric de canvis es pot consultar amb l'ordre git log.

    git log [options]\n

    Documentaci\u00f3

    Consulta totes les opcions a la documentaci\u00f3 oficial de git log: https://git-scm.com/docs/git-log

    Hist\u00f2ric de canvis

    Modifiquem novament el fitxer README.md i realitzem un nou commit.

    jpuigcerver@FP:~/git_introduccio (main) $ echo \"Aquesta \u00e9s una altra l\u00ednia\" >> README.md\njpuigcerver@FP:~/git_introduccio (main) $ git commit -a -m \"Added another line to README.md\"# (1)!\n[main c9fc6c8] Added another line to README.md\n 1 file changed, 1 insertions(+)\n
    1. Amb -a afegim tots els canvis realitzats al fitxer README.md a l'\u00c0rea de Preparaci\u00f3 sense necessitat de git add.

    Consultem l'hist\u00f2ric de canvis amb git log.

    jpuigcerver@FP:~/git_introduccio (main) $ git log\ncommit c9fc6c856c2d52744b85a6f8d92feac496e60bd6 (HEAD -> main)\nAuthor: Joan Puigcerver <j.puigcerveribanez@edu.gva.es>\nDate:   Mon Oct 16 11:43:20 2023 +0200\n\n    Added another line to README.md\n\ncommit 8e702933d5dbec9ee71100a1599ae4491085e1aa\nAuthor: Joan Puigcerver <j.puigcerveribanez@edu.gva.es>\nDate:   Fri Oct 13 16:06:59 2023 +0200\n\n    Added Readme.md\n

    S'observa tota la informaci\u00f3 dels commit realitzats, com l'autor, la data, el missatge i l'identificador.

    L'ordre git log admet moltes opcions per a personalitzar com es mostren els commit i la seua informaci\u00f3.

    Una possible combicaci\u00f3 d'opcions per visualitzar l'hist\u00f2ric de canvis de manera m\u00e9s compacta i intu\u00eftiva \u00e9s:

    git log --graph --abbrev-commit --decorate --format=format:'%C(bold blue)%h%C(reset) - %C(bold green)(%ar)%C(reset) %C(white)%s%C(reset) %C(dim white)- %an%C(reset)%C(bold yellow)%d%C(reset)'\n

    Hist\u00f2ric de canvis compacte

    jpuigcerver@FP:~/git_introduccio (main) $ git log --graph --abbrev-commit --decorate --format=format:'%C(bold blue)%h%C(reset) - %C(bold green)(%ar)%C(reset) %C(white)%s%C(reset) %C(dim white)- %an%C(reset)%C(bold yellow)%d%C(reset)'\n* c9fc6c8 - (2 minutes ago) Added another line to README.md - Joan Puigcerver (HEAD -> main)\n* 8e70293 - (3 days ago) Added Readme.md - Joan Puigcerver\n

    No obstant aix\u00f2, no \u00e9s pr\u00e0ctic recordar aquesta comanda. Per aix\u00f2, podem configurar un alias per a simplificar la seua crida.

    git config --global alias.lg \"log --graph --abbrev-commit --decorate --format=format:'%C(bold blue)%h%C(reset) - %C(bold green)(%ar)%C(reset) %C(white)%s%C(reset) %C(dim white)- %an%C(reset)%C(bold yellow)%d%C(reset)'\"\ngit config --global alias.lga \"lg --all\"\n

    Hist\u00f2ric de canvis compacte amb \u00e0lias

    Despr\u00e9s de configurar l'\u00e0lias git lg per a l'ordre anterior, podem cridar-lo de la seg\u00fcent manera:

    jpuigcerver@FP:~/git_introduccio (main) $ git lg\n* c9fc6c8 - (2 minutes ago) Added another line to README.md - Joan Puigcerver (HEAD -> main)\n* 8e70293 - (3 days ago) Added README.md - Joan Puigcerver\n
    ","tags":["git add","git commit","git config","git diff","git init","git log","git status","git restore","gitconfig","gitignore"]},{"location":"apunts/01_introduccio/#configuracio-git-config","title":"Configuraci\u00f3 (git config)","text":"

    Git permet configurar diferents par\u00e0metres per a personalitzar el seu comportament mitjan\u00e7ant l'ordre git config.

    git config [--global] <key> <value>\n

    Fixa't

    Fixeu-vos que ja hem utilitzat aquesta comanda per configurar els seg\u00fcents aspectes:

    ","tags":["git add","git commit","git config","git diff","git init","git log","git status","git restore","gitconfig","gitignore"]},{"location":"apunts/01_introduccio/#fitxer-de-configuracio-gitconfig","title":"Fitxer de configuraci\u00f3 (.gitconfig)","text":"

    La configuraci\u00f3 --global s'emmagatzema en el fitxer .gitconfig, situat del directori de l'usuari.

    LinuxWindows
    /home/<username>/.gitconfig\n
    C:\\Users\\<username>\\.gitconfig\n

    Exemple configuraci\u00f3

    [core]\n    editor = vim # Editor per defecte\n\n[init]\n    defaultBranch = main # Nom de la branca principal per defecte\n\n[user]\n    name = Joan Puigcerver Ib\u00e1\u00f1ez\n    email = j.puigcerveribanez@edu.gva.es\n\n[alias]\n    lg = log --graph --abbrev-commit --decorate --format=format:'%C(bold blue)%h%C(reset) - %C(bold green)(%ar)%C(reset) %C(white)%s%C(reset) %C(dim white)- %an%C(reset)%C(bold yellow)%d%C(reset)'\n    lga = lg --all\n
    ","tags":["git add","git commit","git config","git diff","git init","git log","git status","git restore","gitconfig","gitignore"]},{"location":"apunts/01_introduccio/#ignorar-fitxers-gitignore","title":"Ignorar fitxers (.gitignore)","text":"

    En un projecte, hi ha fitxers que no volem incloure en el repositori, com arxius temporals, binaris o fitxers de configuraci\u00f3. Git permet ignorar aquests fitxers mitjan\u00e7ant el fitxer .gitignore, que cont\u00e9 una llista de patrons de fitxers els quals Git no tindr\u00e0 en compte.

    Aquest fitxer pot estar situat en qualsevol directori del repositori i Git ignorar\u00e0 per a tots els fitxers i subdirectoris d'aquest que complisquen algun dels patrons especificats.

    Documentaci\u00f3

    Documentaci\u00f3 oficial de .gitignore: https://git-scm.com/docs/gitignore

    Llista de patrons:

    Exemple de .gitignore

    # ignore ALL .log files\n*.log\n\n# ignore ALL files in ANY directory named temp\ntemp/\n
    jpuigcerver@FP:~/git_introduccio (main) $ mkdir temp\njpuigcerver@FP:~/git_introduccio (main) $ touch temp/file.txt\njpuigcerver@FP:~/git_introduccio (main) $ git status\nOn branch main\n\nUntracked files:\n  (use \"git add <file>...\" to include in what will be committed)\n        temp/file.txt\n\nnothing added to commit but untracked files present (use \"git add\" to track)\njpuigcerver@FP:~/git_introduccio (main) $ echo \"temp/\" > .gitignore\njpuigcerver@FP:~/git_introduccio (main) $ git status # (1)!\nOn branch main\n\nUntracked files:\n  (use \"git add <file>...\" to include in what will be committed)\n        .gitignore\n\nnothing added to commit but untracked files present (use \"git add\" to track)\n
    1. El fitxer temp/file.txt no apareix en l'estat del repositori despr\u00e9s de crear el fitxer .gitignore.
    ","tags":["git add","git commit","git config","git diff","git init","git log","git status","git restore","gitconfig","gitignore"]},{"location":"apunts/01_introduccio/#recursos-addicionals","title":"Recursos addicionals","text":"","tags":["git add","git commit","git config","git diff","git init","git log","git status","git restore","gitconfig","gitignore"]},{"location":"apunts/01_introduccio/#bibliografia","title":"Bibliografia","text":"","tags":["git add","git commit","git config","git diff","git init","git log","git status","git restore","gitconfig","gitignore"]},{"location":"apunts/02_branques/","title":"Bloc 2: Branques","text":"","tags":["conflictes","fast-forward","git branch","git checkout","git merge","git rebase","git switch","HEAD"]},{"location":"apunts/02_branques/#introduccio","title":"Introducci\u00f3","text":"

    Les branques s\u00f3n una de les caracter\u00edstiques m\u00e9s importants de Git, que permet el desenvolupament col\u00b7laboratiu i en paral\u00b7lel d'un projecte.

    Moltes de les estrat\u00e8gies de Git per desenvolupar projectes es basen a realitzar els canvis en branques independents que, una vegada acabades, s'integren en la branca principal. La branca principal d'un projecte originalment s'anomenava master, per\u00f2 \u00faltimament \u00e9s preferible utilitzar el nom main per evitar la nomenclatura master/slave (amo/esclau), que t\u00e9 connotacions racistes.

    Info

    S'ha canviat el nom de la branca principal de master a main per a seguir les recomanacions de la comunitat de desenvolupament.

    Vegeu: Regarding Git and Branch Naming

    Preparaci\u00f3 repositori d'exemple

    En aquest material treballarem sobre un nou repositori local.

    Inicialitzaci\u00f3:

    git init ~/git_branques\ncd ~/git_branques\necho \"# Bloc: Branques\" > README.md\ngit add README.md\ngit commit -m \"T\u00edtol\"\n

    jpuigcerver@fp:~ $ git init ~/git_branques\nInitialized empty Git repository in /home/jpuigcerver/git_branques/.git/\njpuigcerver@fp:~ $ cd ~/git_branques\njpuigcerver@fp:~/git_branques (main) $ branch -m main # (1)!\njpuigcerver@fp:~/git_branques (main) $ echo \"# Bloc: Branques\" > README.md\njpuigcerver@fp:~/git_branques (main) $ git add README.md\njpuigcerver@fp:~/git_branques (main) $ git commit -m \"T\u00edtol\"\n[master (root-commit) 0b1b3b4] T\u00edtol\n 1 file changed, 1 insertion(+)\n create mode 100644 README.md\njpuigcerver@fp:~/git_branques (main) $ git lg\n* 0b1b3b4 - (3 minutes ago) T\u00edtol - Joan Puigcerver (HEAD -> main)\n
    1. Canviem el nom de la branca principal a main.
    ","tags":["conflictes","fast-forward","git branch","git checkout","git merge","git rebase","git switch","HEAD"]},{"location":"apunts/02_branques/#branques","title":"Branques","text":"

    Una branca \u00e9s una l\u00ednia de desenvolupament independent. En Git, una branca \u00e9s un simple punter a un commit, que avan\u00e7a a mesura que es fan nous commits sobre aquesta.

    Figura 1: Estructura de branques inicial.

    Exemple

    L'estructura de branques inicial del repositori que utilitzarem en aquest material \u00e9s la seg\u00fcent \u00e9s el que es mostra a la Figura 1.

    jpuigcerver@fp:~/git_branques (main) $ git lg\n* 0b1b3b4 - (3 minutes ago) T\u00edtol - Joan Puigcerver (HEAD -> main)\n

    Vegem que tenim un \u00fanic commit amb l'identificador 0b1b3b4. A m\u00e9s, existeix una \u00fanica branca anomenada main que apunta a aquest commit.

    Tamb\u00e9 observem que el HEAD apunta a la branca main, indicant que \u00e9s la branca activa i que el Directori de Treball es troba en aquest estat.

    Es veur\u00e0 amb m\u00e9s detall a l'apartat Canviar de branca.

    La ordre git branch ens permet veure i manipular les branques d'un repositori.

    Documentaci\u00f3

    Documentaci\u00f3 de la ordre git branch: https://git-scm.com/docs/git-branch

    ","tags":["conflictes","fast-forward","git branch","git checkout","git merge","git rebase","git switch","HEAD"]},{"location":"apunts/02_branques/#mostrar-les-branques","title":"Mostrar les branques","text":"

    Per mostrar les branques d'un repositori, utilitzem l'ordre:

    git branch [--list] [-a | --all] [-v | --verbose]\n
    L'ordre git branch mostra les branques si:

    M\u00e9s opcions:

    Exemple

    Mostrem les branques del nostre repositori.

    jpuigcerver@fp:~/git_branques (main) $ git branch\n* main\n

    Vegem que tenim una \u00fanica branca anomenada main.

    ","tags":["conflictes","fast-forward","git branch","git checkout","git merge","git rebase","git switch","HEAD"]},{"location":"apunts/02_branques/#crear-una-branca","title":"Crear una branca","text":"

    Per crear una nova branca, utilitzem l'ordre:

    git branch [-f | --force] <nom>\n

    Aquesta ordre indicar\u00e0 amb un * la branca activa (on es troba el HEAD).

    Advert\u00e8ncia

    Si ja existeix una branca amb el mateix nom i no s'utilitza l'opci\u00f3 -f o --force, l'ordre mostrar\u00e0 un error i no es crear\u00e0 la branca.

    Exemple

    Creem la branca docs.

    jpuigcerver@fp:~/git_branques (main) $ git branch docs\njpuigcerver@fp:~/git_branques (main) $ git branch\n* main\n  docs\njpuigcerver@fp:~/git_branques (main) $ git lg\n* 0b1b3b4 - (3 minutes ago) T\u00edtol - Joan Puigcerver (HEAD -> main, docs)\n

    Vegem que s'ha creat la branca docs que apunta al commit 0b1b3b4. Vegem que la branca activa continua sent main.

    Figura 2: Estructura de branques despr\u00e9s de crear la branca docs.

    ","tags":["conflictes","fast-forward","git branch","git checkout","git merge","git rebase","git switch","HEAD"]},{"location":"apunts/02_branques/#canviar-de-branca","title":"Canviar de branca","text":"

    Existeixen dues ordres per canviar de branca, cadascuna amb la seva pr\u00f2pia sintaxi i opcions:

    git checkout <nom>\ngit switch <nom>\n

    Originalment, s'utilitzava l'ordre git checkout per canviar de branca, per\u00f2 com que aquesta ordre t\u00e9 moltes altres funcions, s'ha introdu\u00eft l'ordre git switch a partir de la versi\u00f3 2.23 de Git per evitar confusions.

    Documentaci\u00f3

    Info

    M\u00e9s informaci\u00f3: Stack Overflow: What's the difference between 'git switch' and 'git checkout' <branch>?

    En qualsevol cas, canviar de branca significa moure el punter HEAD a la branca desitjada. El canvi de branca tamb\u00e9 implica modificar el contingut del Directori de Treball a l'estat del commit al qual apunta la branca.

    La Figura 2 mostra l'estat del repositori quan el HEAD apunta a la branca main. La Figura 3 mostra l'estat del repositori despr\u00e9s de canviar a la branca docs.

    Figura 3: Estructura de branques despr\u00e9s de canviar a la branca docs.

    Example

    Podeu observar com l'estat del repositori \u00e9s el mateix, ja que les dues branques apunten al mateix commit, per\u00f2 el HEAD apunta a la branca docs.

    jpuigcerver@fp:~/git_branques (main) $ git branch\n* main\n  docs\njpuigcerver@fp:~/git_branques (main) $ git lg\n* 0b1b3b4 - (3 minutes ago) T\u00edtol - Joan Puigcerver (HEAD -> main, docs)\njpuigcerver@fp:~/git_branques (main) $ cat README.md\n# Bloc: Branques\njpuigcerver@fp:~/git_branques (main) $ git switch docs\nSwitched to branch 'docs'\njpuigcerver@fp:~/git_branques (docs) $ git branch\n  main\n* docs\njpuigcerver@fp:~/git_branques (docs) $ git lg\n* 0b1b3b4 - (3 minutes ago) T\u00edtol - Joan Puigcerver (HEAD -> docs, main)\njpuigcerver@fp:~/git_branques (docs) $ cat README.md\n# Bloc: Branques\n
    ","tags":["conflictes","fast-forward","git branch","git checkout","git merge","git rebase","git switch","HEAD"]},{"location":"apunts/02_branques/#canvis-en-una-branca","title":"Canvis en una branca","text":"

    Per fer canvis en una branca cal: - Situar-se en la branca on es vol fer el canvi (git checkout o git switch). - Realitzar els canvis desitjats. - Confirmar els canvis amb git commit.

    Quan es realitza un commit en una branca, el punter de la branca actual (HEAD) s'avan\u00e7a al nou commit.

    Exemple

    Afegim un subt\u00edtol al nostre fitxer README.md a la branca docs.

    jpuigcerver@fp:~/git_branques (main) $ git checkout docs\njpuigcerver@fp:~/git_branques (docs) $ echo >> README.md\njpuigcerver@fp:~/git_branques (docs) $ echo \"## Documentaci\u00f3\" >> README.md\njpuigcerver@fp:~/git_branques (docs) $ git diff\ndiff --git a/README.md b/README.md\nindex 4efb7a9..3e27f51 100644\n--- a/README.md\n+++ b/README.md\n@@ -1 +1,3 @@\n # Bloc: Branques\n+\n+## Documentaci\u00f3\njpuigcerver@fp:~/git_branques (docs) $ git add README.md\njpuigcerver@fp:~/git_branques (docs) $ git commit -m \"Subt\u00edtol documentaci\u00f3\"\n[docs 1b2c5d6] Subt\u00edtol documentaci\u00f3\n 1 file changed, 1 insertion(+)\njpuigcerver@fp:~/git_branques (docs) $ git lg\n* 1b2c5d6 - (3 seconds ago) Subt\u00edtol documentaci\u00f3 - Joan Puigcerver (HEAD -> docs)\n* 0b1b3b4 - (3 minutes ago) T\u00edtol - Joan Puigcerver (main)\n

    Vegem que la branca docs ha avan\u00e7at al nou commit 1b2c5d6, mentre que la branca main continua apuntant al commit 0b1b3b4.

    Figura 4: Estructura de branques despr\u00e9s de fer un commit a la branca docs.

    ","tags":["conflictes","fast-forward","git branch","git checkout","git merge","git rebase","git switch","HEAD"]},{"location":"apunts/02_branques/#reanomenar-una-branca","title":"Reanomenar una branca","text":"

    Per reanomenar una branca, utilitzem l'ordre:

    git branch [-m | --move] <nou_nom>\n

    Exemple

    En la Introducci\u00f3 s'ha utilitzat aquesta opci\u00f3 per canviar el nom de la branca principal de master a main.

    ","tags":["conflictes","fast-forward","git branch","git checkout","git merge","git rebase","git switch","HEAD"]},{"location":"apunts/02_branques/#eliminar-una-branca","title":"Eliminar una branca","text":"

    Per eliminar una branca, utilitzem l'ordre:

    git branch [-d | --delete] [-D] [-f | --force] <nom>\n

    Advert\u00e8ncia

    Quan un commit perd totes les refer\u00e8ncies per a ser accedit, es diu que \u00e9s un commit orfre i ser\u00e0 eliminat pel recol\u00b7lector de brossa (garbage collector) de Git.

    L'eliminaci\u00f3 d'una branca pot provocar la p\u00e8rdua de commits. En aquest cas, Git mostrar\u00e0 un error i no es podr\u00e0 eliminar la branca a no ser que s'utilitze l'opci\u00f3 -D o --delete --force.

    Example

    Eliminem la branca docs.

    jpuigcerver@fp:~/git_branques (docs) $ git checkout main\njpuigcerver@fp:~/git_branques (main) $ git lg\n* 1b2c5d6 - (3 seconds ago) Subt\u00edtol documentaci\u00f3 - Joan Puigcerver (docs)\n* 0b1b3b4 - (3 minutes ago) T\u00edtol - Joan Puigcerver (HEAD -> main)\njpuigcerver@fp:~/git_branques (main) $ git branch -d docs\nerror: the branch 'docs' is not fully merged\nhint: If you are sure you want to delete it, run 'git branch -D docs'\nhint: Disable this message with \"git config advice.forceDeleteBranch false\"\njpuigcerver@fp:~/git_branques (main) $ git branch -D docs\nDeleted branch docs (was 1b2c5d6).\njpuigcerver@fp:~/git_branques (main) $ git lg\n* 0b1b3b4 - (3 minutes ago) T\u00edtol - Joan Puigcerver (HEAD -> main)\n

    La branca docs ha estat eliminada i, per tant, el commit 1b2c5d6 s'ha convertit en un commit orfe i ser\u00e0 eliminat pel recol\u00b7lector de brossa de Git.

    ","tags":["conflictes","fast-forward","git branch","git checkout","git merge","git rebase","git switch","HEAD"]},{"location":"apunts/02_branques/#fusio-de-branques-git-merge","title":"Fusi\u00f3 de branques (git merge)","text":"

    La fusi\u00f3 de branques o merge \u00e9s el proc\u00e9s de combinar els canvis d'una branca a una altra.

    Aquest proc\u00e9s es realitza amb l'ordre:

    git merge <branca>\n

    Important

    La fusi\u00f3 de branques sempre incorpora els canvis de la branca especificada a la branca actual (on es troba el HEAD).

    Documentaci\u00f3

    Documentaci\u00f3 de la ordre git merge: https://git-scm.com/docs/git-merge

    Segons l'estrucura de les branques, la fusi\u00f3 pot ser directa (fast-forward) o mitjan\u00e7ant commit de fusi\u00f3 (merge commit).

    ","tags":["conflictes","fast-forward","git branch","git checkout","git merge","git rebase","git switch","HEAD"]},{"location":"apunts/02_branques/#fusio-directa","title":"Fusi\u00f3 directa","text":"

    La fusi\u00f3 directa (fast-forward) \u00e9s un tipus de fusi\u00f3 que es produeix quan la branca actual (HEAD) no t\u00e9 cap nou commit des de que es va crear la branca que es vol fusionar.

    En aquest cas, la fusi\u00f3 es realitza avan\u00e7ant el punter de la branca actual (HEAD) fins on es troba la branca que es vol fusionar.

    Important

    La fusi\u00f3 directa \u00e9s la forma m\u00e9s senzilla i neta de fusionar branques, ja que no es crea cap commit addicional per fusionar les branques i mant\u00e9 una hist\u00f2ria lineal i f\u00e0cil de seguir.

    Info

    Per assegurar-se que la fusi\u00f3 siga directa, es pot utilitzar l'opci\u00f3 --ff-only

    En cas que la fusi\u00f3 no siga directa, Git mostrar\u00e0 un error i no es realitzar\u00e0 la fusi\u00f3.

    Example

    Partint de la situaci\u00f3 de la Figura 4, on la branca docs t\u00e9 un commit m\u00e9s que la branca main, la fusi\u00f3 de la branca docs a la branca main ser\u00e0 una fusi\u00f3 directa.

    Figura 5: Hist\u00f2ria abans de la fusi\u00f3 directa.

    jpuigcerver@fp:~/git_branques (docs) $ git checkout main\nSwitched to branch 'main'\njpuigcerver@fp:~/git_branques (main) $ cat README.md\n# Bloc: Branques\njpuigcerver@fp:~/git_branques (main) $ git lg\n* 1b2c5d6 - (3 seconds ago) Subt\u00edtol documentaci\u00f3 - Joan Puigcerver (docs)\n* 0b1b3b4 - (3 minutes ago) T\u00edtol - Joan Puigcerver (HEAD -> main)\n

    En aquest cas, la fusi\u00f3 es portar\u00e0 a terme avan\u00e7ant el punter de la branca main fins al punt on es troba la branca docs.

    Figura 6: Hist\u00f2ria despr\u00e9s de la fusi\u00f3 directa.

    jpuigcerver@fp:~/git_branques (main) $ git merge docs\nUpdating 0b1b3b4..1b2c5d6\nFast-forward\n README.md | 1 +\n 1 file changed, 1 insertion(+)\njpuigcerver@fp:~/git_branques (main) $ cat README.md # (1)!\n# Bloc: Branques\n\n## Documentaci\u00f3\njpuigcerver@fp:~/git_branques (main) $ git lg\n* 1b2c5d6 - (3 seconds ago) Subt\u00edtol documentaci\u00f3 - Joan Puigcerver (HEAD -> main, docs)\n* 0b1b3b4 - (3 minutes ago) T\u00edtol - Joan Puigcerver\n
    1. Vegem que el fitxer README.md ha incorporat els canvis de la branca docs.
    ","tags":["conflictes","fast-forward","git branch","git checkout","git merge","git rebase","git switch","HEAD"]},{"location":"apunts/02_branques/#fusio-de-branques-divergents","title":"Fusi\u00f3 de branques divergents","text":"

    No sempre \u00e9s possible realitzar fusi\u00f3 mitjan\u00e7ant una fusi\u00f3 directa (fast-forward). Pot donar-se el cas que les dues branques hagen divergit, \u00e9s a dir, que cada branca haja realitzat canvis que no estan presents en l'altra branca.

    Preparaci\u00f3 branques divergents
    1. Realitzem canvis en la branca docs.
    jpuigcerver@fp:~/git_branques (main) $ git checkout docs\nSwitched to branch 'docs'\njpuigcerver@fp:~/git_branques (docs) $ echo \"https://git-scm.com/\" >> README.md\njpuigcerver@fp:~/git_branques (docs) $ git diff\ndiff --git a/README.md b/README.md\nindex 4efb7a9..3e27f51 100644\n--- a/README.md\n+++ b/README.md\n@@ -1,3 +1,4 @@\n # Bloc: Branques\n\n ## Documentaci\u00f3\n+- https://git-scm.com/\njpuigcerver@fp:~/git_branques (docs) $ git commit -a -m \"Documentaci\u00f3 oficial\"\n[docs 3d4e5f6] Documentaci\u00f3 oficial\n 1 file changed, 1 insertion(+)\njpuigcerver@fp:~/git_branques (docs) $ git lg\n* 3d4e5f6 - (3 seconds ago) Documentaci\u00f3 oficial - Joan Puigcerver (HEAD -> docs)\n* 1b2c5d6 - (3 minutes ago) Subt\u00edtol documentaci\u00f3 - Joan Puigcerver (main)\n* 0b1b3b4 - (3 minutes ago) T\u00edtol - Joan Puigcerver\n
    1. Realitzem canvis en la branca main.
    jpuigcerver@fp:~/git_branques (docs) $ git checkout main\nSwitched to branch 'main'\njpuigcerver@fp:~/git_branques (main) $ vim README.md # (1)!\njpuigcerver@fp:~/git_branques (main) $ git diff\ndiff --git a/README.md b/README.md\nindex 3e27f51..4efb7a9 100644\n--- a/README.md\n+++ b/README.md\n@@ -1,2 +1,3 @@\n # Bloc: Branques\n+__Autor:__ Joan Puigcerver\n\n ## Documentaci\u00f3\njpuigcerver@fp:~/git_branques (main) $ git commit -a -m \"Autor\"\n[main 2a3b4c5] Autor\n 1 file changed, 1 insertion(+)\njpuigcerver@fp:~/git_branques (main) $ git lg -a\n* 2a3b4c5 - (5 seconds ago) Autor - Joan Puigcerver (HEAD -> main)\n| * 3d4e5f6 - (3 minutes ago) Documentaci\u00f3 oficial - Joan Puigcerver (docs)\n|/\n* 1b2c5d6 - (10 minutes ago) Subt\u00edtol documentaci\u00f3 - Joan Puigcerver (docs)\n* 0b1b3b4 - (13 minutes ago) T\u00edtol - Joan Puigcerver\n
    1. Modifiquem el fitxer README.md. Pots utilitzar l'editor de text que preferisques.
    Figura 7: Hist\u00f2ria abans de la fusi\u00f3 en branques divergents.

    En aquest cas, la fusi\u00f3 es realitza mitjan\u00e7ant un commit de fusi\u00f3 (merge commit). Aquest commit de fusi\u00f3 t\u00e9 dos pares, un per cada branca que es fusiona i incorpora els canvis de les dues branques.

    Figura 8: Hist\u00f2ria despr\u00e9s de la fusi\u00f3 en branques divergents.

    En el moment de realitzar la fusi\u00f3 (git merge), Git crear\u00e0 un nou commit de fusi\u00f3 que incorporar\u00e0 els canvis de les dues branques.

    Aquest commit necessita d'un missatge, per tant, es pot utilitzar l'opci\u00f3 -m per afegir un missatge al commit. Si no se n'especifica cap, s'obrir\u00e0 l'editor de text configurat per defecte per a afegir el missatge. (Vegeu Confirmar canvis)

    Advert\u00e8ncia

    Aquest tipus de fusi\u00f3 no \u00e9s tan neta com la fusi\u00f3 directa (fast-forward), ja que la hist\u00f2ria del projecte es torna m\u00e9s complexa i no lineal.

    Info

    Per for\u00e7ar que la fusi\u00f3 es realitze amb un commit de fusi\u00f3 (merge commit), es pot utilitzar l'opci\u00f3 --no-ff.

    Fusi\u00f3 de branques divergents

    Realitzem la fusi\u00f3 de les dues branques.

    jpuigcerver@fp:~/git_branques (main) $ git merge docs -m \"Merge branch 'docs' into main\" # (1)!\nAuto-merging README.md\nMerge made by the 'ort' strategy.\n README.md | 1 +\n 1 file changed, 1 insertion(+)\njpuigcerver@fp:~/git_branques (main) $ git lg\n*   b6aa5c3 - (3 seconds ago) Merge branch 'docs' into main - Joan Puigcerver (HEAD -> main)\n|\\\n| * 3d4e5f6 - (3 minutes ago) Documentaci\u00f3 oficial - Joan Puigcerver (docs)\n* | 2a3b4c5 - (5 seconds ago) Autor - Joan Puigcerver\n|/\n* 1b2c5d6 - (10 minutes ago) Subt\u00edtol documentaci\u00f3 - Joan Puigcerver\n* 0b1b3b4 - (13 minutes ago) T\u00edtol - Joan Puigcerver\njpuigcerver@fp:~/git_branques (main) $ cat README.md\n# Bloc: Branques\n__Autor:__ Joan Puigcerver\n\n## Documentaci\u00f3\n- https://git-scm.com/\n
    1. La opci\u00f3 -m permet afegir un missatge al commit de fusi\u00f3.

    En aquest punt ens trobem en la situaci\u00f3 mostrada en la Figura 8. Vegem que el fitxer README.md ha incorporat els canvis de les dues branques.

    ","tags":["conflictes","fast-forward","git branch","git checkout","git merge","git rebase","git switch","HEAD"]},{"location":"apunts/02_branques/#resolucio-de-conflictes","title":"Resoluci\u00f3 de conflictes","text":"

    En el proc\u00e9s de fusi\u00f3 de branques, pot donar-se el cas que les dues branques hagen modificat la mateixa part d'un fitxer. En aquest cas, Git no pot resoldre el conflictes de forma autom\u00e0tica i caldr\u00e0 resoldre'ls manualment.

    En el moment que executem git merge, Git detectar\u00e0 el conflictes els marcar\u00e0 en el fitxer amb la seg\u00fcent notaci\u00f3:

    <<<<<<< HEAD\nContingut de la branca actual\n=======\nContingut de la branca a fusionar\n>>>>>>> branca_a_fusionar\n

    A m\u00e9s, el repositori passar\u00e0 a l'estat de fusi\u00f3 (MERGING), indicant que hi ha una fusi\u00f3 en curs.

    Per resoldre el conflicte, caldr\u00e0:

    1. Editar el fitxer i resoldre manualment el conflicte.
    2. Esborrar les marques de conflicte.

    Una vegada resolt el conflicte, caldr\u00e0 confirmar els canvis amb git add i git commit.

    Info

    En cas que es desitge cancel\u00b7lar el proc\u00e9s de fusi\u00f3, es pot utilitzar l'ordre git merge --abort.

    Preparaci\u00f3 branques divergents amb conflicte
    1. Creem la branca conflictes i realitzem canvis en la descripci\u00f3 del fitxer README.md.
    jpuigcerver@fp:~/git_branques (main) $ git branch conflictes\njpuigcerver@fp:~/git_branques (main) $ git checkout conflictes\nSwitched to branch 'conflictes'\njpuigcerver@fp:~/git_branques (conflictes) $ vim README.md\njpuigcerver@fp:~/git_branques (conflictes) $ git diff\ndiff --git a/README.md b/README.md\nindex f94383b..c9b0a17 100644\n--- a/README.md\n+++ b/README.md\n@@ -1,5 +1,7 @@\n # Bloc: Branques\n __Autor__: Joan Puigcerver\n\n+Estem aprenent a resoldre conflictes.\n+\n ## Documentaci\u00f3\n - https://git-scm.com/\njpuigcerver@fp:~/git_branques (conflictes) $ git commit -a -m \"Text conflictes\"\n[conflictes 4e5f6d7] Text conflictes\n 1 file changed, 2 insertions(+)\njpuigcerver@fp:~/git_branques (conflictes) $ git lg\n* 4e5f6d7 - (3 seconds ago) Text conflictes - Joan Puigcerver (HEAD -> conflictes)\n* b6aa5c3 - (3 minutes ago) Merge branch 'docs' into main - Joan Puigcerver (main)\n...\n
    1. Realitzem canvis en la descripci\u00f3 en la branca main.
    jpuigcerver@fp:~/git_branques (main) $ git checkout main\nSwitched to branch 'main'\njpuigcerver@fp:~/git_branques (main) $ vim README.md\njpuigcerver@fp:~/git_branques (main) $ git diff\ndiff --git a/README.md b/README.md\nindex f94383b..a03cd9d 100644\n--- a/README.md\n+++ b/README.md\n@@ -1,5 +1,7 @@\n # Bloc: Branques\n __Autor__: Joan Puigcerver\n\n+Estem aprenent a fusionar branques.\n+\n ## Documentaci\u00f3\n - https://git-scm.com/\njpuigcerver@fp:~/git_branques (main) $ git commit -a -m \"Text fusi\u00f3\"\n[main 072e36a] Text fusi\u00f3\n 1 file changed, 2 insertions(+)\njpuigcerver@fp:~/git_branques (main) $ git lg -a\n* 072e36a - (3 seconds ago) Text fusi\u00f3 - Joan Puigcerver (HEAD -> main)\n| * 4e5f6d7 - (3 minutes ago) Text conflictes - Joan Puigcerver (conflictes)\n|/\n* b6aa5c3 - (3 minutes ago) Merge branch 'docs' into main - Joan Puigcerver\n...\n

    Exemple de fusi\u00f3 amb resoluci\u00f3 de conflictes

    Realitzem la fusi\u00f3 de la branca conflictes a la branca main.

    jpuigcerver@fp:~/git_branques (main) $ git merge conflictes\nAuto-merging README.md\nCONFLICT (content): Merge conflict in README.md\nAutomatic merge failed; fix conflicts and then commit the result.\njpuigcerver@fp:~/git_branques (main|MERGING) $ cat README.md\n# Bloc: Branques\n__Autor__: Joan Puigcerver\n\n<<<<<<< HEAD\nEstem aprenent a fusionar branques.\n=======\nEstem aprenent a resoldre conflictes.\n>>>>>>> conflictes\n\n## Documentaci\u00f3\n- https://git-scm.com/\njpuigcerver@fp:~/git_branques (main|MERGING) $ vim README.md # (1)!\njpuigcerver@fp:~/git_branques (main|MERGING) $ cat README.md\njpuigcerver@fedora:~/git_branques (main|MERGING) $ cat README.md \n# Bloc: Branques\n__Autor__: Joan Puigcerver\n\nEstem aprenent a fusionar branques i resoldre conflictes.\n\n## Documentaci\u00f3\n- https://git-scm.com/\njpuigcerver@fp:~/git_branques (main|MERGING) $ git add README.md\njpuigcerver@fp:~/git_branques (main|MERGING) $ git commit -m \"Resoluci\u00f3 conflicte\"\n[main 8a9b0c1] Resoluci\u00f3 conflicte\njpuigcerver@fp:~/git_branques (main) $ git lg\n* 8a9b0c1 - (3 seconds ago) Resoluci\u00f3 conflicte - Joan Puigcerver (HEAD -> main)\n|\\\n| * 4e5f6d7 - (3 minutes ago) Text conflictes - Joan Puigcerver (conflictes)\n* | 072e36a - (3 minutes ago) Text fusi\u00f3 - Joan Puigcerver\n|/\n* b6aa5c3 - (3 minutes ago) Merge branch 'docs' into main - Joan Puigcerver\n...\n
    1. Hem combinat els dos textos i hem eliminat les marques de conflicte.
    ","tags":["conflictes","fast-forward","git branch","git checkout","git merge","git rebase","git switch","HEAD"]},{"location":"apunts/02_branques/#canvi-de-base-rebase","title":"Canvi de base (rebase)","text":"

    El canvi de base (rebase) \u00e9s una altra manera de fusionar canvis de branques divergents, que consiteix en aplicar els canvis dels commit d'una branca sobre una altra branca, en ordre cronol\u00f2gic.

    Aquesta t\u00e8cnica permet eliminar les branques diveregents i mantenir una hist\u00f2ria lineal.

    Aquest proc\u00e9s es realitza amb l'ordre:

    git rebase <branca>\n

    Documentaci\u00f3

    Documentaci\u00f3 de la ordre git rebase: https://git-scm.com/docs/git-rebase

    Important

    L'ordre git rebase canviar\u00e0 la base de la branca actual (HEAD).

    Preparaci\u00f3 branques divergents
    1. Creem la branca llicencia i realitzem canvis en la descripci\u00f3 del fitxer README.md.
    jpuigcerver@fp:~/git_branques (main) $ git checkout -b llicencia # (1)!\nSwitched to a new branch 'llicencia'\njpuigcerver@fp:~/git_branques (llicencia) $ echo >> README.md\njpuigcerver@fp:~/git_branques (llicencia) $ echo \"## Llic\u00e8ncia\" >> README.md\njpuigcerver@fp:~/git_branques (llicencia) $ echo \"CC BY-NC-SA 4.0\" >> README.md\njpuigcerver@fp:~/git_branques (llicencia) $ git diff\ndiff --git a/README.md b/README.md\nindex 2ca252f..6aa790e 100644\n--- a/README.md\n+++ b/README.md\n@@ -5,3 +5,6 @@ Estem aprenent a fusionar branques i resoldre conflictes.\n\n ## Documentaci\u00f3\n - https://git-scm.com/\n+\n+## Llic\u00e8ncia\n+CC BY-NC-SA 4.0\njpuigcerver@fp:~/git_branques (llicencia) $ git commit -a -m \"Llic\u00e8ncia\"\n[llicencia e474d76] Llic\u00e8ncia\n 1 file changed, 3 insertions(+)\njpuigcerver@fp:~/git_branques (llicencia) $ git lg\n* e474d76 - (14 seconds ago) Llic\u00e8ncia - Joan Puigcerver (HEAD -> llicencia)\n* 8a9b0c1 - (3 minutes ago) Resoluci\u00f3 conflicte - Joan Puigcerver (main)\n...\n
    1. Realitzem canvis en la descripci\u00f3 en la branca main.
    jpuigcerver@fp:~/git_branques (llicencia) $ git checkout main\nSwitched to branch 'main'\njpuigcerver@fp:~/git_branques (main) $ vim README.md\njpuigcerver@fp:~/git_branques (main) $ git diff\ndiff --git a/README.md b/README.md\nindex 2ca252f..3a3fe02 100644\n--- a/README.md\n+++ b/README.md\n@@ -2,6 +2,7 @@\n __Autor__: Joan Puigcerver\n\n Estem aprenent a fusionar branques i resoldre conflictes.\n+Tamb\u00e9 a canviar la base d'una branca.\n\n ## Documentaci\u00f3\n - https://git-scm.com/\njpuigcerver@fp:~/git_branques (main) $ git commit -a -m \"Text rebase\"\n[main 1b2c3d4] Text rebase\n 1 file changed, 1 insertion(+)\njpuigcerver@fp:~/git_branques (main) $ git lg -a\n* 1b2c3d4 - (3 seconds ago) Text rebase - Joan Puigcerver (HEAD -> main)\n| * e474d76 - (3 minutes ago) Llic\u00e8ncia - Joan Puigcerver (llicencia)\n|/\n* 8a9b0c1 - (3 minutes ago) Resoluci\u00f3 conflicte - Joan Puigcerver\n...\n
    1. L'opci\u00f3 git checkout -b permet crear una nova branca i situar-se en ella directament.
    Figura 9: Hist\u00f2ria abans del canvi de base. Figura 10: Hist\u00f2ria despr\u00e9s del canvi de base.

    Canvi de base

    Canviem la base de la branca llicencia a la branca main.

    jpuigcerver@fp:~/git_branques (main) $ git checkout llicencia\nSwitched to branch 'llicencia'\njpuigcerver@fp:~/git_branques (llicencia) $ git rebase main\nSuccessfully rebased and updated refs/heads/llicencia.\njpuigcerver@fp:~/git_branques (llicencia) $ git lg\n* 8bad4a1 - (3 seconds ago) Llic\u00e8ncia - Joan Puigcerver (HEAD -> llicencia)\n* 1b2c3d4 - (3 minutes ago) Text rebase - Joan Puigcerver (main)\n* 8a9b0c1 - (3 minutes ago) Resoluci\u00f3 conflicte - Joan Puigcerver\n...\njpuigcerver@fp:~/git_branques (llicencia) $ cat README.md\n# Bloc: Branques\n__Autor__: Joan Puigcerver\n\nEstem aprenent a fusionar branques i resoldre conflictes.\nTamb\u00e9 a canviar la base d'una branca.\n\n## Documentaci\u00f3\n- https://git-scm.com/\n\n## Llic\u00e8ncia\nCC BY-NC-SA 4.0\n

    Vegem que la branca llicencia ha canviat la seva base a la branca main i ha incorporat els seus canvis.

    Notice

    L'identificador (hash) del commit Llic\u00e8ncia ha canviat despr\u00e9s del rebase.

    Aix\u00f2 \u00e9s degut a que s'ha creat un nou commit amb els canvis de l'anterior.

    En aquest punt, si volem incorporar els canvis de la branca llicencia a la branca main, podem fer-ho mitjan\u00e7ant una fusi\u00f3 directa (fast-forward).

    jpuigcerver@fp:~/git_branques (llicencia) $ git checkout main\nSwitched to branch 'main'\njpuigcerver@fp:~/git_branques (main) $ git merge llicencia\nUpdating 1b2c3d4..8bad4a1\nFast-forward\n README.md | 3 +++\n 1 file changed, 3 insertions(+)\njpuigcerver@fp:~/git_branques (main) $ git lg\n* 8bad4a1 - (3 seconds ago) Llic\u00e8ncia - Joan Puigcerver (HEAD -> main, llicencia)\n* 1b2c3d4 - (3 minutes ago) Text rebase - Joan Puigcerver\n...\n
    ","tags":["conflictes","fast-forward","git branch","git checkout","git merge","git rebase","git switch","HEAD"]},{"location":"apunts/02_branques/#resolucio-de-conflictes_1","title":"Resoluci\u00f3 de conflictes","text":"

    El canvi de base (rebase) tamb\u00e9 pot provocar conflictes si les dues branques han modificat la mateixa part d'un fitxer.

    Git ens indicar\u00e0 que hi ha conflictes i caldr\u00e0 resoldre'ls manualment, d'una manera similar a la resoluci\u00f3 de conflictes en la fusi\u00f3 de branques.

    En aquest cas, caldr\u00e0 resoldre els conflictes per a cada commit en el que s'est\u00e0 canviant la base.

    Despr\u00e9s de resoldre els conflictes d'un commit, caldr\u00e0 continuar amb el proc\u00e9s de rebase amb l'ordre git rebase --continue fins que s'haja aplicat el canvi de base a tots els commit de la branca.

    Preparaci\u00f3 branques divergents amb conflictes
    1. Creem la branca docs/git_training i realitzem canvis en la descripci\u00f3 del fitxer README.md.
    jpuigcerver@fp:~/git_branques (main) $ git checkout -b docs_git_training\nSwitched to a new branch 'docs_git_training'\njpuigcerver@fp:~/git_branques (docs_git_training) $ vim README.md\njpuigcerver@fp:~/git_branques (docs_git_training) $ git diff\ndiff --git a/README.md b/README.md\nindex 54f292f..271a617 100644\n--- a/README.md\n+++ b/README.md\n@@ -6,6 +6,7 @@ Tamb\u00e9 a canviar la base d'una branca.\n\n ## Documentaci\u00f3\n - https://git-scm.com/\n+- https://github.com/UnseenWizzard/git_training \n\n ## Llic\u00e8ncia\n CC BY-NC-SA 4.0\njpuigcerver@fp:~/git_branques (docs_git_training) $ git commit -a -m \"Documentaci\u00f3 git_training\"\n[docs_git_training a136424] Documentaci\u00f3 git_training\n 1 file changed, 1 insertion(+)\njpuigcerver@fp:~/git_branques (docs_git_training) $ git lg\n* a136424 - (3 seconds ago) Documentaci\u00f3 git_training - Joan Puigcerver (HEAD -> docs_git_training)\n* 1b2c3d4 - (3 minutes ago) Text rebase - Joan Puigcerver (main)\n...\n
    1. Realitzem canvis en la descripci\u00f3 en la branca main.
    jpuigcerver@fp:~/git_branques (docs_git_training) $ git checkout main\nSwitched to branch 'main'\njpuigcerver@fp:~/git_branques (main) $ vim README.md\njpuigcerver@fp:~/git_branques (main) $ git diff\ndiff --git a/README.md b/README.md\nindex 54f292f..6f65136 100644\n--- a/README.md\n+++ b/README.md\n@@ -6,6 +6,7 @@ Tamb\u00e9 a canviar la base d'una branca.\n\n ## Documentaci\u00f3\n - https://git-scm.com/\n+- https://www.w3schools.com/git/\n\n ## Llic\u00e8ncia\n CC BY-NC-SA 4.0\njpuigcerver@fp:~/git_branques (main) $ git commit -a -m \"Documentaci\u00f3 w3schools\"\n[main 0230b1b] Documentaci\u00f3 w3schools\n 1 file changed, 1 insertion(+)\njpuigcerver@fp:~/git_branques (main) $ git lg -a\n* 0230b1b - (3 seconds ago) Documentaci\u00f3 w3schools - Joan Puigcerver (HEAD -> main)\n| * a136424 - (3 minutes ago) Documentaci\u00f3 git_training - Joan Puigcerver (docs_git_training)\n|/\n* 1b2c3d4 - (3 minutes ago) Text rebase - Joan Puigcerver\n...\n

    Canvi de base amb conflictes

    Canviem la base de la branca docs_git_training a la branca main.

    jpuigcerver@fp:~/git_branques (main) $ git checkout docs_git_training\nSwitched to branch 'docs_git_training'\njpuigcerver@fp:~/git_branques (docs_git_training) $ git rebase main\nAuto-merging README.md\nCONFLICT (content): Merge conflict in README.md\nerror: could not apply a136424... git_training\nhint: Resolve all conflicts manually, mark them as resolved with\nhint: \"git add/rm <conflicted_files>\", then run \"git rebase --continue\".\nhint: You can instead skip this commit: run \"git rebase --skip\".\nhint: To abort and get back to the state before \"git rebase\", run \"git rebase --abort\".\nhint: Disable this message with \"git config advice.mergeConflict false\"\nCould not apply a136424... Documentaci\u00f3 git_training\njpuigcerver@fp:~/git_branques (docs_git_training|REBASE 1/1) $ git status\ninteractive rebase in progress; onto 0230b1b\nLast command done (1 command done):\n   pick a136424 git_training\nNo commands remaining.\nYou are currently rebasing branch 'docs_git_training' on '0230b1b'.\n  (fix conflicts and then run \"git rebase --continue\")\n  (use \"git rebase --skip\" to skip this patch)\n  (use \"git rebase --abort\" to check out the original branch)\n\nUnmerged paths:\n  (use \"git restore --staged <file>...\" to unstage)\n  (use \"git add <file>...\" to mark resolution)\n    both modified:   README.md\n\nno changes added to commit (use \"git add\" and/or \"git commit -a\")\njpuigcerver@fp:~/git_branques (docs_git_training|REBASE 1/1) $ cat README.md\n# Bloc: Branques\n__Autor__: Joan Puigcerver\n\nEstem aprenent a fusionar branques i resoldre conflictes.\nTamb\u00e9 a canviar la base d'una branca.\n\n## Documentaci\u00f3\n- https://git-scm.com/\n<<<<<<< HEAD\n- https://www.w3schools.com/git/\n=======\n- https://github.com/UnseenWizzard/git_training \n>>>>>>> a136424 (git_training)\n\n## Llic\u00e8ncia\nCC BY-NC-SA 4.0\n

    Vegem que hi ha conflictes en el fitxer README.md. Hem de resoldre'ls manualment.

    jpuigcerver@fp:~/git_branques (docs_git_training|REBASE 1/1) $ vim README.md # (1)!\njpuigcerver@fp:~/git_branques (docs_git_training|REBASE 1/1) $ cat README.md\n# Bloc: Branques\n__Autor__: Joan Puigcerver\n\nEstem aprenent a fusionar branques i resoldre conflictes.\nTamb\u00e9 a canviar la base d'una branca.\n\n## Documentaci\u00f3\n- https://git-scm.com/\n- https://www.w3schools.com/git/\n- https://github.com/UnseenWizzard/git_training \n\n## Llic\u00e8ncia\nCC BY-NC-SA 4.0\njpuigcerver@fp:~/git_branques (docs_git_training|REBASE 1/1) $ git add README.md # (2)!\njpuigcerver@fp:~/git_branques (docs_git_training|REBASE 1/1) $ git status\ninteractive rebase in progress; onto 0230b1b\nLast command done (1 command done):\n   pick a136424 git_training\nNo commands remaining.\nYou are currently rebasing branch 'docs_git_training' on '0230b1b'.\n  (all conflicts fixed: run \"git rebase --continue\")\n\nChanges to be committed:\n  (use \"git restore --staged <file>...\" to unstage)\n    modified:   README.md\n\njpuigcerver@fp:~/git_branques (docs_git_training|REBASE 1/1) $ git rebase --continue --no-edit # (3)!\nSuccessfully rebased and updated refs/heads/docs_git_training.\njpuigcerver@fp:~/git_branques (docs_git_training) $ git lg\n* 8bad4a1 - (3 seconds ago) Documentaci\u00f3 git_training - Joan Puigcerver (HEAD -> docs_git_training)\n* 0230b1b - (3 minutes ago) Documentaci\u00f3 w3schools - Joan Puigcerver (main)\n...\n
    1. Hem eliminat les marques de conflicte i hem combinat els dos textos.
    2. Hem marcat el fitxer README.md com a resolt.
    3. L'opci\u00f3 --no-edit permet continuar el proc\u00e9s de rebase, utilitzant el missatge del commit original.
    ","tags":["conflictes","fast-forward","git branch","git checkout","git merge","git rebase","git switch","HEAD"]},{"location":"apunts/02_branques/#recursos-addicionals","title":"Recursos addicionals","text":"","tags":["conflictes","fast-forward","git branch","git checkout","git merge","git rebase","git switch","HEAD"]},{"location":"apunts/02_branques/#bibliografia","title":"Bibliografia","text":"","tags":["conflictes","fast-forward","git branch","git checkout","git merge","git rebase","git switch","HEAD"]},{"location":"apunts/030_remots/","title":"Bloc 3: Remots","text":"","tags":["git clone","git fetch","git pull","git push","git remote","github","ssh","personal access token","origin","remot","--set-upstream"]},{"location":"apunts/030_remots/#introduccio","title":"Introducci\u00f3","text":"

    En el blocs anteriors, ens hem centrat en con\u00e9ixer la seua estructura i realitzar accions b\u00e0siques per realitzar canvis sobre aquest.

    No obstant aix\u00f2, totes les accions que hem realitzat fins ara han sigut sobre un repositori local, \u00e9s a dir, un repositori que es troba en el nostre dispositiu i aquests canvis no han segut publicats en cap lloc.

    En aquest bloc, ens centrarem en la creaci\u00f3 de repositoris remots; repositoris que es troben allotjats en un servidor, que permeten l'acc\u00e9s a altres usuaris i la col\u00b7laboraci\u00f3 en el desenvolupament de projectes.

    Preparaci\u00f3 repositori local

    En aquest material treballarem sobre un nou repositori local.

    Inicialitzaci\u00f3:

    git init ~/git_remots\ncd ~/git_remots\necho \"# Bloc: Remots\" > README.md\ngit add README.md\ngit commit -m \"README.md: T\u00edtol\"\necho \"Repositori del __Bloc: Remots__ del curs __\\\"Introducci\u00f3 a Git i la seua aplicaci\u00f3 a l\u2019aula\\\"__\" >> README.md\ngit commit -a -m \"README.md: Descripci\u00f3\"\n

    Example

    jpuigcerver@fp:~ $ git init ~/git_remots\nInitialized empty Git repository in /home/jpuigcerver/git_remots/.git/\njpuigcerver@fp:~ $ cd ~/git_remots\njpuigcerver@fp:~/git_remots (main) $ branch -m main # (1)!\njpuigcerver@fp:~/git_remots (main) $ echo \"# Bloc: Remots\" > README.md\njpuigcerver@fp:~/git_remots (main) $ git add README.md\njpuigcerver@fp:~/git_remots (main) $ git commit -m \"README.md: T\u00edtol\"\n[master (root-commit) 0b1b3b4] README.md: T\u00edtol\n 1 file changed, 1 insertion(+)\n create mode 100644 README.md\njpuigcerver@fp:~/git_remots (main) $ echo \"Repositori del __Bloc: Remots__ del curs __\\\"Introducci\u00f3 a Git i la seua aplicaci\u00f3 a l\u2019aula\\\"__\" >> README.md\njpuigcerver@fp:~/git_remots (main) $ git commit -a -m \"README.md: Descripci\u00f3\"\n[master 1b3b4b0] README.md: Descripci\u00f3\n 1 file changed, 1 insertion(+)\njpuigcerver@fp:~/git_remots (main) $ git lg\n* 1b3b4b0 - (2 minutes ago) README.md: Descripci\u00f3 - Joan Puigcerver (HEAD -> main)\n* 0b1b3b4 - (3 minutes ago) README.md: T\u00edtol - Joan Puigcerver\n
    1. Canviem el nom de la branca principal a main.
    ","tags":["git clone","git fetch","git pull","git push","git remote","github","ssh","personal access token","origin","remot","--set-upstream"]},{"location":"apunts/030_remots/#repositori-remot","title":"Repositori remot","text":"

    Un Repositori Remot \u00e9s una c\u00f2pia d'un repositori de Git que es troba allotjat en un servidor o en un altre lloc fora del teu propi sistema local. Aquesta c\u00f2pia cont\u00e9 una r\u00e8plica completa de la hist\u00f2ria del repositori, incloses totes les revisions i les branques. Els repositoris remots permeten la col\u00b7laboraci\u00f3 i el seguiment del desenvolupament del codi entre m\u00faltiples persones, o tu mateix en diferents dispositius.

    Figura 1: Repositori remot vinculat a m\u00faltiples repositoris locals

    Entre les finalitats dels repositoris remots podem trobar:

    Gr\u00e0cies a aquestes caracter\u00edstiques, Git s'ha convertit en una eina clau en qualsevol desenvolupament, per\u00f2 sobretot en els projectes de codi obert (open source), ja que permet la col\u00b7laboraci\u00f3 de desenvolupadors de tot el m\u00f3n en un mateix projecte de manera senzilla i distribu\u00efda.

    ","tags":["git clone","git fetch","git pull","git push","git remote","github","ssh","personal access token","origin","remot","--set-upstream"]},{"location":"apunts/030_remots/#allotjament-de-repositoris-remots","title":"Allotjament de repositoris remots","text":"

    Els repositoris remots es poden allotjar en qualsevol m\u00e0quina o servidor dedicat. No obstant aix\u00f2, hi ha serveis d'allotjament de repositoris remots en l\u00ednia que faciliten la creaci\u00f3 i la gesti\u00f3 de repositoris remots.

    Alguns dels serveis d'allotjament repositoris remots en l\u00ednia m\u00e9s coneguts s\u00f3n:

    Info

    M\u00e9s informaci\u00f3: https://prismic.io/blog/gitlab-vs-github#similarities-between-github-and-gitlab

    ","tags":["git clone","git fetch","git pull","git push","git remote","github","ssh","personal access token","origin","remot","--set-upstream"]},{"location":"apunts/030_remots/#creacio-dun-repositori-remot-a-github","title":"Creaci\u00f3 d'un repositori remot a GitHub","text":"

    En aquesta secci\u00f3, crearem un repositori remot a GitHub.

    1. Crea un compte a GitHub si no en tens un.
    2. Inicia la sessi\u00f3 amb el teu compte.
    3. Fes clic a l'opci\u00f3 \"New\" per crear un nou repositori.
    4. Omple el formulari amb la informaci\u00f3 del teu repositori:
      • Nom del repositori. Ha de ser un nom \u00fanic en el teu compte de GitHub.
      • Descripci\u00f3 del repositori. Opcional.
      • Visibilitat del repositori. Pots triar entre p\u00fablic o privat.
        • P\u00fablic: Qualsevol persona pot veure el teu repositori. Sols les persones autoritzades poden fer canvis.
        • Privat: Nom\u00e9s tu i les persones que tu autoritzes poden veure el teu repositori. Sols les persones autoritzades poden fer canvis.
      • README: Indica si vols afegir un README al teu repositori.
      • .gitignore: Indica si vols afegir un fitxer .gitignore per ignorar fitxers en el teu repositori.
      • Llic\u00e8ncia: Indica si vols afegir una llic\u00e8ncia al teu repositori.

    Exemple

    En aquest material, crearem un repositori amb les seg\u00fcents caracter\u00edstiques:

    Figura 2: Formulari de creaci\u00f3 d'un nou repositori a GitHub

    Una vegada omplert el formulari, fes clic a \"Create repository\" per crear el teu repositori.

    El teu repositori s'hauria de crear buit i hauries de veure una p\u00e0gina com la seg\u00fcent:

    Figura 3: Repositori buit creat a GitHub

    La Figura 3 mostra els passos per enlla\u00e7ar el teu repositori local amb el repositori remot creat a GitHub. En els seg\u00fcents apartats, explicarem aquestes ordres amb m\u00e9s detall.

    ","tags":["git clone","git fetch","git pull","git push","git remote","github","ssh","personal access token","origin","remot","--set-upstream"]},{"location":"apunts/030_remots/#metodes-dautenticacio-a-github","title":"M\u00e8todes d'autenticaci\u00f3 a GitHub","text":"

    Per poder enlla\u00e7ar el teu repositori local amb el repositori remot i fer canvis en aquest, necessites autenticar-te amb el servidor de GitHub.

    GitHub ofereix diferents m\u00e8todes d'autenticaci\u00f3, utilitzant dos protocols diferents:

    Consell

    Per seguretat i reutilitzaci\u00f3, es recomana utilitzar el m\u00e8tode SSH per autenticar-se amb el servidor de GitHub.

    Consulta l'apartat Configuraci\u00f3 de la clau SSH si vols anar directament a aquest m\u00e8tode.

    ","tags":["git clone","git fetch","git pull","git push","git remote","github","ssh","personal access token","origin","remot","--set-upstream"]},{"location":"apunts/030_remots/#token-dacces-personal-pat","title":"Token d'acc\u00e9s personal (PAT)","text":"

    Un Token d'Acc\u00e9s Personal (Personal Access Token o PAT) \u00e9s una clau d'acc\u00e9s que permet autenticar-se amb el servidor de GitHub mitjan\u00e7ant el protocol HTTPS.

    Documentaci\u00f3

    Per crear un token d'acc\u00e9s personal, segueix els seg\u00fcents passos:

    Existeixen dos tipus de tokens d'acc\u00e9s personal:

    Una vegada creat el token, podr\u00e0s utilitzar-lo per autenticar-te amb el servidor de GitHub.

    Important

    Guarda el teu token d'acc\u00e9s personal en un lloc segur.

    No podr\u00e0s veure'l de nou despr\u00e9s de tancar la p\u00e0gina.

    Pots utilitzar el teu token d'acc\u00e9s personal per autenticar-te amb el servidor de GitHub de dues maneres:

    Consell

    Per tal de no haver de recordar el PAT cada vegada, \u00e9s possible configurar Git perqu\u00e8 ho recorde autom\u00e0ticament.

    git config --global credential.helper store\n
    Aquesta comanda guardar\u00e0 les credencials en un fitxer de text en el teu sistema local.

    Danger

    Aquesta opci\u00f3 guarda les credencials en text pla en el fitxer ~/.git-credentials.

    ","tags":["git clone","git fetch","git pull","git push","git remote","github","ssh","personal access token","origin","remot","--set-upstream"]},{"location":"apunts/030_remots/#configuracio-de-la-clau-ssh","title":"Configuraci\u00f3 de la clau SSH","text":"

    Per autenticar-te amb el servidor de GitHub mitjan\u00e7ant el protocol SSH, has de configurar una clau SSH en el teu sistema local i afegir-la al teu compte de GitHub.

    Documentaci\u00f3

    Per generar una clau SSH, segueix els seg\u00fcents passos.

    TerminalInterf\u00edcie gr\u00e0fica

    Despr\u00e9s, configura la clau SSH al teu compte de GitHub seguint els seg\u00fcents passos:

    Important

    Aquesta configuraci\u00f3 s'ha de repetir per cada dispositiu on vulgues autenticar-te amb el servidor de GitHub mitjan\u00e7ant el protocol SSH.

    ","tags":["git clone","git fetch","git pull","git push","git remote","github","ssh","personal access token","origin","remot","--set-upstream"]},{"location":"apunts/030_remots/#configurar-un-repositori-remot-git-remote","title":"Configurar un repositori remot (git remote)","text":"

    El primer pas \u00e9s enlla\u00e7ar el teu Repositori Local amb el Repositori Remot que acabem de crear. Per fer-ho, utilitzarem la comanda git remote.

    La comanda git remote permet gestionar els repositoris remots associats al teu repositori local.

    La sintaxi \u00e9s la seg\u00fcent:

    git remote [add|rename|remove|show] [<options>]\n

    Aquesta comanda permet realitzar les seg\u00fcents accions:

    Cadascuna d'aquestes opcions t\u00e9 les seues pr\u00f2pies opcions i arguments.

    Documentaci\u00f3

    Documentaci\u00f3 oficial de git remote: https://git-scm.com/docs/git-remote

    ","tags":["git clone","git fetch","git pull","git push","git remote","github","ssh","personal access token","origin","remot","--set-upstream"]},{"location":"apunts/030_remots/#afegir-un-repositori-remot","title":"Afegir un repositori remot","text":"

    Per afegir un repositori remot, utilitzarem la comanda git remote add.

    La sintaxi \u00e9s la seg\u00fcent:

    git remote add <nom> <url>\n

    Figura 6: Repositori Local vinculat amb un Repositori Remot

    Warning

    Si intentes publicar amb git push els canvis en un repositori remot sense haver enlla\u00e7at el teu repositori local, Git et mostrar\u00e0 un missatge d'error:

    jpuigcerver@fp:~/git_remots (main) $ git remote # (1)!\njpuigcerver@fp:~/git_remots (main) $ git push\nfatal: No configured push destination.\nEither specify the URL from the command-line or configure a remote repository using\n\n    git remote add <name> <url>\n\nand then push using the remote name\n\n    git push <name>\n

    1. Aquesta ordre no mostra res perqu\u00e8 encara no hi ha configurat cap remot.

    Example

    Enlla\u00e7arem el nostre repositori local amb el repositori remot creat anteriorment a GitHub.

    La URL del repositori remot \u00e9s git@github.com:jpuigcerver/git_remots.git(1).

    jpuigcerver@fp:~/git_remots (main) $ git remote\njpuigcerver@fp:~/git_remots (main) $ git remote add origin git@github.com:jpuigcerver/git_remots.git\njpuigcerver@fp:~/git_remots (main) $ git remote\norigin\njpuigcerver@fp:~/git_remots (main) $ git remote show origin\n* remote origin\n  Fetch URL: git@github.com:jpuigcerver/git_remots.git\n  Push  URL: git@github.com:jpuigcerver/git_remots.git\n  HEAD branch: (unknown)\n
    1. Utilitzem la URL SSH ja que he decidit utilitzar aquest m\u00e8tode d'autenticaci\u00f3.
    ","tags":["git clone","git fetch","git pull","git push","git remote","github","ssh","personal access token","origin","remot","--set-upstream"]},{"location":"apunts/030_remots/#renombrar-un-repositori-remot","title":"Renombrar un repositori remot","text":"

    L'ordre git remote rename permet canviar el nom d'un repositori remot associat al teu repositori local.

    La sintaxi \u00e9s la seg\u00fcent:

    git remote rename <antic> <nou>\n

    ","tags":["git clone","git fetch","git pull","git push","git remote","github","ssh","personal access token","origin","remot","--set-upstream"]},{"location":"apunts/030_remots/#eliminar-un-repositori-remot","title":"Eliminar un repositori remot","text":"

    L'ordre git remote remove permet eliminar un repositori remot associat al teu repositori local.

    La sintaxi \u00e9s la seg\u00fcent:

    git remote remove <nom>\n

    ","tags":["git clone","git fetch","git pull","git push","git remote","github","ssh","personal access token","origin","remot","--set-upstream"]},{"location":"apunts/030_remots/#associacio-entre-branques-locals-i-remotes-git-push-set-upstream","title":"Associaci\u00f3 entre branques locals i remotes (git push --set-upstream)","text":"

    De moment, les branques que hem creat resideixen en el repositori local, \u00e9s a dir, en el nostre dispositiu.

    Podem associar les branques locals a branques remotes, del repositori remot, perqu\u00e8 els canvis que fem localment es puguen veure reflectits en el repositori remot.

    Per fer-ho, utilitzarem la comanda git push amb l'opci\u00f3 -u o --set-upstream.

    git push [-u|--set-upstream] <remot> <branca>\n

    Documentaci\u00f3

    Documentaci\u00f3 oficial de git push: https://git-scm.com/docs/git-push

    Important

    Aquesta comanda funciona sobre la branca on estem situats (HEAD).

    Figura 7: Associaci\u00f3 d'una branca local a una branca remota

    Consell

    Pots configurar git perqu\u00e8 configure autom\u00e0ticament la branca local perqu\u00e8 s'associe amb la branca remota amb el mateix nom amb l'opci\u00f3 push.autoSetupRemote.

    git config --global push.autoSetupRemote true\n

    Associaci\u00f3 branca local i remota

    Vegem que inicialment la branca main no est\u00e0 associada a cap branca remota.

    Si intentem fer un git push, ens mostrar\u00e0 un missatge d'error com que hem d'anar associar una branca remota.

    jpuigcerver@fp:~/git_remots (main) $ git lga\n* b7adb78 - (2 seconds ago) README.md: Descripci\u00f3 - Joan Puigcerver (HEAD -> main)\n* a41ab9e - (2 seconds ago) README.md: T\u00edtol - Joan Puigcerver\njpuigcerver@fp:~/git_remots (main) $ git push\nfatal: The current branch main has no upstream branch.\nTo push the current branch and set the remote as upstream, use\n\n    git push --set-upstream origin main\n\nTo have this happen automatically for branches without a tracking\nupstream, see 'push.autoSetupRemote' in 'git help config'.\n

    Associem les branques main local i remota amb l'ordre git push --set-upstream.

    Localment, s'ha creat la refer\u00e8ncia origin/main que apunta a la branca remota main.

    jpuigcerver@fp:~/git_remots (main) $ git push --set-upstream origin main\nEnumerating objects: 6, done.\nCounting objects: 100% (6/6), done.\nDelta compression using up to 12 threads\nCompressing objects: 100% (3/3), done.\nWriting objects: 100% (6/6), 503 bytes | 503.00 KiB/s, done.\nTotal 6 (delta 1), reused 0 (delta 0), pack-reused 0 (from 0)\nremote: Resolving deltas: 100% (1/1), done.\nTo github.com:jpuigcerver/git_remots.git\n * [new branch]      main -> main\nbranch 'main' set up to track 'origin/main'.\njpuigcerver@fp:~/git_remots (main) $ git lga\n* b7adb78 - (2 seconds ago) README.md: Descripci\u00f3 - Joan Puigcerver (HEAD -> main, origin/main)\n* a41ab9e - (2 seconds ago) README.md: T\u00edtol - Joan Puigcerver\n

    Vegem que els canvis s'han publicat correctament al repositori remot:

    Figura 8: Canvis publicats a GitHub

    ","tags":["git clone","git fetch","git pull","git push","git remote","github","ssh","personal access token","origin","remot","--set-upstream"]},{"location":"apunts/030_remots/#clonacio-dun-repositori-remot-git-clone","title":"Clonaci\u00f3 d'un repositori remot (git clone)","text":"

    L'ordre git clone permet copiar un repositori remot a un repositori local en el teu sistema, des del qual podr\u00e0s realitzar canvis.

    Aquesta ordre c\u00f2pia els continguts del Directori de Treball i tota la informaci\u00f3 del Repositori Local, incloent la hist\u00f2ria de canvis. A m\u00e9s, configura autom\u00e0ticament el repositori remot com a origin.

    La sintaxi \u00e9s la seg\u00fcent:

    git clone <url> [<directori>]\n

    Figura 9: Clonaci\u00f3 d'un repositori remot

    Pau clona el repositori remot

    En aquest exemple, el desenvolupador Pau clonar\u00e0 el repositori remot git_remots sobre el directori ~/git_remots_pau del seu sistema.

    S'ha modificat el prompt per indicar les comandes que executaria Pau.

    pau@fp:~ $ git clone git@github.com:jpuigcerver/git_remots.git ~/git_remots_pau\nCloning into '/home/pau/git_remots_pau'...\nremote: Enumerating objects: 6, done.\nremote: Counting objects: 100% (6/6), done.\nremote: Compressing objects: 100% (2/2), done.\nremote: Total 6 (delta 1), reused 6 (delta 1), pack-reused 0 (from 0)\nReceiving objects: 100% (6/6), done.\nResolving deltas: 100% (1/1), done.\npau@fp:~ $ cd ~/git_remots_pau\npau@fp:~/git_remots_pau (main) $ ls\nREADME.md\npau@fp:~/git_remots_pau (main) $ git lg\n* b7adb78 - (10 minutes ago) README.md: Descripci\u00f3 - Joan Puigcerver (HEAD -> main, origin/main)\n* a41ab9e - (10 minutes ago) README.md: T\u00edtol - Joan Puigcerver\n

    S'observa que s'ha clonat correctament el repositori remot git_remots al directori ~/git_remots_pau, que cont\u00e9 els fitxers i la hist\u00f2ria de canvis del repositori remot.

    ","tags":["git clone","git fetch","git pull","git push","git remote","github","ssh","personal access token","origin","remot","--set-upstream"]},{"location":"apunts/030_remots/#sincronitzacio-entre-repositoris-git-fetch","title":"Sincronitzacio entre repositoris (git fetch)","text":"Preparaci\u00f3: Pau realitza canvis

    Pau crea el fitxer pau.txt amb el contingut Canvi realitzat per Pau.

    pau@fp:~/git_remots_pau (main) $ echo \"Canvi realitzat per Pau\" > pau.txt\npau@fp:~/git_remots_pau (main) $ git status\n    On branch main\nYour branch is up to date with 'origin/main'.\n\nUntracked files:\n  (use \"git add <file>...\" to include in what will be committed)\n    pau.txt\n\nnothing added to commit but untracked files present (use \"git add\" to track)\npau@fp:~/git_remots_pau (main) $ git add pau.txt\npau@fp:~/git_remots_pau (main) $ git commit -m \"pau.txt: Canvi realitzat per Pau\"\n[main 1b3b4b0] pau.txt: Canvi realitzat per Pau\n 1 file changed, 1 insertion(+)\n create mode 100644 pau.txt\npau@fp:~/git_remots_pau (main) $ git lg\n* 1b3b4b0 - (2 minutes ago) pau.txt: Canvi realitzat per Pau - Pau (HEAD -> main)\n* b7adb78 - (10 minutes ago) README.md: Descripci\u00f3 - Joan Puigcerver (origin/main)\n* a41ab9e - (10 minutes ago) README.md: T\u00edtol - Joan Puigcerver\n

    Despr\u00e9s, Pau puja els canvis al repositori remot.

    pau@fp:~/git_remots_pau (main) $ git push\nEnumerating objects: 4, done.\nCounting objects: 100% (4/4), done.\nDelta compression using up to 12 threads\nCompressing objects: 100% (2/2), done.\nWriting objects: 100% (3/3), 303 bytes | 303.00 KiB/s, done.\nTotal 3 (delta 0), reused 0 (delta 0), pack-reused 0\nTo github.com:jpuigcerver/git_remots.git\n   b7adb78..1b3b4b0  main -> main\npau@fp:~/git_remots_pau (main) $ git lg\n* 1b3b4b0 - (2 minutes ago) pau.txt: Canvi realitzat per Pau - Pau (HEAD -> main, origin/main)\n* b7adb78 - (10 minutes ago) README.md: Descripci\u00f3 - Joan Puigcerver\n* a41ab9e - (10 minutes ago) README.md: T\u00edtol - Joan Puigcerver\n

    En aquest moment, Pau ha realitzat un canvi en el repositori remot, que no est\u00e0 reflectit en el nostre repositori local.

    jpuigcerver@fp:~/git_remots (main) $ git lg\n* b7adb78 - (10 minutes ago) README.md: Descripci\u00f3 - Joan Puigcerver (HEAD -> main, origin/main)\n* a41ab9e - (10 minutes ago) README.md: T\u00edtol - Joan Puigcerver\n

    Per sincronitzar l'estat dels repositoris, utilitzarem l'ordre git fetch.

    Figura 10: Sincronitzaci\u00f3 entre repositoris

    Aquesta ordre actualitza la informaci\u00f3 de les branques remotes origin/<branca> al nostre repositori local, per\u00f2 no aplicar\u00e0 els canvis a les nostres branques locals.

    git fetch [<options>] [<remot>]\n

    Documentaci\u00f3

    Documentaci\u00f3 oficial de git fetch: https://git-scm.com/docs/git-fetch

    Info

    Aquesta ordre \u00e9s \u00fatil per obtindre la informaci\u00f3 dels canvis realitzats en el repositori remot i decidir si volem incorporar-los al nostre repositori local.

    git fetch

    Sincronitzem el repositori local amb el repositori remot, que cont\u00e9 els canvis realitzats per Pau.

    jpuigcerver@fp:~/git_remots (main) $ git fetch\nremote: Enumerating objects: 4, done.\nremote: Counting objects: 100% (4/4), done.\nremote: Compressing objects: 100% (2/2), done.\nremote: Total 3 (delta 0), reused 0 (delta 0), pack-reused 0\nUnpacking objects: 100% (3/3), done.\nFrom github.com:jpuigcerver/git_remots\n   b7adb78..1b3b4b0  main     -> origin/main\njpuigcerver@fp:~/git_remots (main) $ git lg\n* 1b3b4b0 - (2 minutes ago) pau.txt: Canvi realitzat per Pau - Pau (origin/main)\n* b7adb78 - (10 minutes ago) README.md: Descripci\u00f3 - Joan Puigcerver (HEAD -> main)\n* a41ab9e - (10 minutes ago) README.md: T\u00edtol - Joan Puigcerver\n

    S'observa que la branca origin/main s'ha actualitzat amb el canvi realitzat per Pau, per\u00f2 la branca main continua en el commit anterior.

    ","tags":["git clone","git fetch","git pull","git push","git remote","github","ssh","personal access token","origin","remot","--set-upstream"]},{"location":"apunts/030_remots/#incorporacio-de-canvis-git-pull","title":"Incorporaci\u00f3 de canvis (git pull)","text":"

    Per incorporar els canvis d'una branca remota a la branca local, utilitzarem l'ordre git pull.

    Aquesta ordre realitza dos accions:

    Figura 11: Incorporaci\u00f3 de canvis
    git pull [<options>] [<remot> [<branca>]]\n

    Documentaci\u00f3

    Documentaci\u00f3 oficial de git pull: https://git-scm.com/docs/git-pull

    Advert\u00e8ncia

    La fusi\u00f3 (merge) implicita de git pull pot ser directa (fast-forward) o es pot produir una fusi\u00f3 de branques divergents si la branca local i la branca remota divergeixen.

    En aquest \u00faltim cas:

    Consell

    Per evitar la fusi\u00f3 de branques divergents en git pull, es pot fer el seg\u00fcent:

    Incorporaci\u00f3 de canvis fusi\u00f3 directa

    Vegem com el commit 1b3b4b0 forma part de la branca remota origin/main, per\u00f2 no de la branca local main.

    jpuigcerver@fp:~/git_remots (main) $ git lg\n* 1b3b4b0 - (2 minutes ago) pau.txt: Canvi realitzat per Pau - Pau (origin/main)\n* b7adb78 - (10 minutes ago) README.md: Descripci\u00f3 - Joan Puigcerver (HEAD -> main)\n* a41ab9e - (10 minutes ago) README.md: T\u00edtol - Joan Puigcerver\njpuigcerver@fp:~/git_remots (main) $ git status\nOn branch main\nYour branch is behind 'origin/main' by 1 commit, and can be fast-forwarded.\n  (use \"git pull\" to update your local branch)\n\nnothing to commit, working tree clean\n

    Incorporem els canvis de la branca remota origin/main a la branca local main.

    jpuigcerver@fp:~/git_remots (main) $ git pull\nUpdating b7adb78..1b3b4b0\nFast-forward\n pau.txt | 1 +\n 1 file changed, 1 insertion(+)\n create mode 100644 pau.txt\njpuigcerver@fp:~/git_remots (main) $ git lg\n* 1b3b4b0 - (2 minutes ago) pau.txt: Canvi realitzat per Pau - Pau (HEAD -> main, origin/main)\n* b7adb78 - (10 minutes ago) README.md: Descripci\u00f3 - Joan Puigcerver\n* a41ab9e - (10 minutes ago) README.md: T\u00edtol - Joan Puigcerver\n

    Incorporaci\u00f3 de canvis canvi de base

    Preparaci\u00f3: M\u00e9s canvis de Pau
    pau@fp:~/git_remots_pau (main) $ echo \"Un altre canvi de Pau\" >> pau.txt\npau@fp:~/git_remots_pau (main) $ git commit -a -m \"pau.txt: Un altre canvi de Pau\"\n[main 2b3b4b0] pau.txt: Un altre canvi de Pau\n 1 file changed, 1 insertion(+)\npau@fp:~/git_remots_pau (main) $ git push\nEnumerating objects: 4, done.\nCounting objects: 100% (4/4), done.\nDelta compression using up to 12 threads\nCompressing objects: 100% (2/2), done.\nWriting objects: 100% (3/3), 303 bytes | 303.00 KiB/s, done.\nTotal 3 (delta 0), reused 0 (delta 0), pack-reused 0\nTo github.com:jpuigcerver/git_remots.git\n   1b3b4b0..2b3b4b0  main -> main\npau@fp:~/git_remots_pau (main) $ git lg\n* 2b3b4b0 - (2 minutes ago) pau.txt: Un altre canvi de Pau - Pau (HEAD -> main, origin/main)\n* 1b3b4b0 - (10 minutes ago) pau.txt: Canvi realitzat per Pau - Pau\n* b7adb78 - (10 minutes ago) README.md: Descripci\u00f3 - Joan Puigcerver\n* a41ab9e - (10 minutes ago) README.md: T\u00edtol - Joan Puigcerver\n

    Una de les situacions m\u00e9s comunes que ens porten a que la branca local divergisca de la branca remota \u00e9s quan realitzem canvis sobre la branca local sense haver sincronitzat abans el seu estat amb la branca remota associada.

    En aquest cas, Pau ha realitzat un altre canvi en el repositori remot, que nosaltrens no hem incorporat.

    No obstant aix\u00f2, anem a fer un canvi a la branca local main, simulant la situaci\u00f3 anteriorment descrita.

    jpuigcerver@fp:~/git_remots (main) $ git lg # (1)!\n* 1b3b4b0 - (2 minutes ago) pau.txt: Canvi realitzat per Pau - Pau (HEAD -> main, origin/main)\n* b7adb78 - (10 minutes ago) README.md: Descripci\u00f3 - Joan Puigcerver\n* a41ab9e - (10 minutes ago) README.md: T\u00edtol - Joan Puigcerver\njpuigcerver@fp:~/git_remots (main) $ echo \"Canvi realitzat per Joan\" >> joan.txt\njpuigcerver@fp:~/git_remots (main) $ git add joan.txt\njpuigcerver@fp:~/git_remots (main) $ git commit -m \"joan.txt: Canvi realitzat per Joan\"\n[main 3b4b0b0] joan.txt: Canvi realitzat per Joan\n 1 file changed, 1 insertion(+)\n create mode 100644 joan.txt\njpuigcerver@fp:~/git_remots (main) $ git lg\n* 3b4b0b0 - (2 minutes ago) joan.txt: Canvi realitzat per Joan - Joan Puigcerver (HEAD -> main)\n* 1b3b4b0 - (10 minutes ago) pau.txt: Canvi realitzat per Pau - Pau (origin/main)\n* b7adb78 - (10 minutes ago) README.md: Descripci\u00f3 - Joan Puigcerver\n* a41ab9e - (10 minutes ago) README.md: T\u00edtol - Joan Puigcerver\n
    1. En aquest moment, el canvi de Pau 2b3b4b0 no est\u00e0 reflectit en el nostre repositori local.

    En aquest moment, podr\u00edem intentar publicar aquest canvi al repositori remot, per\u00f2 ens mostrar\u00e0 un error com que el repositori remot t\u00e9 canvis que no estan reflectits en el nostre repositori local.

    jpuigcerver@fp:~/git_remots (main) $ git push\nTo github.com:jpuigcerver/git_remots.git\n! [rejected]        main -> main (fetch first)\nerror: failed to push some refs to 'github.com:jpuigcerver/git_remots.git'\nhint: Updates were rejected because the remote contains work that you do not\nhint: have locally. This is usually caused by another repository pushing to\nhint: the same ref. If you want to integrate the remote changes, use\nhint: 'git pull' before pushing again.\nhint: See the 'Note about fast-forwards' in 'git push --help' for details.\njpuigcerver@fp:~/git_remots (main) $ git lga\n* 3b4b0b0 - (2 minutes ago) joan.txt: Canvi realitzat per Joan - Joan Puigcerver (HEAD -> main)\n| * 2b3b4b0 - (2 minutes ago) pau.txt: Un altre canvi de Pau - Pau (origin/main)\n|/\n* 1b3b4b0 - (10 minutes ago) pau.txt: Canvi realitzat per Pau - Pau\n* b7adb78 - (10 minutes ago) README.md: Descripci\u00f3 - Joan Puigcerver\n* a41ab9e - (10 minutes ago) README.md: T\u00edtol - Joan Puigcerver\n

    Vegem que l'ordre git push ens recomana fer un git pull per incorporar els canvis, ja que les dues branques han divergit.

    Si executem git pull, es produir\u00e0 una fusi\u00f3 de branques divergents, que crear\u00e0 un commit de fusi\u00f3 i resultar\u00e0 en una hist\u00f2ria no lineal.

    Intentem fer un git pull --ff-only per veure-ho.

    jpuigcerver@fp:~/git_remots (main) $ git pull --ff-only\nhint: Diverging branches can't be fast-forwarded, you need to either:\nhint:\nhint:   git merge --no-ff\nhint:\nhint: or:\nhint:\nhint:   git rebase\nhint:\nhint: Disable this message with \"git config advice.diverging false\"\nfatal: Not possible to fast-forward, aborting.\n

    Si volem conservar una hist\u00f2ria lineal, haurem de fer un canvi de base amb git pull --rebase.

    jpuigcerver@fp:~/git_remots (main) $ git pull --rebase\nSuccessfully rebased and updated refs/heads/main.\njpuigcerver@fp:~/git_remots (main) $ git lga\n* 3b4b0b0 - (2 minutes ago) joan.txt: Canvi realitzat per Joan - Joan Puigcerver (HEAD -> main)\n* 2b3b4b0 - (2 minutes ago) pau.txt: Un altre canvi de Pau - Pau (origin/main)\n* 1b3b4b0 - (10 minutes ago) pau.txt: Canvi realitzat per Pau - Pau\n* b7adb78 - (10 minutes ago) README.md: Descripci\u00f3 - Joan Puigcerver\n* a41ab9e - (10 minutes ago) README.md: T\u00edtol - Joan Puigcerver\n
    ","tags":["git clone","git fetch","git pull","git push","git remote","github","ssh","personal access token","origin","remot","--set-upstream"]},{"location":"apunts/030_remots/#recursos-addicionals","title":"Recursos addicionals","text":"","tags":["git clone","git fetch","git pull","git push","git remote","github","ssh","personal access token","origin","remot","--set-upstream"]},{"location":"apunts/030_remots/#bibliografia","title":"Bibliografia","text":"","tags":["git clone","git fetch","git pull","git push","git remote","github","ssh","personal access token","origin","remot","--set-upstream"]},{"location":"apunts/04_avancat/","title":"Bloc 4: Git avan\u00e7at","text":"","tags":["tag","squash","reset","revert","cherry-pick","stash"]},{"location":"apunts/04_avancat/#git-avancat","title":"Git avan\u00e7at","text":"

    En aquest bloc estudiarem algunes de les comandes avancades de Git que ens permetran realitzar tasques m\u00e9s complexes i espec\u00edfiques en el nostre projecte.

    ","tags":["tag","squash","reset","revert","cherry-pick","stash"]},{"location":"apunts/04_avancat/#etiquetes","title":"Etiquetes","text":"","tags":["tag","squash","reset","revert","cherry-pick","stash"]},{"location":"apunts/04_avancat/#numeracio-de-versions","title":"Numeraci\u00f3 de versions","text":"","tags":["tag","squash","reset","revert","cherry-pick","stash"]},{"location":"apunts/04_avancat/#eliminacio-de-canvis","title":"Eliminaci\u00f3 de canvis","text":"","tags":["tag","squash","reset","revert","cherry-pick","stash"]},{"location":"apunts/04_avancat/#revert","title":"revert","text":"","tags":["tag","squash","reset","revert","cherry-pick","stash"]},{"location":"apunts/04_avancat/#reset","title":"reset","text":"","tags":["tag","squash","reset","revert","cherry-pick","stash"]},{"location":"apunts/04_avancat/#reserva-de-canvis-stash","title":"Reserva de canvis: stash","text":"","tags":["tag","squash","reset","revert","cherry-pick","stash"]},{"location":"apunts/04_avancat/#copia-de-canvis-cherry-pick","title":"C\u00f2pia de canvis: cherry-pick","text":"","tags":["tag","squash","reset","revert","cherry-pick","stash"]},{"location":"apunts/04_avancat/#fusio-de-canvis-en-un-sol-commit-squash","title":"Fusi\u00f3 de canvis en un sol commit: squash","text":"","tags":["tag","squash","reset","revert","cherry-pick","stash"]},{"location":"apunts/050_estrategies_ramificacio/","title":"Bloc 5: Estrat\u00e8gies de ramificaci\u00f3","text":"","tags":["gitflow","develop","feature","release","hotfix"]},{"location":"apunts/050_estrategies_ramificacio/#estrategies-de-ramificacio","title":"Estrat\u00e8gies de ramificaci\u00f3","text":"

    En un projecte de desenvolupament de programari que utilitza Git com a sistema de control de versions, la gesti\u00f3 de les branques \u00e9s important per aconseguir un flux de treball eficient i ordenat.

    Les metodologies de treball amb branques s'anomenen estrat\u00e8gies de ramificaci\u00f3, que son un conjunt de regles i pautes que defineixen com s'han de crear, fusionar i mantindre les branques en un projecte.

    Aquesta part \u00e9s essencial, ja que permet el desenvolupament en paral\u00b7lel de diferents funcionalitats i garanteix la correcta integraci\u00f3 de les diferents parts del projecte.

    Existeixen diverses estrat\u00e8gies de ramificaci\u00f3 per\u00f2, totes, en certa manera, comparteixen els mateixos principis b\u00e0sics:

    Utilitzant aquestes caracter\u00edstiques, es pot adaptar el flux de treball a les necessitats del projecte, on podem decidir quin tipus de branca incorporar en la nostra metodologia de treball.

    Exemple

    En projectes xicotets pot ser no \u00e9s necess\u00e0ria una branca de desenvolupament develop o branques de publicaci\u00f3 release/*.

    A m\u00e9s, les estrat\u00e8gies poden ser utilitzades en combinaci\u00f3 amb altres t\u00e8cniques com les Pull Requests, que veurem en el Bloc 6: Gesti\u00f3 de projectes.

    ","tags":["gitflow","develop","feature","release","hotfix"]},{"location":"apunts/050_estrategies_ramificacio/#branques-amb-un-proposit-unic","title":"Branques amb un prop\u00f2sit \u00fanic","text":"

    Les estrat\u00e8gies de ramificaci\u00f3 m\u00e9s comuns es basen en la creaci\u00f3 de diferents branques, cadascuna amb un prop\u00f2sit concret i una s\u00e8rie de regles per aconseguir una integraci\u00f3 eficient de les funcionalitats:

    ","tags":["gitflow","develop","feature","release","hotfix"]},{"location":"apunts/050_estrategies_ramificacio/#avantatges-i-desavantatges","title":"Avantatges i desavantatges","text":"

    Utilitzar aquest tipus d'estrat\u00e8gies de ramificaci\u00f3 presenta una s\u00e8rie d'avantatges i desavantatges que cal tindre en compte a l'hora de decidir si val la pena utilitzar-les.

    Els avantatges principals s\u00f3n:

    El principal desavantatge \u00e9s:

    A m\u00e9s, \u00e9s important adaptar la metodologia a les necessitats del projecte i no seguir-la de forma estricta si no aporta valor afegit.

    ","tags":["gitflow","develop","feature","release","hotfix"]},{"location":"apunts/050_estrategies_ramificacio/#bones-practiques","title":"Bones pr\u00e0ctiques","text":"

    Per utilitzar les estr\u00e0tegies de ramificaci\u00f3 de forma eficient, \u00e9s important seguir una s\u00e8rie de bones pr\u00e0ctiques que ajudaran a mantrindre l'ordre i la coher\u00e8ncia en el projecte.

    Algunes de les bones pr\u00e0ctiques m\u00e9s importants s\u00f3n:

    ","tags":["gitflow","develop","feature","release","hotfix"]},{"location":"apunts/050_estrategies_ramificacio/#integracio-de-les-funcionalitats","title":"Integraci\u00f3 de les funcionalitats","text":"

    El proc\u00e9s per integrar les funcionalitats a la branca de desenvolupament develop \u00e9s el seg\u00fcent:

    Important

    Segons la t\u00e8cnica d'integraci\u00f3 triada, els punts 3 i 4 poden variar.

    1. Sincronitzar l'estat del repositori local amb el remot amb git fetch.
    2. Actualitzar la branca local develop amb els canvis del remot git pull.

      Tip

      Per evitar possibles conflictes i errors, es recomana configurar git pull perqu\u00e8 sols puga incorporar els canvis de manera directa (fast-forward).

      git config [--global] pull.ff only\n
    3. Actualitzar la branca feature/* amb els nous canvis de develop.

    4. Incorporar els canvis de la branca feature/* amb la branca develop amb la t\u00e8cnica triada.
    5. Publicar els canvis de la branca develop al repositori remot amb git push.

      Danger

      En aquest punt podria passar que mentre has realitzat aquest proc\u00e9s, altres desenvolupadors hagen publicat nous canvis.

      En aquest cas, caldria integrar els canvis de develop amb git pull --rebase.

    6. Eliminar les branques feature/* del repositori local i del remot.

    ","tags":["gitflow","develop","feature","release","hotfix"]},{"location":"apunts/050_estrategies_ramificacio/#fusio-merge-no-ff","title":"Fusi\u00f3 merge -no-ff","text":"

    Gitflow \u00e9s una de les estrat\u00e8gies de ramificaci\u00f3 m\u00e9s conegudes i utilitzades en projectes de desenvolupament de programari.

    Aquesta metodologia es basa en la creaci\u00f3 de les branques main, develop, feature/*, release/* i hotfix/*.

    www.atlassian.com Figura 1: Exemple de branques amb Gitflow

    La particularitat d'aquesta estrat\u00e8gia \u00e9s que la fusi\u00f3 de les branques de funcionalitat feature/* amb la branca de desenvolupament develop \u00e9s realitza mitjan\u00e7ant merge --no-ff, de manera que es conserva la hist\u00f2ria de les branques de funcionalitat que es fusionen mitjan\u00e7ant un commit de fusi\u00f3.

    @TODO: Figura merge --no-ff

    Els avantatges principals s\u00f3n:

    El principal desavantatge \u00e9s:

    ","tags":["gitflow","develop","feature","release","hotfix"]},{"location":"apunts/050_estrategies_ramificacio/#canvi-de-base-rebase","title":"Canvi de base rebase","text":"

    Aquest m\u00e8tode per fusionar les branques de funcionalitat es basa en la utilitzaci\u00f3 del canvi de base rebase.

    @TODO: Figura rebase

    Els avantatges s\u00f3\u00f1:

    El principal desavantatge \u00e9s:

    ","tags":["gitflow","develop","feature","release","hotfix"]},{"location":"apunts/050_estrategies_ramificacio/#fusio-rebase-merge-no-ff","title":"Fusi\u00f3 rebase + merge -no-ff","text":"

    Aquesta opci\u00f3 combina les dues opcions anteriors per tal d'aprofitar els avantatges de cadascuna i a la vegada minimitzar els seus desavantatges.

    Aquest m\u00e8tode es basa en realitzar un canvi de base rebase i despr\u00e9s fusionar la branca de funcionalitat mitjan\u00e7ant un commit de fusi\u00f3 amb merge --no-ff.

    @TODO: Figura rebase + merge --no-ff

    Els avantatges principals s\u00f3n:

    ","tags":["gitflow","develop","feature","release","hotfix"]},{"location":"apunts/050_estrategies_ramificacio/#fusio-merge-squash","title":"Fusi\u00f3 merge --squash","text":"

    Aquesta opci\u00f3 consisteix a fusionar les branques de funcionalitat amb la branca de desenvolupament develop mitjan\u00e7ant merge --squash, de manera que tots els commits de la branca de funcionalitat es fusionen en un \u00fanic commit.

    @TODO: Figura merge --squash

    En el cas que hi hagen conflictes, una bona pr\u00e0ctica \u00e9s integrar els canvis de develop a la branca de funcionalitat i resoldre'ls abans de realitzar la fusi\u00f3.

    Per realitzar aquesta integraci\u00f3 de canvis, es recomana utilitzar git merge. Com que la branca de funcionalitat ser\u00e0 eliminada despr\u00e9s de la fusi\u00f3, no importa si la hist\u00f2ria de la branca de funcionalitat es mant\u00e9 neta o no.

    Info

    Tamb\u00e9 es podria realitzar la fusi\u00f3 amb rebase, per\u00f2 si hi ha molts commits a la branca de funcionalitat, aquesta opci\u00f3 pot ser m\u00e9s complicada ja que podrien sorgir conflictes en cada commit.

    @TODO: Figura merge --no-ff + merge --squash

    Els avantatges principals s\u00f3n:

    El principal desavantatge \u00e9s:

    ","tags":["gitflow","develop","feature","release","hotfix"]},{"location":"apunts/050_estrategies_ramificacio/#bibliografia","title":"Bibliografia","text":"","tags":["gitflow","develop","feature","release","hotfix"]},{"location":"apunts/051_exemple_ramificacio/","title":"Exemple 5: Estrat\u00e8gia de ramificaci\u00f3","text":""},{"location":"apunts/051_exemple_ramificacio/#exemple-estrategia-de-ramificacio","title":"Exemple: Estrat\u00e8gia de ramificaci\u00f3","text":"

    En aquest material veurem com es pot utilitzar una estrat\u00e8gia de ramificaci\u00f3 en un projecte de desenvolupament de programari.

    En aquest projecte utilitzarem la t\u00e8cnica d'integraci\u00f3 Fusi\u00f3 merge --squash.

    "},{"location":"apunts/051_exemple_ramificacio/#repositori-remot","title":"Repositori remot","text":"

    Anem a simular un projecte de desenvolupament de programari on tres desenvolupadors treballen en diferents funcionalitats de manera independent.

    Per evitar haver de crear un repositori a GitHub, crearem un repositori remot en la m\u00e0quina local.

    jpuigcerver@fp:~ $ mkdir -p ~/gitflow/remot\njpuigcerver@fp:~ $ cd ~/gitflow/remot\njpuigcerver@fp:~/gitflow/remot $ git init\nInitialized empty Git repository in ~/gitflow/remot/.git/\njpuigcerver@fp:~/gitflow/remot (main) $ git branch -m main\njpuigcerver@fp:~/gitflow/remot (main) $ echo \"# Estrat\u00e8gies de ramificaci\u00f3\" > README.md\njpuigcerver@fp:~/gitflow/remot (main) $ git add README.md\njpuigcerver@fp:~/gitflow/remot (main) $ git commit -m \"Commit inicial\"\n[main (root-commit) a1acfb5] Commit inicial\n 1 file changed, 1 insertion(+)\n create mode 100644 README.md\njpuigcerver@fp:~/gitflow/remot (main) $ git lga\n* a1acfb5 - (0 seconds ago) Commit inicial - Joan Puigcerver (HEAD -> main)\njpuigcerver@fp:~/gitflow/remot (main) $ git config --bool core.bare true # (1)!\n
    1. Aquesta comanda \u00e9s necess\u00e0ria perqu\u00e8 el repositori siga configurat com a bare i puga ser utilitzat com a repositori remot.
    "},{"location":"apunts/051_exemple_ramificacio/#branca-de-desenvolupament","title":"Branca de desenvolupament","text":"

    El primer pas per establir un flux de treball amb Gitflow \u00e9s crear la branca de desenvolupament develop.

    jpuigcerver@fp:~/gitflow/remot (main) $ git branch develop\njpuigcerver@fp:~/gitflow/remot (main) $ git lga\n* a1acfb5 - (0 seconds ago) Commit inicial - Joan Puigcerver (HEAD -> main, develop)\n
    "},{"location":"apunts/051_exemple_ramificacio/#desenvolupament-de-funcionalitats","title":"Desenvolupament de funcionalitats","text":"

    En aquest punt, podem comen\u00e7ar a desenvolupar les diferents funcionalitats del projecte en branques independents.

    Crearem un repositori local per a cada desenvolupador, simulant que cadasc\u00fa treballa en el seu dispositiu.

    jpuigcerver@fp:~/gitflow/remot (main) $ cd ~/gitflow\njpuigcerver@fp:~/gitflow $ git clone remot anna\nCloning into 'anna'...\ndone.\njpuigcerver@fp:~/gitflow $ git clone remot pau\nCloning into 'pau'...\ndone.\njpuigcerver@fp:~/gitflow $ git clone remot mar\nCloning into 'mar'...\ndone.\njpuigcerver@fp:~/gitflow $ git clone remot carles\nCloning into 'carles'...\ndone.\njpuigcerver@fp:~/gitflow $ tree .\n.\n\u251c\u2500\u2500 anna\n\u2502\u00a0\u00a0 \u2514\u2500\u2500 README.md\n\u251c\u2500\u2500 carles\n\u2502\u00a0\u00a0 \u2514\u2500\u2500 README.md\n\u251c\u2500\u2500 mar\n\u2502\u00a0\u00a0 \u2514\u2500\u2500 README.md\n\u251c\u2500\u2500 pau\n\u2502\u00a0\u00a0 \u2514\u2500\u2500 README.md\n\u2514\u2500\u2500 remot\n    \u2514\u2500\u2500 README.md\n\n6 directories, 5 files\n

    Cada desenvolupador comen\u00e7ar\u00e0 a treballar en una nova funcionalitat.

    A partir d'aquest moment, cada desenvolupador treballar\u00e0 en el seu propi repositori, en la seua pr\u00f2pia branca de funcionalitat de manera independent i paral\u00b7lela.

    Important

    \u00c9s important que cada desenvolupador treballe en una \u00fanica 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\u00e0 ben definida i podr\u00e0 ser dividida en diverses funcionalitats m\u00e9s xicotetes.

    "},{"location":"apunts/051_exemple_ramificacio/#branca-featurereadme","title":"Branca feature/readme","text":"

    Anna comen\u00e7ar\u00e0 a treballar en la seua funcionalitat feature/readme en el seu repositori local.

    Nota

    Configurem l'usuari i el correu electr\u00f2nic per a cada repositori local per simular que cada desenvolupador treballa en el seu propi dispositiu.

    Tamb\u00e9 es mostra el nom en el prompt.

    anna@fp:~/gitflow $ cd ~/gitflow/anna\nanna@fp:~/gitflow/anna (main) $ git config user.name \"Anna\"\nanna@fp:~/gitflow/anna (main) $ git config user.email \"anna@fpmislata.com\"\nanna@fp:~/gitflow/anna (main) $ git checkout develop\nbranch 'develop' set up to track 'origin/develop'.\nSwitched to a new branch 'develop'\nanna@fp:~/gitflow/anna (develop) $ git checkout -b feature/readme\nSwitched to a new branch 'feature/readme'\nanna@fp:~/gitflow/anna (feature/readme) $ echo \"Les estrat\u00e8gies de ramificaci\u00f3 proporcionen un\" >> README.md\nanna@fp:~/gitflow/anna (feature/readme) $ echo \"marc de treball organitzat que facilita la col\u00b7laboraci\u00f3\" >> README.md\nanna@fp:~/gitflow/anna (feature/readme) $ echo \"entre diferents desenvolupadors en un mateix projecte\" >> README.md\nanna@fp:~/gitflow/anna (feature/readme) $ git commit -a -m \"README.md: Descripci\u00f3\"\n[feature/readme 651842a] README.md: Descripci\u00f3\n 1 file changed, 3 insertions(+)\nanna@fp:~/gitflow/anna (feature/readme) $ echo \"\" >> README.md\nanna@fp:~/gitflow/anna (feature/readme) $ echo \"La caracter\u00edstica principal \u00e9s la utilitzaci\u00f3\" >> README.md\nanna@fp:~/gitflow/anna (feature/readme) $ echo \"de branques amb un \u00fanic prop\u00f2sit.\" >> README.md\nanna@fp:~/gitflow/anna (feature/readme) $ git commit -a -m \"README.md: Branques prop\u00f2sit \u00fanic\"\n[feature/readme ad0d531] README.md: Branques prop\u00f2sit \u00fanic\n 1 file changed, 3 insertions(+)\nanna@fp:~/gitflow/anna (feature/readme) $ git push\nbranch 'feature/readme' set up to track 'origin/feature/readme'.\nTo ~/gitflow/remot\n * [new branch]      feature/readme -> feature/readme\nanna@fp:~/gitflow/anna (feature/readme) $ git lga\n* ad0d531 - (0 seconds ago) README.md: Branques prop\u00f2sit \u00fanic - Anna (HEAD -> feature/readme, origin/feature/readme)\n* 651842a - (0 seconds ago) README.md: Descripci\u00f3 - Anna\n* a1acfb5 - (0 seconds ago) Commit inicial - Joan Puigcerver (origin/main, origin/develop, origin/HEAD, main, develop)\n

    Els passos seguits per Anna s\u00f3n:

    "},{"location":"apunts/051_exemple_ramificacio/#branca-featurelicense","title":"Branca feature/license","text":"

    Pau comen\u00e7ar\u00e0 a treballar en la seua funcionalitat feature/license en el seu repositori local.

    pau@fp:~/gitflow $ cd ~/gitflow/pau\npau@fp:~/gitflow/pau (main) $ git config user.name \"Pau\"\npau@fp:~/gitflow/pau (main) $ git config user.email \"pau@fpmislata.com\"\npau@fp:~/gitflow/pau (main) $ git checkout develop\nbranch 'develop' set up to track 'origin/develop'.\nSwitched to a new branch 'develop'\npau@fp:~/gitflow/pau (develop) $ git checkout -b feature/license\nSwitched to a new branch 'feature/license'\npau@fp:~/gitflow/pau (feature/license) $ echo \"\" > LICENSE\npau@fp:~/gitflow/pau (feature/license) $ echo \"## Llic\u00e8ncia\" >> LICENSE\npau@fp:~/gitflow/pau (feature/license) $ echo \"CC BY-NC-SA 4.0 DEED - Reconeixement-NoComercial-CompartirIgual 4.0 Internacional\" >> LICENSE\npau@fp:~/gitflow/pau (feature/license) $ git add LICENSE\npau@fp:~/gitflow/pau (feature/license) $ git commit -m \"LICENSE: Afegida llic\u00e8ncia\"\n[feature/license d20ffa3] LICENSE: Afegida llic\u00e8ncia\n 1 file changed, 3 insertions(+)\n create mode 100644 LICENSE\npau@fp:~/gitflow/pau (feature/license) $ echo \"\" >> LICENSE\npau@fp:~/gitflow/pau (feature/license) $ echo \"M\u00e9s informaci\u00f3: https://creativecommons.org/licenses/by-nc-sa/4.0/deed.ca\" >> LICENSE\npau@fp:~/gitflow/pau (feature/license) $ git commit -a -m \"LICENSE: Enlla\u00e7 a la llic\u00e8ncia\"\n[feature/license db2c8a8] LICENSE: Enlla\u00e7 a la llic\u00e8ncia\n 1 file changed, 2 insertions(+)\npau@fp:~/gitflow/pau (feature/license) $ git push\nbranch 'feature/license' set up to track 'origin/feature/license'.\nTo ~/gitflow/remot\n * [new branch]      feature/license -> feature/license\npau@fp:~/gitflow/pau (feature/license) $ git lga\n* db2c8a8 - (0 seconds ago) LICENSE: Enlla\u00e7 a la llic\u00e8ncia - Pau (HEAD -> feature/license, origin/feature/license)\n* d20ffa3 - (0 seconds ago) LICENSE: Afegida llic\u00e8ncia - Pau\n* a1acfb5 - (0 seconds ago) Commit inicial - Joan Puigcerver (origin/main, origin/develop, origin/HEAD, main, develop)\n

    Els passos seguits per Pau s\u00f3n:

    "},{"location":"apunts/051_exemple_ramificacio/#branca-featureauthor","title":"Branca feature/author","text":"

    Mar comen\u00e7ar\u00e0 a treballar en la seua funcionalitat feature/author en el seu repositori local.

    mar@fp:~/gitflow $ cd ~/gitflow/mar\nmar@fp:~/gitflow/mar (main) $ git config user.name \"Mar\"\nmar@fp:~/gitflow/mar (main) $ git config user.email \"mar@fpmislata.com\"\nmar@fp:~/gitflow/mar (main) $ git checkout develop\nbranch 'develop' set up to track 'origin/develop'.\nSwitched to a new branch 'develop'\nmar@fp:~/gitflow/mar (develop) $ git checkout -b feature/author\nSwitched to a new branch 'feature/author'\nmar@fp:~/gitflow/mar (feature/author) $ echo \"\" >> README.md\nmar@fp:~/gitflow/mar (feature/author) $ echo \"## Autors\" >> README.md\nmar@fp:~/gitflow/mar (feature/author) $ git commit -a -m \"README.md: Secci\u00f3 d'autors\"\n[feature/author 0677978] README.md: Secci\u00f3 d'autors\n 1 file changed, 2 insertions(+)\nmar@fp:~/gitflow/mar (feature/author) $ echo \"- Anna (anna@fpmislata.com)\" >> README.md\nmar@fp:~/gitflow/mar (feature/author) $ git commit -a -m \"Autors: Anna\"\n[feature/author cebc3c1] Autors: Anna\n 1 file changed, 1 insertion(+)\nmar@fp:~/gitflow/mar (feature/author) $ echo \"- Pau (pau@fpmislata.com)\" >> README.md\nmar@fp:~/gitflow/mar (feature/author) $ git commit -a -m \"Autors: Pau\"\n[feature/author 32a7bd7] Autors: Pau\n 1 file changed, 1 insertion(+)\nmar@fp:~/gitflow/mar (feature/author) $ echo \"- Mar (mar@fpmislata.com)\" >> README.md\nmar@fp:~/gitflow/mar (feature/author) $ git commit -a -m \"Autors: Mar\"\n[feature/author 3e60c32] Autors: Mar\n 1 file changed, 1 insertion(+)\nmar@fp:~/gitflow/mar (feature/author) $ git push\nbranch 'feature/author' set up to track 'origin/feature/author'.\nTo ~/gitflow/remot\n * [new branch]      feature/author -> feature/author\nmar@fp:~/gitflow/mar (feature/author) $ git lga\n* 3e60c32 - (0 seconds ago) Autors: Mar - Mar (HEAD -> feature/author, origin/feature/author)\n* 32a7bd7 - (0 seconds ago) Autors: Pau - Mar\n* cebc3c1 - (0 seconds ago) Autors: Anna - Mar\n* 0677978 - (0 seconds ago) README.md: Secci\u00f3 d'autors - Mar\n* a1acfb5 - (0 seconds ago) Commit inicial - Joan Puigcerver (origin/main, origin/develop, origin/HEAD, main, develop)\n

    Els passos seguits per Mar s\u00f3n:

    "},{"location":"apunts/051_exemple_ramificacio/#integracio-de-les-funcionalitats","title":"Integraci\u00f3 de les funcionalitats","text":"

    En aquest punt, les tres funcionalitats han sigut desenvolupades de manera independent, i encara no han segut integrades a la branca de desenvolupament develop.

    jpuigcerver@fp:~/gitflow $ cd ~/gitflow/remot\njpuigcerver@fp:~/gitflow/remot (main) $ git lga\n* 3e60c32 - (0 seconds ago) Autors: Mar - Mar (feature/author)\n* 32a7bd7 - (0 seconds ago) Autors: Pau - Mar\n* cebc3c1 - (0 seconds ago) Autors: Anna - Mar\n* 0677978 - (0 seconds ago) README.md: Secci\u00f3 d'autors - Mar\n| * db2c8a8 - (0 seconds ago) LICENSE: Enlla\u00e7 a la llic\u00e8ncia - Pau (feature/license)\n| * d20ffa3 - (0 seconds ago) LICENSE: Afegida llic\u00e8ncia - Pau\n|/  \n| * ad0d531 - (0 seconds ago) README.md: Branques prop\u00f2sit \u00fanic - Anna (feature/readme)\n| * 651842a - (0 seconds ago) README.md: Descripci\u00f3 - Anna\n|/  \n* a1acfb5 - (0 seconds ago) Commit inicial - Joan Puigcerver (HEAD -> main, develop)\n

    Anem a veure com integrar les funcionalitats amb la t\u00e8cnica merge + merge --squash seguint el proc\u00e9s indicat a Integraci\u00f3 de les funcionalitats.

    "},{"location":"apunts/051_exemple_ramificacio/#integraco-de-featurereadme","title":"Integrac\u00f3 de feature/readme","text":"

    Anna ja ha acabat la seua funcionalitat feature/readme i vol integrar-la a la branca develop.

    Els passos que ha de seguir s\u00f3n:

    1. Sincronitzar l'estat del repositori local amb el remot amb git fetch.

      anna@fp:~/gitflow $ cd ~/gitflow/anna\nanna@fp:~/gitflow/anna (feature/readme) $ git fetch\nFrom ~/gitflow/remot\n * [new branch]      feature/author  -> origin/feature/author\n * [new branch]      feature/license -> origin/feature/license\nanna@fp:~/gitflow/anna (feature/readme) $ git lga\n* ad0d531 - (0 seconds ago) README.md: Branques prop\u00f2sit \u00fanic - Anna (HEAD -> feature/readme, origin/feature/readme)\n* 651842a - (0 seconds ago) README.md: Descripci\u00f3 - Anna\n| * 3e60c32 - (0 seconds ago) Autors: Mar - Mar (origin/feature/author)\n| * 32a7bd7 - (0 seconds ago) Autors: Pau - Mar\n| * cebc3c1 - (0 seconds ago) Autors: Anna - Mar\n| * 0677978 - (0 seconds ago) README.md: Secci\u00f3 d'autors - Mar\n|/  \n| * db2c8a8 - (0 seconds ago) LICENSE: Enlla\u00e7 a la llic\u00e8ncia - Pau (origin/feature/license)\n| * d20ffa3 - (0 seconds ago) LICENSE: Afegida llic\u00e8ncia - Pau\n|/  \n* a1acfb5 - (0 seconds ago) Commit inicial - Joan Puigcerver (origin/main, origin/develop, origin/HEAD, main, develop)\n
    2. Actualitzar la branca develop amb els canvis del remot.

      En aquest cas, ja est\u00e0 actualitzada.

      anna@fp:~/gitflow/anna (feature/readme) $ git checkout develop\nYour branch is up to date with 'origin/develop'.\nSwitched to branch 'develop'\nanna@fp:~/gitflow/anna (develop) $ git pull --ff-only\nAlready up to date.\n
    3. Actualitzar la branca feature/readme amb els canvis develop.

      En aquest cas, ja est\u00e0 actualitzada.

      anna@fp:~/gitflow/anna (develop) $ git checkout feature/readme\nYour branch is up to date with 'origin/feature/readme'.\nSwitched to branch 'feature/readme'\nanna@fp:~/gitflow/anna (feature/readme) $ git merge --no-ff --no-edit develop #(1)!\nAlready up to date.\n
      1. L'opci\u00f3 --no-edit evita obrir l'editor de text i deixa el missatge de commit per defecte.
    4. Fusionar la branca feature/readme amb develop.

      anna@fp:~/gitflow/anna (feature/readme) $ git checkout develop\nYour branch is up to date with 'origin/develop'.\nSwitched to branch 'develop'\nanna@fp:~/gitflow/anna (develop) $ git merge --squash feature/readme\nUpdating a1acfb5..ad0d531\nFast-forward\nSquash commit -- not updating HEAD\n README.md | 6 ++++++\n 1 file changed, 6 insertions(+)\nanna@fp:~/gitflow/anna (develop) $ git status\nOn branch develop\nYour branch is up to date with 'origin/develop'.\n\nChanges to be committed:\n  (use \"git restore --staged <file>...\" to unstage)\n    modified:   README.md\n\nanna@fp:~/gitflow/anna (develop) $ git diff --staged\ndiff --git a/README.md b/README.md\nindex 05c1f5b..9e7f142 100644\n--- a/README.md\n+++ b/README.md\n@@ -1 +1,7 @@\n # Estrat\u00e8gies de ramificaci\u00f3\n+Les estrat\u00e8gies de ramificaci\u00f3 proporcionen un\n+marc de treball organitzat que facilita la col\u00b7laboraci\u00f3\n+entre diferents desenvolupadors en un mateix projecte\n+\n+La caracter\u00edstica principal \u00e9s la utilitzaci\u00f3\n+de branques amb un \u00fanic prop\u00f2sit.\nanna@fp:~/gitflow/anna (develop) $ git commit -m \"Merge branch 'feature/readme'\"\n[develop 069239c] Merge branch 'feature/readme'\n 1 file changed, 6 insertions(+)\nanna@fp:~/gitflow/anna (develop) $ git lga\n* 069239c - (0 seconds ago) Merge branch 'feature/readme' - Anna (HEAD -> develop)\n| * ad0d531 - (0 seconds ago) README.md: Branques prop\u00f2sit \u00fanic - Anna (origin/feature/readme, feature/readme)\n| * 651842a - (0 seconds ago) README.md: Descripci\u00f3 - Anna\n|/  \n| * 3e60c32 - (0 seconds ago) Autors: Mar - Mar (origin/feature/author)\n| * 32a7bd7 - (0 seconds ago) Autors: Pau - Mar\n| * cebc3c1 - (0 seconds ago) Autors: Anna - Mar\n| * 0677978 - (0 seconds ago) README.md: Secci\u00f3 d'autors - Mar\n|/  \n| * db2c8a8 - (0 seconds ago) LICENSE: Enlla\u00e7 a la llic\u00e8ncia - Pau (origin/feature/license)\n| * d20ffa3 - (0 seconds ago) LICENSE: Afegida llic\u00e8ncia - Pau\n|/  \n* a1acfb5 - (0 seconds ago) Commit inicial - Joan Puigcerver (origin/main, origin/develop, origin/HEAD, main)\n
    5. Publicar els canvis de la branca develop al repositori remot.

      anna@fp:~/gitflow/anna (develop) $ git push\nTo ~/gitflow/remot\n   a1acfb5..069239c  develop -> develop\nanna@fp:~/gitflow/anna (develop) $ git lga\n* 069239c - (0 seconds ago) Merge branch 'feature/readme' - Anna (HEAD -> develop, origin/develop)\n| * ad0d531 - (0 seconds ago) README.md: Branques prop\u00f2sit \u00fanic - Anna (origin/feature/readme, feature/readme)\n| * 651842a - (0 seconds ago) README.md: Descripci\u00f3 - Anna\n|/  \n| * 3e60c32 - (0 seconds ago) Autors: Mar - Mar (origin/feature/author)\n| * 32a7bd7 - (0 seconds ago) Autors: Pau - Mar\n| * cebc3c1 - (0 seconds ago) Autors: Anna - Mar\n| * 0677978 - (0 seconds ago) README.md: Secci\u00f3 d'autors - Mar\n|/  \n| * db2c8a8 - (0 seconds ago) LICENSE: Enlla\u00e7 a la llic\u00e8ncia - Pau (origin/feature/license)\n| * d20ffa3 - (0 seconds ago) LICENSE: Afegida llic\u00e8ncia - Pau\n|/  \n* a1acfb5 - (0 seconds ago) Commit inicial - Joan Puigcerver (origin/main, origin/HEAD, main)\n
    6. Eliminar la branca feature/readme del repositori local i del remot.

      anna@fp:~/gitflow/anna (develop) $ git branch -D feature/readme\nDeleted branch feature/readme (was ad0d531).\nanna@fp:~/gitflow/anna (develop) $ git push origin --delete feature/readme\nTo ~/gitflow/remot\n - [deleted]         feature/readme\nanna@fp:~/gitflow/anna (develop) $ git lga\n* 069239c - (0 seconds ago) Merge branch 'feature/readme' - Anna (HEAD -> develop, origin/develop)\n| * 3e60c32 - (0 seconds ago) Autors: Mar - Mar (origin/feature/author)\n| * 32a7bd7 - (0 seconds ago) Autors: Pau - Mar\n| * cebc3c1 - (0 seconds ago) Autors: Anna - Mar\n| * 0677978 - (0 seconds ago) README.md: Secci\u00f3 d'autors - Mar\n|/  \n| * db2c8a8 - (0 seconds ago) LICENSE: Enlla\u00e7 a la llic\u00e8ncia - Pau (origin/feature/license)\n| * d20ffa3 - (0 seconds ago) LICENSE: Afegida llic\u00e8ncia - Pau\n|/  \n* a1acfb5 - (0 seconds ago) Commit inicial - Joan Puigcerver (origin/main, origin/HEAD, main)\n

    En aquest punt, la funcionalitat desenvolupada per Anna ha sigut integrada a la branca de desenvolupament develop i pot continuar treballant en altres funcionalitats.

    "},{"location":"apunts/051_exemple_ramificacio/#integracio-de-featurelicense","title":"Integraci\u00f3 de feature/license","text":"

    Pau ja ha acabat la seua funcionalitat feature/license i vol integrar-la a la branca develop.

    Els passos que ha de seguir s\u00f3n:

    1. Sincronitzar l'estat del repositori local amb el remot amb git fetch.

      pau@fp:~/gitflow $ cd ~/gitflow/pau\npau@fp:~/gitflow/pau (feature/license) $ git fetch\nFrom ~/gitflow/remot\n   a1acfb5..069239c  develop        -> origin/develop\n * [new branch]      feature/author -> origin/feature/author\npau@fp:~/gitflow/pau (feature/license) $ git lga\n* db2c8a8 - (0 seconds ago) LICENSE: Enlla\u00e7 a la llic\u00e8ncia - Pau (HEAD -> feature/license, origin/feature/license)\n* d20ffa3 - (0 seconds ago) LICENSE: Afegida llic\u00e8ncia - Pau\n| * 069239c - (0 seconds ago) Merge branch 'feature/readme' - Anna (origin/develop)\n|/  \n| * 3e60c32 - (0 seconds ago) Autors: Mar - Mar (origin/feature/author)\n| * 32a7bd7 - (0 seconds ago) Autors: Pau - Mar\n| * cebc3c1 - (0 seconds ago) Autors: Anna - Mar\n| * 0677978 - (0 seconds ago) README.md: Secci\u00f3 d'autors - Mar\n|/  \n* a1acfb5 - (0 seconds ago) Commit inicial - Joan Puigcerver (origin/main, origin/HEAD, main, develop)\n
    2. Actualitzar la branca develop amb els canvis del remot.

      pau@fp:~/gitflow/pau (feature/license) $ git checkout develop\nYour branch is behind 'origin/develop' by 1 commit, and can be fast-forwarded.\n  (use \"git pull\" to update your local branch)\nSwitched to branch 'develop'\npau@fp:~/gitflow/pau (develop) $ git pull --ff-only\nUpdating a1acfb5..069239c\nFast-forward\n README.md | 6 ++++++\n 1 file changed, 6 insertions(+)\npau@fp:~/gitflow/pau (develop) $ git lga\n* 069239c - (0 seconds ago) Merge branch 'feature/readme' - Anna (HEAD -> develop, origin/develop)\n| * db2c8a8 - (0 seconds ago) LICENSE: Enlla\u00e7 a la llic\u00e8ncia - Pau (origin/feature/license, feature/license)\n| * d20ffa3 - (0 seconds ago) LICENSE: Afegida llic\u00e8ncia - Pau\n|/  \n| * 3e60c32 - (0 seconds ago) Autors: Mar - Mar (origin/feature/author)\n| * 32a7bd7 - (0 seconds ago) Autors: Pau - Mar\n| * cebc3c1 - (0 seconds ago) Autors: Anna - Mar\n| * 0677978 - (0 seconds ago) README.md: Secci\u00f3 d'autors - Mar\n|/  \n* a1acfb5 - (0 seconds ago) Commit inicial - Joan Puigcerver (origin/main, origin/HEAD, main)\n
    3. Actualitzar la branca feature/license amb els canvis develop.

      pau@fp:~/gitflow/pau (develop) $ git checkout feature/license\nYour branch is up to date with 'origin/feature/license'.\nSwitched to branch 'feature/license'\npau@fp:~/gitflow/pau (feature/license) $ git merge --no-ff --no-edit develop # (1)!\nMerge made by the 'ort' strategy.\n README.md | 6 ++++++\n 1 file changed, 6 insertions(+)\npau@fp:~/gitflow/pau (feature/license) $ git lga\n*   cd0d7ee - (0 seconds ago) Merge branch 'develop' into feature/license - Pau (HEAD -> feature/license)\n|\\  \n| * 069239c - (0 seconds ago) Merge branch 'feature/readme' - Anna (origin/develop, develop)\n* | db2c8a8 - (0 seconds ago) LICENSE: Enlla\u00e7 a la llic\u00e8ncia - Pau (origin/feature/license)\n* | d20ffa3 - (0 seconds ago) LICENSE: Afegida llic\u00e8ncia - Pau\n|/  \n| * 3e60c32 - (0 seconds ago) Autors: Mar - Mar (origin/feature/author)\n| * 32a7bd7 - (0 seconds ago) Autors: Pau - Mar\n| * cebc3c1 - (0 seconds ago) Autors: Anna - Mar\n| * 0677978 - (0 seconds ago) README.md: Secci\u00f3 d'autors - Mar\n|/  \n* a1acfb5 - (0 seconds ago) Commit inicial - Joan Puigcerver (origin/main, origin/HEAD, main)\n
      1. L'opci\u00f3 --no-edit evita obrir l'editor de text i deixa el missatge de commit per defecte.
    4. Fusionar la branca feature/license amb develop.

      pau@fp:~/gitflow/pau (feature/license) $ git checkout develop\nYour branch is up to date with 'origin/develop'.\nSwitched to branch 'develop'\npau@fp:~/gitflow/pau (develop) $ git merge --squash feature/license\nUpdating 069239c..cd0d7ee\nFast-forward\nSquash commit -- not updating HEAD\n LICENSE | 5 +++++\n 1 file changed, 5 insertions(+)\n create mode 100644 LICENSE\npau@fp:~/gitflow/pau (develop) $ git status\nOn branch develop\nYour branch is up to date with 'origin/develop'.\n\nChanges to be committed:\n  (use \"git restore --staged <file>...\" to unstage)\n    new file:   LICENSE\n\npau@fp:~/gitflow/pau (develop) $ git diff --staged\ndiff --git a/LICENSE b/LICENSE\nnew file mode 100644\nindex 0000000..809d714\n--- /dev/null\n+++ b/LICENSE\n@@ -0,0 +1,5 @@\n+\n+## Llic\u00e8ncia\n+CC BY-NC-SA 4.0 DEED - Reconeixement-NoComercial-CompartirIgual 4.0 Internacional\n+\n+M\u00e9s informaci\u00f3: https://creativecommons.org/licenses/by-nc-sa/4.0/deed.ca\npau@fp:~/gitflow/pau (develop) $ git commit -m \"Merge branch 'feature/license'\"\n[develop 9ee1217] Merge branch 'feature/license'\n 1 file changed, 5 insertions(+)\n create mode 100644 LICENSE\npau@fp:~/gitflow/pau (develop) $ git lga\n* 9ee1217 - (0 seconds ago) Merge branch 'feature/license' - Pau (HEAD -> develop)\n| *   cd0d7ee - (0 seconds ago) Merge branch 'develop' into feature/license - Pau (feature/license)\n| |\\  \n| |/  \n|/|   \n* | 069239c - (0 seconds ago) Merge branch 'feature/readme' - Anna (origin/develop)\n| * db2c8a8 - (0 seconds ago) LICENSE: Enlla\u00e7 a la llic\u00e8ncia - Pau (origin/feature/license)\n| * d20ffa3 - (0 seconds ago) LICENSE: Afegida llic\u00e8ncia - Pau\n|/  \n| * 3e60c32 - (0 seconds ago) Autors: Mar - Mar (origin/feature/author)\n| * 32a7bd7 - (0 seconds ago) Autors: Pau - Mar\n| * cebc3c1 - (0 seconds ago) Autors: Anna - Mar\n| * 0677978 - (0 seconds ago) README.md: Secci\u00f3 d'autors - Mar\n|/  \n* a1acfb5 - (0 seconds ago) Commit inicial - Joan Puigcerver (origin/main, origin/HEAD, main)\n
    5. Publicar els canvis de la branca develop al repositori remot.

      pau@fp:~/gitflow/pau (develop) $ git push\nTo ~/gitflow/remot\n   069239c..9ee1217  develop -> develop\npau@fp:~/gitflow/pau (develop) $ git lga\n* 9ee1217 - (0 seconds ago) Merge branch 'feature/license' - Pau (HEAD -> develop, origin/develop)\n| *   cd0d7ee - (0 seconds ago) Merge branch 'develop' into feature/license - Pau (feature/license)\n| |\\  \n| |/  \n|/|   \n* | 069239c - (0 seconds ago) Merge branch 'feature/readme' - Anna\n| * db2c8a8 - (0 seconds ago) LICENSE: Enlla\u00e7 a la llic\u00e8ncia - Pau (origin/feature/license)\n| * d20ffa3 - (0 seconds ago) LICENSE: Afegida llic\u00e8ncia - Pau\n|/  \n| * 3e60c32 - (0 seconds ago) Autors: Mar - Mar (origin/feature/author)\n| * 32a7bd7 - (0 seconds ago) Autors: Pau - Mar\n| * cebc3c1 - (0 seconds ago) Autors: Anna - Mar\n| * 0677978 - (0 seconds ago) README.md: Secci\u00f3 d'autors - Mar\n|/  \n* a1acfb5 - (0 seconds ago) Commit inicial - Joan Puigcerver (origin/main, origin/HEAD, main)\n
    6. Eliminar la branca feature/license del repositori local i del remot.

      pau@fp:~/gitflow/pau (develop) $ git branch -D feature/license\nDeleted branch feature/license (was cd0d7ee).\npau@fp:~/gitflow/pau (develop) $ git push origin --delete feature/license\nTo ~/gitflow/remot\n - [deleted]         feature/license\npau@fp:~/gitflow/pau (develop) $ git lga\n* 9ee1217 - (0 seconds ago) Merge branch 'feature/license' - Pau (HEAD -> develop, origin/develop)\n* 069239c - (0 seconds ago) Merge branch 'feature/readme' - Anna\n| * 3e60c32 - (0 seconds ago) Autors: Mar - Mar (origin/feature/author)\n| * 32a7bd7 - (0 seconds ago) Autors: Pau - Mar\n| * cebc3c1 - (0 seconds ago) Autors: Anna - Mar\n| * 0677978 - (0 seconds ago) README.md: Secci\u00f3 d'autors - Mar\n|/  \n* a1acfb5 - (0 seconds ago) Commit inicial - Joan Puigcerver (origin/main, origin/HEAD, main)\n
    "},{"location":"apunts/051_exemple_ramificacio/#integracio-de-featureauthor","title":"Integraci\u00f3 de feature/author","text":"

    Mar ja ha acabat la seua funcionalitat feature/author i vol integrar-la a la branca develop.

    Els passos que ha de seguir s\u00f3n:

    1. Sincronitzar l'estat del repositori local amb el remot amb git fetch.

      mar@fp:~/gitflow $ cd ~/gitflow/mar\nmar@fp:~/gitflow/mar (feature/author) $ git fetch\nFrom ~/gitflow/remot\n   a1acfb5..9ee1217  develop    -> origin/develop\nmar@fp:~/gitflow/mar (feature/author) $ git lga\n* 3e60c32 - (0 seconds ago) Autors: Mar - Mar (HEAD -> feature/author, origin/feature/author)\n* 32a7bd7 - (0 seconds ago) Autors: Pau - Mar\n* cebc3c1 - (0 seconds ago) Autors: Anna - Mar\n* 0677978 - (0 seconds ago) README.md: Secci\u00f3 d'autors - Mar\n| * 9ee1217 - (0 seconds ago) Merge branch 'feature/license' - Pau (origin/develop)\n| * 069239c - (0 seconds ago) Merge branch 'feature/readme' - Anna\n|/  \n* a1acfb5 - (0 seconds ago) Commit inicial - Joan Puigcerver (origin/main, origin/HEAD, main, develop)\n
    2. Actualitzar la branca develop amb els canvis del remot.

      mar@fp:~/gitflow/mar (feature/author) $ git checkout develop\nYour branch is behind 'origin/develop' by 2 commits, and can be fast-forwarded.\n  (use \"git pull\" to update your local branch)\nSwitched to branch 'develop'\nmar@fp:~/gitflow/mar (develop) $ git pull --ff-only\nUpdating a1acfb5..9ee1217\nFast-forward\n LICENSE   | 5 +++++\n README.md | 6 ++++++\n 2 files changed, 11 insertions(+)\n create mode 100644 LICENSE\nmar@fp:~/gitflow/mar (develop) $ git lga\n* 9ee1217 - (0 seconds ago) Merge branch 'feature/license' - Pau (HEAD -> develop, origin/develop)\n* 069239c - (0 seconds ago) Merge branch 'feature/readme' - Anna\n| * 3e60c32 - (0 seconds ago) Autors: Mar - Mar (origin/feature/author, feature/author)\n| * 32a7bd7 - (0 seconds ago) Autors: Pau - Mar\n| * cebc3c1 - (0 seconds ago) Autors: Anna - Mar\n| * 0677978 - (0 seconds ago) README.md: Secci\u00f3 d'autors - Mar\n|/  \n* a1acfb5 - (0 seconds ago) Commit inicial - Joan Puigcerver (origin/main, origin/HEAD, main)\n
    3. Actualitzar la branca feature/author amb els canvis develop.

      Info

      En aquest cas, han sorgit conflictes que hem hagut de solucionar manualment.

      mar@fp:~/gitflow/mar (develop) $ git checkout feature/author\nYour branch is up to date with 'origin/feature/author'.\nSwitched to branch 'feature/author'\nmar@fp:~/gitflow/mar (feature/author) $ git merge --no-ff --no-edit develop # (1)!\nAuto-merging README.md\nCONFLICT (content): Merge conflict in README.md\nAutomatic merge failed; fix conflicts and then commit the result.\nmar@fp:~/gitflow/mar (feature/author) $ vim README.md # (2)!\nmar@fp:~/gitflow/mar (feature/author) $ git add README.md\nmar@fp:~/gitflow/mar (feature/author) $ git commit --no-edit # (1)!\n[feature/author 170a575] Merge branch 'develop' into feature/author\nmar@fp:~/gitflow/mar (feature/author) $ git lga\n*   170a575 - (0 seconds ago) Merge branch 'develop' into feature/author - Mar (HEAD -> feature/author)\n|\\  \n| * 9ee1217 - (1 second ago) Merge branch 'feature/license' - Pau (origin/develop, develop)\n| * 069239c - (1 second ago) Merge branch 'feature/readme' - Anna\n* | 3e60c32 - (1 second ago) Autors: Mar - Mar (origin/feature/author)\n* | 32a7bd7 - (1 second ago) Autors: Pau - Mar\n* | cebc3c1 - (1 second ago) Autors: Anna - Mar\n* | 0677978 - (1 second ago) README.md: Secci\u00f3 d'autors - Mar\n|/  \n* a1acfb5 - (1 second ago) Commit inicial - Joan Puigcerver (origin/main, origin/HEAD, main)\n
      1. L'opci\u00f3 --no-edit evita obrir l'editor de text i deixa el missatge de commit per defecte.
      2. S'han esborrat les marques de conflicte manualment.
    4. Fusionar la branca feature/author amb develop.

      mar@fp:~/gitflow/mar (feature/author) $ git checkout develop\nYour branch is up to date with 'origin/develop'.\nSwitched to branch 'develop'\nmar@fp:~/gitflow/mar (develop) $ git merge --squash feature/author\nUpdating 9ee1217..170a575\nFast-forward\nSquash commit -- not updating HEAD\n README.md | 5 +++++\n 1 file changed, 5 insertions(+)\nmar@fp:~/gitflow/mar (develop) $ git status\nOn branch develop\nYour branch is up to date with 'origin/develop'.\n\nChanges to be committed:\n  (use \"git restore --staged <file>...\" to unstage)\n    modified:   README.md\n\nmar@fp:~/gitflow/mar (develop) $ git diff --staged\ndiff --git a/README.md b/README.md\nindex 9e7f142..416ca41 100644\n--- a/README.md\n+++ b/README.md\n@@ -1,4 +1,9 @@\n # Estrat\u00e8gies de ramificaci\u00f3\n+\n+## Autors\n+- Anna (anna@fpmislata.com)\n+- Pau (pau@fpmislata.com)\n+- Mar (mar@fpmislata.com)\n Les estrat\u00e8gies de ramificaci\u00f3 proporcionen un\n marc de treball organitzat que facilita la col\u00b7laboraci\u00f3\n entre diferents desenvolupadors en un mateix projecte\nmar@fp:~/gitflow/mar (develop) $ git commit -m \"Merge branch 'feature/author'\"\n[develop d528774] Merge branch 'feature/author'\n 1 file changed, 5 insertions(+)\nmar@fp:~/gitflow/mar (develop) $ git lga\n* d528774 - (0 seconds ago) Merge branch 'feature/author' - Mar (HEAD -> develop)\n| *   170a575 - (0 seconds ago) Merge branch 'develop' into feature/author - Mar (feature/author)\n| |\\  \n| |/  \n|/|   \n* | 9ee1217 - (1 second ago) Merge branch 'feature/license' - Pau (origin/develop)\n* | 069239c - (1 second ago) Merge branch 'feature/readme' - Anna\n| * 3e60c32 - (1 second ago) Autors: Mar - Mar (origin/feature/author)\n| * 32a7bd7 - (1 second ago) Autors: Pau - Mar\n| * cebc3c1 - (1 second ago) Autors: Anna - Mar\n| * 0677978 - (1 second ago) README.md: Secci\u00f3 d'autors - Mar\n|/  \n* a1acfb5 - (1 second ago) Commit inicial - Joan Puigcerver (origin/main, origin/HEAD, main)\n
    5. Publicar els canvis de la branca develop al repositori remot.

      mar@fp:~/gitflow/mar (develop) $ git push\nTo ~/gitflow/remot\n   9ee1217..d528774  develop -> develop\nmar@fp:~/gitflow/mar (develop) $ git lga\n* d528774 - (0 seconds ago) Merge branch 'feature/author' - Mar (HEAD -> develop, origin/develop)\n| *   170a575 - (0 seconds ago) Merge branch 'develop' into feature/author - Mar (feature/author)\n| |\\  \n| |/  \n|/|   \n* | 9ee1217 - (1 second ago) Merge branch 'feature/license' - Pau\n* | 069239c - (1 second ago) Merge branch 'feature/readme' - Anna\n| * 3e60c32 - (1 second ago) Autors: Mar - Mar (origin/feature/author)\n| * 32a7bd7 - (1 second ago) Autors: Pau - Mar\n| * cebc3c1 - (1 second ago) Autors: Anna - Mar\n| * 0677978 - (1 second ago) README.md: Secci\u00f3 d'autors - Mar\n|/  \n* a1acfb5 - (1 second ago) Commit inicial - Joan Puigcerver (origin/main, origin/HEAD, main)\n
    6. Eliminar la branca feature/author del repositori local i del remot.

      mar@fp:~/gitflow/mar (develop) $ git branch -D feature/author\nDeleted branch feature/author (was 170a575).\nmar@fp:~/gitflow/mar (develop) $ git push origin --delete feature/author\nTo ~/gitflow/remot\n - [deleted]         feature/author\nmar@fp:~/gitflow/mar (develop) $ git lga\n* d528774 - (0 seconds ago) Merge branch 'feature/author' - Mar (HEAD -> develop, origin/develop)\n* 9ee1217 - (1 second ago) Merge branch 'feature/license' - Pau\n* 069239c - (1 second ago) Merge branch 'feature/readme' - Anna\n* a1acfb5 - (1 second ago) Commit inicial - Joan Puigcerver (origin/main, origin/HEAD, main)\n
    "},{"location":"apunts/051_exemple_ramificacio/#branques-de-publicacio","title":"Branques de publicaci\u00f3","text":"

    Les branques de publicaci\u00f3 s\u00f3n branques temporals que s'utilitzen per a preparar la publicaci\u00f3 d'una versi\u00f3.

    Normalment, el prefix de les branques de publicaci\u00f3 \u00e9s release/.

    Aquestes branques es creen a partir de la branca de desenvolupament develop i s'utilitzen per a realitzar tasques com:

    Una vegada acabades aquestes tasques, s'ha fusionar a la branca principal main i a la branca de desenvolupament develop.

    "},{"location":"apunts/051_exemple_ramificacio/#publicacio-de-la-versio-100","title":"Publicaci\u00f3 de la versi\u00f3 1.0.0","text":"

    Anna \u00e9s l'encarregada de preparar la publicaci\u00f3 de la versi\u00f3 1.0.0.

    Els passos que ha de seguir s\u00f3n:

    1. Actualitzar la branca develop amb els canvis del remot.

      anna@fp:~/gitflow/anna (develop) $ git checkout develop\nSwitched to branch 'develop'\nanna@fp:~/gitflow/anna (develop) $ git pull\nFrom /home/joapuiib/gitflow/remot\n   4e753b7..c6f2edb  develop    -> origin/develop\nUpdating 4e753b7..c6f2edb\nFast-forward\n LICENSE | 4 ++++\n 1 file changed, 4 insertions(+)\n create mode 100644 LICENSE\n
    2. Crear la branca de publicaci\u00f3 release/v1.0.0 a partir de la branca develop.

      anna@fp:~/gitflow/anna (develop) $ git checkout -b release/v1.0.0\nSwitched to a new branch 'release/v1.0.0'\n
    3. Realitzar les tasques necess\u00e0ries per a preparar la publicaci\u00f3 de la versi\u00f3 1.0.0.

      anna@fp:~/gitflow/anna (release/v1.0.0) $ echo \"1.0.0\" > VERSION\nanna@fp:~/gitflow/anna (release/v1.0.0) $ git add VERSION\nanna@fp:~/gitflow/anna (release/v1.0.0) $ git commit -m \"Versi\u00f3 1.0.0\"\n[release/v1.0.0 4b893fa] Versi\u00f3 1.0.0\n 1 file changed, 1 insertion(+)\n create mode 100644 VERSION\nanna@fp:~/gitflow/anna (release/v1.0.0) $ git lga\n* 4b893fa - (1 second ago) Versi\u00f3 1.0.0 - Anna (HEAD -> release/v1.0.0)\n* ee85113 - (6 seconds ago) Merge branch 'feature/authors' - Mar (develop, origin/develop)\n* 94d2475 - (6 seconds ago) Merge branch 'feature/license' - Pau\n* 21392d8 - (6 seconds ago) Merge branch 'feature/readme' - Anna\n* 8402918 - (6 seconds ago) 1. Primer commit - Joan Puigcerver (main, origin/main)\n
    4. Crear i publicar una etiqueta amb la versi\u00f3 1.0.0.

      anna@fp:~/gitflow/anna (release/v1.0.0) $ git tag \"v1.0.0\"\nanna@fp:~/gitflow/anna (release/v1.0.0) $ git push origin v1.0.0\nanna@fp:~/gitflow/anna (release/v1.0.0) $ git lga\n* 4b893fa - (1 second ago) Versi\u00f3 1.0.0 - Anna (HEAD -> release/v1.0.0, tag: v1.0.0)\n* ee85113 - (6 seconds ago) Merge branch 'feature/authors' - Mar (develop, origin/develop)\n* 94d2475 - (6 seconds ago) Merge branch 'feature/license' - Pau\n* 21392d8 - (6 seconds ago) Merge branch 'feature/readme' - Anna\n* 8402918 - (6 seconds ago) 1. Primer commit - Joan Puigcerver (main, origin/main)\n
    5. Integrar aquesta branca a la branca de desenvolupament develop i publicar-la.

      anna@fp:~/gitflow/anna (release/v1.0.0) $ git checkout develop\nSwitched to branch 'develop'\nanna@fp:~/gitflow/anna (develop) $ git merge --ff-only release/v1.0.0\nUpdating 8402918..4b893fa\nFast-forward\n VERSION   | 1 +\n 1 files changed, 1 insertions(+)\n create mode 100644 VERSION\nanna@fp:~/gitflow/anna (develop) $ git push\nTo /home/joapuiib/gitflow/remot\n   ee84113..4b893fa\nanna@fp:~/gitflow/anna (develop) $ git lga\n* 4b893fa - (1 second ago) Versi\u00f3 1.0.0 - Anna (HEAD -> develop, release/v1.0.0, tag: v1.0.0, origin/develop)\n* ee85113 - (6 seconds ago) Merge branch 'feature/authors' - Mar\n* 94d2475 - (6 seconds ago) Merge branch 'feature/license' - Pau\n* 21392d8 - (6 seconds ago) Merge branch 'feature/readme' - Anna\n* 8402918 - (6 seconds ago) 1. Primer commit - Joan Puigcerver (main, origin/main)\n
    6. Integrar aquesta branca a la branca principal main i publicar els canvis.

      anna@fp:~/gitflow/anna (release/v1.0.0) $ git checkout main\nSwitched to branch 'main'\nanna@fp:~/gitflow/anna (main) $ git merge --ff-only release/v1.0.0\nUpdating 8402918..4b893fa\nFast-forward\n LICENSE   | 4 ++++\n README.md | 4 ++++\n VERSION   | 1 +\n 3 files changed, 9 insertions(+)\n create mode 100644 LICENSE\n create mode 100644 VERSION\nanna@fp:~/gitflow/anna (main) $ git push\nTo /home/joapuiib/gitflow/remot\n   e68db39..0cb1dbc  main -> main\nanna@fp:~/gitflow/anna (main) $ git lga\n* 4b893fa - (1 second ago) Versi\u00f3 1.0.0 - Anna (HEAD -> main, develop, release/v1.0.0, tag: v1.0.0, origin/main, origin/develop)\n* ee85113 - (6 seconds ago) Merge branch 'feature/authors' - Mar\n* 94d2475 - (6 seconds ago) Merge branch 'feature/license' - Pau\n* 21392d8 - (6 seconds ago) Merge branch 'feature/readme' - Anna\n* 8402918 - (6 seconds ago) 1. Primer commit - Joan Puigcerver\n
    7. Eliminar la branca de publicaci\u00f3.

      anna@fp:~/gitflow/anna (main) $ git branch -d release/v1.0.0\nDeleted branch 'release/v1.0.0' (was 4b893fa)\nanna@fp:~/gitflow/anna (main) $ git lga\n* 4b893fa - (1 second ago) Versi\u00f3 1.0.0 - Anna (HEAD -> main, develop, tag: v1.0.0, origin/main, origin/develop)\n* ee85113 - (6 seconds ago) Merge branch 'feature/authors' - Mar\n* 94d2475 - (6 seconds ago) Merge branch 'feature/license' - Pau\n* 21392d8 - (6 seconds ago) Merge branch 'feature/readme' - Anna\n* 8402918 - (6 seconds ago) 1. Primer commit - Joan Puigcerver\n
    "},{"location":"apunts/051_exemple_ramificacio/#branques-de-correccio","title":"Branques de correcci\u00f3","text":""},{"location":"apunts/06_gestio_projectes/","title":"Bloc 6: Gesti\u00f3 de projectes","text":"","tags":["pull requests","github projects","actions","pages","issues"]},{"location":"apunts/06_gestio_projectes/#gestio-de-projectes","title":"Gesti\u00f3 de projectes","text":"","tags":["pull requests","github projects","actions","pages","issues"]},{"location":"apunts/07_educativa/","title":"Bloc 7: GitHub com a plataforma educativa","text":"","tags":["GitHub Classroom","organitzacions"]},{"location":"apunts/07_educativa/#gestio-de-projectes","title":"Gesti\u00f3 de projectes","text":"","tags":["GitHub Classroom","organitzacions"]},{"location":"exercicis/","title":"Exercicis","text":""},{"location":"exercicis/01_introduccio/","title":"Exercici Bloc 1: Introducci\u00f3 a Git","text":""},{"location":"exercicis/01_introduccio/#objectius","title":"Objectius","text":"

    Els objectius d'aquests exercici s\u00f3n:

    "},{"location":"exercicis/01_introduccio/#exercici","title":"Exercici","text":"

    Important

    Comprova l'estat del repositori amb git status despr\u00e9s de cada ordre per entendre els diferents estats dels fitxers.

    1. Crea un directori anomenat bloc1_exercici en la teua carpeta de treball.
    2. Inicialitza un repositori de Git en aquest directori.
    3. Crea un fitxer anomenat llibres.txt i afegeix tres llibres que t'agraden.
    4. Fes un primer commit. Tria un missatge significatiu.
    5. Afegeix un altre llibre a llibres.txt.
    6. Fes un segon commit.
    7. Crea un fitxer anomenat musica.txt i afegeix tres can\u00e7ons que t'agraden.
    8. Crea un fitxer anomenat pelicules.txt i afegeix tres pel\u00b7l\u00edcules que t'agraden.
    9. Fes un tercer commit que sols incloga el fitxer musica.txt.
    10. Crea un fitxer anomenat series.txt i afegeix tres s\u00e8ries que t'agraden.
    11. Fes un quart commit que incloga els fitxers pelicules.txt i series.txt.
    12. Modifica el fitxer llibres.txt per a eliminar un dels llibres.
    13. Fes un cinqu\u00e9 commit.
    14. Modifica el fitxer pelicules.txt per a afegir una pel\u00b7l\u00edcula.
    15. Desf\u00e9s aquest canvi.
    16. Afegeix el fitxer {data}.log amb qualsevol contingut.
      • {data} \u00e9s la data actual en format YYYYMMDD.
    17. Configura el repositori perqu\u00e8 ignore els fitxers amb extensi\u00f3 .log.
    18. Fes un commit amb aquesta configuraci\u00f3.
    19. Crea la carpeta tmp i c\u00f2pia tots els fitxers de text a aquesta carpeta.
    20. Configura el repositori perqu\u00e8 ignore la carpeta tmp.
    21. Fes un commit amb aquesta configuraci\u00f3.
    22. Comprova la hist\u00f2ria de canvis del repositori.
    "},{"location":"exercicis/01_introduccio/#bibliografia","title":"Bibliografia","text":""},{"location":"exercicis/02_branques/","title":"Exercici Bloc 2: Branques","text":""},{"location":"exercicis/02_branques/#objectius","title":"Objectius","text":"

    Els objectius d'aquests exercici s\u00f3n:

    "},{"location":"exercicis/02_branques/#exercici","title":"Exercici","text":""},{"location":"exercicis/02_branques/#inicialitzacio","title":"Inicialitzaci\u00f3","text":"

    Important

    Comprova l'estat del repositori amb git status i git lga (1) despr\u00e9s de cada ordre per entendre els diferents estats dels fitxers.

    1. Revisa Hist\u00f2ric de canvis (git log) per veure la configuraci\u00f3 de l'\u00e0lies git lga.
    1. Crea un directori anomenat bloc2_exercici en la teua carpeta de treball.
    2. Inicialitza un repositori de Git en aquest directori.
    3. Crea un fitxer anomenat llibres.txt i afegeix tres llibres que t'agraden.
    4. Fes un primer commit. Tria un missatge significatiu.
    5. Reanomena la branca principal a main.
    "},{"location":"exercicis/02_branques/#fusio-directa","title":"Fusi\u00f3 directa","text":"
    1. Crea una branca anomenada musica i situa't en aquesta branca.
    2. Crea un fitxer anomenat musica.txt i afegeix tres can\u00e7ons que t'agraden.
    3. Fes un commit en aquesta branca.
    4. Fusiona la branca musica amb la branca main.
    "},{"location":"exercicis/02_branques/#fusio-de-branques-divergents","title":"Fusi\u00f3 de branques divergents","text":"
    1. Des de la branca main, crea les branques mes-llibres i mes-musica.
    2. Des de la branca mes-llibres:
      1. Afegeix un llibre a llibres.txt.
      2. Fes un commit.
    3. Des de la branca mes-musica:

      1. Afegeix una can\u00e7\u00f3 a musica.txt.
      2. Fes un commit.
    4. Fusiona la branca mes-llibres amb la branca main.

    5. Fusiona la branca mes-musica amb la branca main.
    "},{"location":"exercicis/02_branques/#resolucio-de-conflictes-en-la-fusio","title":"Resoluci\u00f3 de conflictes en la fusi\u00f3","text":"
    1. Des de la branca main, crea les branques llibres-ciencia-ficcio i llibres-fantasia.
    2. Des de la branca llibres-ciencia-ficcio:
      1. Afegeix un llibre de ci\u00e8ncia-ficci\u00f3 a llibres.txt.
      2. Fes un commit.
    3. Des de la branca llibres-fantasia:
      1. Afegeix un llibre de fantasia a llibres.txt.
      2. Fes un commit.
    4. Fusiona la branca llibres-ciencia-ficcio amb la branca main.
    5. Fusiona la branca llibres-fantasia amb la branca main.
    "},{"location":"exercicis/02_branques/#eliminacio-duna-branca","title":"Eliminaci\u00f3 d'una branca","text":"
    1. Des de la branca main, crea una branca anomenada series.
    2. Des de la branca main, crea una branca anomenada pelicules.
    3. Des de la branca series:
      1. Afegeix una s\u00e8rie a series.txt.
      2. Fes un commit.
    4. Elimina la branca pelicules.
    5. Elimina la branca series.

    Pregunta

    Qu\u00e8 ha passat amb el commit de la branca series?

    "},{"location":"exercicis/02_branques/#canvi-de-base-duna-branca","title":"Canvi de base d'una branca","text":"
    1. Des de la branca main, crea una branca anomenada series.
    2. Des de la branca main, crea una branca anomenada pelicules.
    3. Des de la branca series:
      1. Afegeix una s\u00e8rie a series.txt.
      2. Fes un commit.
    4. Des de la branca pelicules:
      1. Afegeix una pel\u00b7l\u00edcula a pelicules.txt.
      2. Fes un commit.
    5. Fusiona la branca pelicules amb la branca main.
    6. Canvia la base de la branca series a la branca main.
    7. Fusiona la branca series amb la branca main.

    Info

    Aquest proc\u00e9s \u00e9s el que cal seguir per fusionar branques divergents d'una manera que la hist\u00f2ria siga lineal.

    "},{"location":"exercicis/02_branques/#resolucio-de-conflictes-en-el-canvi-de-base","title":"Resoluci\u00f3 de conflictes en el canvi de base","text":"
    1. Des de la branca main, crea una branca anomenada series-accio i series-drama.
    2. Des de la branca series-accio:
      1. Afegeix una s\u00e8rie d'acci\u00f3 a series.txt.
      2. Fes un commit.
    3. Des de la branca series-drama:
      1. Afegeix una s\u00e8rie de drama a series.txt.
      2. Fes un commit.
    4. Fusiona la branca series-accio amb la branca main.
    5. Canvia la base de la branca series-drama a la branca main.
    6. Fusiona la branca series-drama amb la branca main.
    "},{"location":"exercicis/03_remots/","title":"Exercici Bloc 3: Remots","text":""},{"location":"exercicis/03_remots/#objectius","title":"Objectius","text":"

    Els objectius d'aquests exercici s\u00f3n:

    "},{"location":"exercicis/03_remots/#exercici","title":"Exercici","text":""},{"location":"exercicis/03_remots/#creacio-repositori-remot","title":"Creaci\u00f3 repositori remot","text":"
    1. Crea un compte a GitHub si no en tens un.
    2. Crea un repositori remot anomenat bloc3_exercici completament buit:
      1. No afegisques cap fitxer (README.md, LICENCE, .gitignore, etc.).
    "},{"location":"exercicis/03_remots/#creacio-repositori-local","title":"Creaci\u00f3 repositori local","text":"
    1. Crea un directori anomenat bloc3_exercici en la teua carpeta de treball.
    2. Inicialitza un repositori de Git en aquest directori.
    3. Crea un fitxer anomenat llibres.txt i afegeix tres llibres que t'agraden.
    4. Fes un primer commit.
    5. Reanomena la branca principal a main.
    "},{"location":"exercicis/03_remots/#enllac-amb-repositori-remot","title":"Enlla\u00e7 amb repositori remot","text":"
    1. Configura el repositori local per afegir el repositori remot creat anteriorment com a origin.
    2. Publica la branca main al repositori remot, associant-la a la branca origin/main del repositori remot.

    Consell

    Comprova a GitHub que el repositori remot cont\u00e9 el fitxer llibres.txt.

    "},{"location":"exercicis/03_remots/#clonaclo-del-repositori-remot","title":"Clonacl\u00f3 del repositori remot","text":"
    1. Clona el repositori remot a un directori anomenat bloc3_exercici_clone en la teua carpeta de treball.
    2. Comprova que el directori bloc3_exercici_clone cont\u00e9 el fitxer llibres.txt.
    3. Configura el repositori clonat per realitzar commits amb el seg\u00fcent usuari:
      git config user.name \"Brian\"\ngit config user.email \"brian.cohen@fpmislata.com\"\n
    "},{"location":"exercicis/03_remots/#publicacio-de-canvis","title":"Publicaci\u00f3 de canvis","text":"

    Important

    A partir d'aquest punt treballarem amb els dos repositoris locals: bloc3_exercici i bloc3_exercici_clone.

    Des del repositori bloc3_exercici_clone:

    1. Afegeix la pel\u00b7l\u00edcula La vida de Brian al fitxer pelicules.txt.
    2. Realitza un commit.
    3. Publica la branca main al repositori remot.
    "},{"location":"exercicis/03_remots/#incorporacio-de-canvis-amb-fusio-directa","title":"Incorporaci\u00f3 de canvis amb fusi\u00f3 directa","text":"

    Des del repositori bloc3_exercici:

    1. Sincronitza el repositori local amb el repositori remot amb git fetch.
    2. Observa el log de canvis.
    3. Incorpora els canvis de la branca origin/main a la branca main local.
    "},{"location":"exercicis/03_remots/#incorporacio-de-canvis-amb-fusio-de-branques-divergents","title":"Incorporaci\u00f3 de canvis amb fusi\u00f3 de branques divergents","text":"

    Des del repositori bloc3_exercici:

    1. Afegeix una pel\u00b7l\u00edcula a pelicules.txt.
    2. Realitza un commit.
    3. Publica la branca main al repositori remot.

    Des del repositori bloc3_exercici_clone:

    1. Afegeix la pel\u00b7l\u00edcula Monty Python and the Holy Grail al fitxer pelicules.txt.
    2. Realitza un commit.
    3. Tracta de publicar la branca main al repositori remot.

      Question

      Per qu\u00e8 no pots publicar la branca main al repositori remot?

    4. Incorpora els canvis de la branca origin/main a la branca main local.

    5. Resol els conflictes que puguen apar\u00e9ixer.
    6. Publica la branca main al repositori remot.
    "},{"location":"exercicis/03_remots/#incorporacio-de-canvis-amb-canvi-de-base","title":"Incorporaci\u00f3 de canvis amb canvi de base","text":"

    Des del repositori bloc3_exercici:

    1. Incorpora els canvis de la branca origin/main a la branca main local.
    2. Afegeix una altra pel\u00b7l\u00edcula a pelicules.txt.
    3. Realitza un commit.
    4. Publica la branca main al repositori remot.

    Des del repositori bloc3_exercici_clone:

    1. Sinconitza el repositori local amb el repositori remot (git fetch).
    2. Afegeix la pel\u00b7l\u00edcula El sentido de la vida al fitxer pelicules.txt.
    3. Realitza un commit.
    4. Incorpora els canvis de la branca origin/main a la branca main local amb un canvi de base.
    5. Resol els conflictes que puguen apar\u00e9ixer.
    6. Publica la branca main al repositori remot.
    "},{"location":"exercicis/03_remots/#branques-i-remots","title":"Branques i remots","text":"

    Des del repositori bloc3_exercici:

    1. Incorpora els canvis de la branca origin/main a la branca main local.
    2. Crea una branca anomenada musica.
    3. Afegeix una can\u00e7\u00f3 a musica.txt.
    4. Realitza un commit.
    5. Publica la branca musica al repositori remot.
    6. Comprova que la branca musica est\u00e0 publicada al repositori remot.
    7. Elimina la branca local musica.
    8. Elimina la branca remota musica.
    "},{"location":"exercicis/05_estrategies/","title":"Exercici Bloc 5: Estrat\u00e8gies de ramificaci\u00f3","text":""},{"location":"exercicis/05_estrategies/#objectius","title":"Objectius","text":"

    Els objectius d'aquests exercici s\u00f3n:

    "},{"location":"exercicis/05_estrategies/#exercici","title":"Exercici","text":""},{"location":"exercicis/05_estrategies/#tasca","title":"Tasca","text":""},{"location":"exercicis/05_estrategies/#integracio-amb-merge-no-ff","title":"Integraci\u00f3 amb merge --no-ff","text":""},{"location":"exercicis/05_estrategies/#integracio-amb-rebase","title":"Integraci\u00f3 amb rebase","text":""},{"location":"exercicis/05_estrategies/#integracio-amb-rebase-merge-no-ff","title":"Integraci\u00f3 amb rebase + merge --no-ff","text":""},{"location":"exercicis/05_estrategies/#integracio-amb-merge-squash","title":"Integraci\u00f3 amb merge --squash","text":""},{"location":"videos/","title":"V\u00eddeos i transpar\u00e8ncies","text":""},{"location":"videos/01_introduccio_slides/","title":"Bloc 1: Introducci\u00f3 a Git","text":""},{"location":"videos/01_introduccio_slides/#introduccio-a-git","title":"Introducci\u00f3 a Git","text":""},{"location":"videos/01_introduccio_slides/#introduccio-a-git-i-la-seua-aplicacio-a-laula","title":"Introducci\u00f3 a Git i la seua aplicaci\u00f3 a l\u2019aula","text":""},{"location":"videos/01_introduccio_slides/#que-es-git","title":"Qu\u00e8 \u00e9s Git?","text":"

    Sistema de control de versions lliure i distribu\u00eft.

    https://git-scm.com/

    "},{"location":"videos/01_introduccio_slides/#git-vs-github","title":"Git vs GitHub","text":"

    Git \u00e9s el sistema de control de versions.

    GitHub o GitLab s\u00f3n un servei d'allotjament de repositoris de Git.

    https://github.com https://gitlab.com"},{"location":"videos/01_introduccio_slides/#estructura-dun-repositori","title":"Estructura d'un repositori","text":""},{"location":"videos/01_introduccio_slides/#inicialitzar-un-repositori","title":"Inicialitzar un repositori","text":"
    mkdir git_introduccio\ncd git_introduccio\ngit init\n
    "},{"location":"videos/01_introduccio_slides/#area-de-preparacio","title":"\u00c0rea de preparaci\u00f3","text":"
    git add <files>\n
    "},{"location":"videos/01_introduccio_slides/#confirmar-canvis","title":"Confirmar canvis","text":"
    git commit [-m <message>]\n
    "},{"location":"videos/01_introduccio_slides/#mostrar-commit","title":"Mostrar commit","text":"
    git show [ref]\n
    "},{"location":"videos/01_introduccio_slides/#diferencies","title":"Difer\u00e8ncies","text":"
    git diff [--staged]\n
    "},{"location":"videos/01_introduccio_slides/#historic-de-canvis","title":"Hist\u00f2ric de canvis","text":"
    git log\n

    \u00c0lies:

    git config --global alias.lg \"log --graph --abbrev-commit --decorate --format=format:'%C(bold blue)%h%C(reset) - %C(bold green)(%ar)%C(reset) %C(white)%s%C(reset) %C(dim white)- %an%C(reset)%C(bold yellow)%d%C(reset)'\"\ngit config --global alias.lga \"lg --all\"\n

    "},{"location":"videos/01_introduccio_slides/#descartar-canvis","title":"Descartar canvis","text":"
    git restore <files>\n
    "},{"location":"videos/02_branques_slides/","title":"Bloc 2: Branques","text":""},{"location":"videos/02_branques_slides/#branques","title":"Branques","text":""},{"location":"videos/02_branques_slides/#introduccio-a-git-i-la-seua-aplicacio-a-laula","title":"Introducci\u00f3 a Git i la seua aplicaci\u00f3 a l\u2019aula","text":""},{"location":"videos/02_branques_slides/#branques_1","title":"Branques","text":""},{"location":"videos/02_branques_slides/#canviar-de-branca","title":"Canviar de branca","text":""},{"location":"videos/02_branques_slides/#nous-canvis-en-una-branca","title":"Nous canvis en una branca","text":""},{"location":"videos/02_branques_slides/#fusio-directa-de-branques","title":"Fusi\u00f3 directa de branques","text":"

    Abans

    --

    Despr\u00e9s

    "},{"location":"videos/02_branques_slides/#fusio-de-branques-divergents","title":"Fusi\u00f3 de branques divergents","text":"

    Abans

    --

    Despr\u00e9s

    "},{"location":"videos/02_branques_slides/#resolucio-de-conflictes","title":"Resoluci\u00f3 de conflictes","text":"
    <<<<<<< HEAD\nContingut de la branca actual\n=======\nContingut de la branca a fusionar\n>>>>>>> branca_a_fusionar\n
    "},{"location":"videos/02_branques_slides/#canvi-de-base","title":"Canvi de base","text":"

    Abans

    --

    Despr\u00e9s

    "},{"location":"videos/031_remots_auth_slides/","title":"Bloc 3.1: M\u00e8todes d'autenticaci\u00f3 a GitHub","text":""},{"location":"videos/031_remots_auth_slides/#metodes-dautenticacio-a-github","title":"M\u00e8todes d'autenticaci\u00f3 a GitHub","text":""},{"location":"videos/031_remots_auth_slides/#introduccio-a-git-i-la-seua-aplicacio-a-laula","title":"Introducci\u00f3 a Git i la seua aplicaci\u00f3 a l\u2019aula","text":""},{"location":"videos/031_remots_auth_slides/#repositori-remot","title":"Repositori remot","text":""},{"location":"videos/031_remots_auth_slides/#desenvolupament-distribuit","title":"Desenvolupament distribu\u00eft","text":""},{"location":"videos/031_remots_auth_slides/#metodes-dautenticacio-a-github_1","title":"M\u00e8todes d'autenticaci\u00f3 a GitHub","text":""},{"location":"videos/031_remots_auth_slides/#token-dacces-personal-pat","title":"Token d'acc\u00e9s personal (PAT)","text":"

    Generat desde Settings > Developer settings > Personal access tokens

    git config --global credential.helper store\n
    "},{"location":"videos/031_remots_auth_slides/#clau-ssh","title":"Clau SSH","text":"
    ssh-keygen -t rsa -b 4096\n
    "},{"location":"videos/032_remots_slides/","title":"Bloc 3.2: Remots","text":""},{"location":"videos/032_remots_slides/#remots","title":"Remots","text":""},{"location":"videos/032_remots_slides/#introduccio-a-git-i-la-seua-aplicacio-a-laula","title":"Introducci\u00f3 a Git i la seua aplicaci\u00f3 a l\u2019aula","text":""},{"location":"videos/032_remots_slides/#repositori-remot","title":"Repositori remot","text":""},{"location":"videos/032_remots_slides/#desenvolupament-distribuit","title":"Desenvolupament distribu\u00eft","text":""},{"location":"videos/032_remots_slides/#afegir-un-repositori-remot","title":"Afegir un repositori remot","text":"
    git remote add origin <url>\n
    "},{"location":"videos/032_remots_slides/#associacio-branques-locals-i-remotes","title":"Associaci\u00f3 branques locals i remotes","text":"
    git push [-u | --set-upstream] origin <branca>\n
    "},{"location":"videos/032_remots_slides/#clonar-un-repositori","title":"Clonar un repositori","text":"
    git clone <url> [<directori>]\n
    "},{"location":"videos/032_remots_slides/#sincronitzacio","title":"Sincronitzaci\u00f3","text":"

    git fetch\n

    "},{"location":"videos/032_remots_slides/#integracio-de-canvis","title":"Integraci\u00f3 de canvis","text":"
    git pull [--rebase]\n
    "}]} \ No newline at end of file +{"config":{"lang":["en"],"separator":"[\\s\\-]+","pipeline":["stopWordFilter"]},"docs":[{"location":"","title":"Inici","text":""},{"location":"#objectius","title":"Objectius","text":""},{"location":"#continguts","title":"Continguts","text":""},{"location":"#dirigit-a","title":"Dirigit a","text":""},{"location":"apunts/","title":"Apunts","text":""},{"location":"apunts/01_introduccio/","title":"Bloc 1: Introducci\u00f3 a Git","text":"","tags":["git add","git commit","git config","git diff","git init","git log","git status","git restore","gitconfig","gitignore"]},{"location":"apunts/01_introduccio/#que-es-git","title":"Qu\u00e8 \u00e9s Git?","text":"

    Git \u00e9s un sistema de control de versions lliure i distribu\u00eft dissenyat per gestionar xicotets i grans projectes amb rapidesa i efici\u00e8ncia. L'objectiu principal de Git \u00e9s controlar i gestionar els canvis realitzats en una enorme quantitat de fitxers d'una manera f\u00e0cil i eficient.

    Git va ser dissenyat en 2005 per Linus Torvalds, creador del kernel del sistema operatiu Linux, i des d'aleshores, s'ha convertit en una eina fonamental i imprescindible en la gesti\u00f3 de codi font en projectes col\u00b7laboratius.

    Git est\u00e0 basat en repositoris, que s'inicialitzen en un directori concret i contenen tota la informaci\u00f3 dels canvis realitzats en tot l'arbre de directoris i fitxers a partir d'aquest directori.

    Els principals objectius i caracter\u00edstiques de Git s\u00f3n:

    ","tags":["git add","git commit","git config","git diff","git init","git log","git status","git restore","gitconfig","gitignore"]},{"location":"apunts/01_introduccio/#installacio","title":"Instal\u00b7laci\u00f3","text":"

    Git est\u00e0 disponible a https://git-scm.com/ per a Windows, macOS i Linux.

    UbuntuWindows
    sudo apt update\nsudo apt install git\n

    Descarrega i executa l'instal\u00b7lador de Git des de https://git-scm.com/

    Una vegada instal\u00b7lat, pots utilitzar la consola Git Bash. \u00c9s una terminal basada l'int\u00e8rpret Bash, que et permetr\u00e0 realitzar les comandes de Git en la consola.

    Per defecte, Git utilitza l'editor ViM, un editor de text per terminal molt potent, per\u00f2 dif\u00edcil i poc intu\u00eftiu per treballar.

    Si desitgeu canviar l'editor per defecte, podeu utilitzar la seg\u00fcent comanda des de la consola:

    git config --global core.editor <editor>\n

    Editors de text

    WindowsLinuxMultiplataforma ","tags":["git add","git commit","git config","git diff","git init","git log","git status","git restore","gitconfig","gitignore"]},{"location":"apunts/01_introduccio/#per-que-la-terminal","title":"Per qu\u00e8 la terminal?","text":"

    En aquest material, utilitzarem la terminal per a interactuar amb Git, per\u00f2 aix\u00f2 no significa que siga l'\u00fanica manera de fer-ho. De fet, pr\u00e0cticament tots els entorns de desenvolupament moderns tenen integraci\u00f3 amb Git, la qual cosa permet realitzar les mateixes operacions que proporciona la terminal, per\u00f2 de manera m\u00e9s visual i intu\u00eftiva.

    No obstant aix\u00f2, \u00e9s important con\u00e9ixer com funcionen les comandes de Git en la terminal, per diferents raons:

    ","tags":["git add","git commit","git config","git diff","git init","git log","git status","git restore","gitconfig","gitignore"]},{"location":"apunts/01_introduccio/#inicialitzacio-dun-repositori-git-init","title":"Inicialitzaci\u00f3 d'un repositori (git init)","text":"

    Per a comen\u00e7ar a utilitzar Git en un projecte, primer cal inicialitzar un repositori en un directori concret.

    git init [<directory>]\n

    Aquesta comanda crea un directori ocult anomenat .git que cont\u00e9 tota la informaci\u00f3 relativa al Repositori Local.

    Documentaci\u00f3

    Documentaci\u00f3 oficial de git init: https://git-scm.com/docs/git-init

    jpuigcerver@fp:~ $ mkdir git_introduccio\njpuigcerver@fp:~ $ cd git_introduccio\njpuigcerver@fp:~/git_introduccio $ ls -a # (1)!\n.  ..\njpuigcerver@fp:~/git_introduccio $ git init\nhint: Using 'master' as the name for the initial branch. This default branch name\nhint: is subject to change. To configure the initial branch name to use in all\nhint: of your new repositoris, which will suppress this warning, call:\nhint:\nhint: git config --global init.dafaultBranch <name>\nhint:\nhint: Names commonly chosen instead of 'master' are 'main', 'trunk' and\nhint: 'development'. The just-created branch can be renamed via this command:\nhint:\nhint: git branch -m <name>\nInitialized empty Git repository in /home/jpuigcerver/git_introduccio/.git/\njpuigcerver@fp:~/git_introduccio (master) $ git branch -m main\njpuigcerver@fp:~/git_introduccio (main) $ ls -a # (2)!\n.  ..  .git/\njpuigcerver@fp:~/git_introduccio (main) $ git status\nOn branch main\n\nNo commits yet\n\nNothing to commit (create/copy files and use \"git add\" to track)\n
    1. L'opci\u00f3 -a mostra tots els fitxers, inclosos els ocults que comencen amb un punt.
    2. S'ha creat el directori ocult .git que cont\u00e9 tota la informaci\u00f3 del repositori.

    L'ordre git status ens mostra l'estat actual del nostre repositori. Podem observar que estem en la branca main i que de moment no s'ha realitzat cap canvi.

    Nota

    S'ha canviat el nom de la branca principal de master a main per a seguir les recomanacions de la comunitat de desenvolupament.

    Vegeu: Regarding Git and Branch Naming

    ","tags":["git add","git commit","git config","git diff","git init","git log","git status","git restore","gitconfig","gitignore"]},{"location":"apunts/01_introduccio/#eliminar-un-repositori","title":"Eliminar un repositori","text":"

    Per a eliminar un repositori de Git, simplement cal eliminar el directori ocult .git.

    rm -rf .git\n
    jpuigcerver@fp:~/git_introduccio (main) $ ls -a\n.  ..  .git\njpuigcerver@fp:~/git_introduccio (main) $ rm -rf .git\njpuigcerver@fp:~/git_introduccio $ git status\nfatal: not a git repository (or any of the parent directories): .git\n

    Perill

    Sigues extremadament cautel\u00f3s amb l'\u00fas de la comanda rm -rf, ja que elimina tots els fitxers, inclsos aquells protegits contra escritura.

    ","tags":["git add","git commit","git config","git diff","git init","git log","git status","git restore","gitconfig","gitignore"]},{"location":"apunts/01_introduccio/#estructura-dun-repositori-de-git","title":"Estructura d'un repositori de Git","text":"

    En aquesta introducci\u00f3, ens centrarem en com funcionen els repositoris de Git d'una manera local, on encara no haurem connectat cap repositori remot.

    Abans que res, hem de con\u00e9ixer l'estructura d'un repositori de Git.

    Figura 1: Components d'un repositori de Git.

    En la figura anterior podem observar el que es coneix com Entorn de desenvolupament o Development Enviorment. Aquesta part est\u00e0 present localment en el teu dispositiu on realitzar\u00e0s els canvis i desenvolupament del teu projecte.

    D'una altra banda, est\u00e0 el Repositori Remot, que normalment s'allotja a un servidor accessible per tots els desenvolupadors.

    Dins de l'Entorn de desenvolupament trobem els seg\u00fcents components:

    ","tags":["git add","git commit","git config","git diff","git init","git log","git status","git restore","gitconfig","gitignore"]},{"location":"apunts/01_introduccio/#flux-de-treball","title":"Flux de treball","text":"

    Quan treballes amb un projecte de Git, els canvis es realitzen sobre el Directori de treball. Aquests canvis poden ser:

    Si executem l'ordre git status, ens mostrar\u00e0 l'estat actual dels fitxers amb els tres estats anteriors de color roig.

    Aquests canvis no formen part del repositori. Abans, cal afegir-los a l'\u00c0rea de preparaci\u00f3 amb la comanda git add, que canviar\u00e0 l'estat dels fitxers Staged (mostrat en color verd amb git status).

    Per \u00faltim, tots els canvis de l'\u00c0rea de preparaci\u00f3 es poden confirmar i fer efectius en el Repositori local amb la comanda git commit.

    Figura 2: Flux de treball en un repositori de Git.

    Info

    La comanda git restore es presenta a l'apartat Descartar canvis.

    Documentaci\u00f3

    Documentaci\u00f3 oficial de:

    ","tags":["git add","git commit","git config","git diff","git init","git log","git status","git restore","gitconfig","gitignore"]},{"location":"apunts/01_introduccio/#afegir-fitxers-a-larea-de-preparacio-git-add","title":"Afegir fitxers a l'\u00c0rea de Preparaci\u00f3 (git add)","text":"

    Afegim el primer fitxer README.md al nostre repositori.

    Info

    \u00c9s recomanable crear un fitxer README.md en tots els projectes per a descriure el seu prop\u00f2sit, com s'utilitza i qualsevol altra informaci\u00f3 rellevant.

    jpuigcerver@fp:~/git_introduccio (main) $ echo \"# 01 - Introducci\u00f3 a Git\" > README.md\njpuigcerver@fp:~/git_introduccio (main) $ echo \"Estem aprenent a utilitzar Git!\" >> README.md\njpuigcerver@fp:~/git_introduccio (main) $ cat README.md\n# 01 - Introducci\u00f3 a Git\nEstem aprenent a utilitzar Git!\njpuigcerver@fp:~/git_introduccio (main) $ git status\nOn branch main\n\nNo commits yet\n\nUntracked files:\n  (use \"git add <file>...\" to include in what will be committed)\n        README.md\n\nNothing added to commit but untracked files present (use \"git add\" to track)\n

    S'ha creat el fitxer README.md i s'ha afegit el seu contingut. Aquest fitxer resideix en el Directori de treball.

    La comanda git status ens mostra que no s'est\u00e0 realitzant cap seguiment del fitxer README.md, que es troba en l'estat Untracked.

    Figura 3: Fitxer sense seguiment (untracked).

    Per afegir els canvis al nostre repositori, el seg\u00fcent pas \u00e9s afegir els canvis a l'\u00c0rea de Preparaci\u00f3 amb l'ordre git add. Aquesta comanda permet especificar quins canvis es desitja afegir.

    Info

    git add <path>\n
    jpuigcerver@FP:~/git_introduccio (main) $ git add README.md\njpuigcerver@FP:~/git_introduccio (main) $ git status\nOn branch main\n\nNo commits yet\n\nChanges to be committed:\n  (use \"git rm --cached <file>...\" to unstage)\n        new file:   README.md\n

    Vegem com el fitxer README.md ha passat a l'estat Staged i est\u00e0 preparat per a ser confirmat.

    Figura 4: Fitxer a l'\u00e0rea de preparaci\u00f3.","tags":["git add","git commit","git config","git diff","git init","git log","git status","git restore","gitconfig","gitignore"]},{"location":"apunts/01_introduccio/#confirmar-canvis-git-commit","title":"Confirmar canvis (git commit)","text":"

    Una vegada afegits tots els canvis a l'\u00c0rea de Preparaci\u00f3, ja podem confirmar-los mitjan\u00e7ant l'ordre git commit.

    git commit [-a] [-m \"<message>\"]\n

    Warning

    Si no s'especifica el missatge amb -m, s'obrir\u00e0 l'editor per defecte(1) per a introduir el missatge del commit.

    1. ViM per defecte. Pot ser configurat:
      git config --global core.editor <editor>\n
    Figura 5: Estat del repositori de Git abans de fer un `commit`.

    Aquesta ordre crea un nou commit, que \u00e9s una instant\u00e0nia de l'estat actual dels fitxers del repositori i que cont\u00e9 tota la informaci\u00f3 relativa als canvis realitzats.

    Cadascun dels commit cont\u00e9 la seg\u00fcent informaci\u00f3:

    Per tant, abans de realitzar un commit, \u00e9s necessari configurar el nom i el correu electr\u00f2nic de l'autor.

    git config --global user.name <name>\ngit config --global user.email <email>\n
    jpuigcerver@FP:~/git_introduccio (main) $ git config --global user.name \"Joan Puigcerver Ib\u00e1\u00f1ez\"\njpuigcerver@FP:~/git_introduccio (main) $ git config --global user.email \"j.puigcerveribanez@edu.gva.es\"\n

    Amb aquesta informaci\u00f3 configurada, ja podem realitzar el nostre primer commit.

    jpuigcerver@FP:~/git_introduccio (main) $ git status\nOn branch main\n\nNo commits yet\n\nChanges to be committed:\n  (use \"git rm --cached <file>...\" to unstage)\n        new file:   README.md\njpuigcerver@FP:~/git_introduccio (main) $ git commit -m \"Added README.md\"\n[main (root-commit) 8e70293] Added README.md\n 1 file changed, 2 insertions(+)\n create mode 100644 README.md\njpuigcerver@FP:~/git_introduccio (main) $ git status\nOn branch main\n\nnothing to commit, working tree clean\n

    Vegem que l'estat del nostre repositori ha canviat i ja no hi ha canvis pendents de confirmar. A m\u00e9s, s'ha creat el primer commit amb el missatge Added README.md i identificador 8e70293.

    Figura 6: Estat del repositori de Git despr\u00e9s de fer un `commit`.

    Podem consultar la informaci\u00f3 del nou commit amb l'ordre git show.

    jpuigcerver@FP:~/git_introduccio (main) $ git show 8e70293\ncommit 8e702933d5dbec9ee71100a1599ae4491085e1aa (HEAD -> main)\nAuthor: Joan Puigcerver Ib\u00e1\u00f1ez <j.puigcerveribanez@edu.gva.es>\nDate:   Fri Oct 13 16:06:59 2023 +0200\n\n    Added README.md\n\ndiff --git a/README.md b/README.md\nnew file mode 100644\nindex 0000000..6d747b3\n--- /dev/null\n+++ b/README.md\n@@ -0,0 +1,2 @@\n+# 01 - Introducci\u00f3 a Git\n+Estem aprenent a utilitzar Git!\n
    ","tags":["git add","git commit","git config","git diff","git init","git log","git status","git restore","gitconfig","gitignore"]},{"location":"apunts/01_introduccio/#diferencies-entre-versions-git-diff","title":"Difer\u00e8ncies entre versions (git diff)","text":"

    Una ferramenta molt \u00fatil de Git \u00e9s git diff, que permet comparar les difer\u00e8ncies entre els canvis realitzats en el Directori de treball o l'\u00c0rea de Preparaci\u00f3 respecte del Repositori local.

    La sintaxi amb les opcions b\u00e0siques es:

    git diff [--staged] [<path>]\n

    Documentaci\u00f3

    Documentaci\u00f3 oficial de git diff: https://git-scm.com/docs/git-diff

    Figura 7: Resum de `git diff`.

    Difer\u00e8ncies entre el Directori de treball i el Repositori local

    Observem les difer\u00e8ncies entre el fitxer README.md del Directori de treball i el Repositori local.

    jpuigcerver@FP:~/git_introduccio (main) $ echo \"Aquesta \u00e9s una l\u00ednia nova\" >> README.md\njpuigcerver@FP:~/git_introduccio (main) $ git status\nOn branch main\n\nChanges not staged for commit:\n  (use \"git add <file>...\" to update what will be committed)\n  (use \"git restore <file>...\" to discard changes in working directory)\n        modified:   README.md\n\nno changes added to commit (use \"git add\" and/or \"git commit -a\")\njpuigcerver@FP:~/git_introduccio (main) $ git diff\ndiff --git a/README.md b/README.md\nindex 6d747b3..f3b3b3e 100644\n--- a/README.md\n+++ b/README.md\n@@ -1,2 +1,3 @@\n # 01 - Introducci\u00f3 a Git\n Estem aprenent a utilitzar Git!\n+Aquesta \u00e9s una l\u00ednia nova\n

    Difer\u00e8ncies entre l'\u00c0rea de Preparaci\u00f3 i el Repositori local

    Observem les difer\u00e8ncies entre el fitxer README.md de l'\u00c0rea de Preparaci\u00f3 i el Repositori local.

    jpuigcerver@FP:~/git_introduccio (main) $ git add README.md\njpuigcerver@FP:~/git_introduccio (main) $ git status\nOn branch main\n\nChanges to be committed:\n  (use \"git restore --staged <file>...\" to unstage)\n        modified:   README.md\n\njpuigcerver@FP:~/git_introduccio (main) $ git diff --staged\ndiff --git a/README.md b/README.md\nindex 6d747b3..f3b3b3e 100644\n--- a/README.md\n+++ b/README.md\n@@ -1,2 +1,3 @@\n # 01 - Introducci\u00f3 a Git\n Estem aprenent a utilitzar Git!\n+Aquesta \u00e9s una l\u00ednia nova\n

    Interpretaci\u00f3 de git diff

    El format de les l\u00ednies de git diff \u00e9s el seg\u00fcent:

    Despr\u00e9s, es mostren les l\u00ednies modificades:

    En l'exemple anterior, s'ha afegit la l\u00ednia Aquesta \u00e9s una l\u00ednia nova al fitxer README.md.

    ","tags":["git add","git commit","git config","git diff","git init","git log","git status","git restore","gitconfig","gitignore"]},{"location":"apunts/01_introduccio/#descartar-canvis-git-restore","title":"Descartar canvis (git restore)","text":"

    Una altra ferramenta \u00fatil de Git \u00e9s git restore, que permet descartar els canvis realitzats en els fitxers del Directori de treball o l'\u00c0rea de Preparaci\u00f3.

    La sintaxi amb les opcions b\u00e0siques \u00e9s:

    git restore [--staged] <path>\n

    Podeu consultar la Figura 2 per a veure un resum del comportament de git restore.

    Documentaci\u00f3

    Documentaci\u00f3 oficial de git restore: https://git-scm.com/docs/git-restore

    Perill

    La comanda git restore descarta els canvis realitzats en els fitxers sense possibilitat de recuperar-los.

    Descartar canvis en l'\u00c0rea de Preparaci\u00f3

    Continuant amb l'exemple anterior, descartem els canvis realitzats en el fitxer README.md de l'\u00c0rea de Preparaci\u00f3.

    jpuigcerver@FP:~/git_introduccio (main) $ git status\nOn branch main\n\nChanges to be committed:\n  (use \"git restore --staged <file>...\" to unstage)\n        modified:   README.md\n\njpuigcerver@FP:~/git_introduccio (main) $ git diff --staged\ndiff --git a/README.md b/README.md\nindex 6d747b3..f3b3b3e 100644\n--- a/README.md\n+++ b/README.md\n@@ -1,2 +1,3 @@\n # 01 - Introducci\u00f3 a Git\n Estem aprenent a utilitzar Git!\n+Aquesta \u00e9s una l\u00ednia nova\njpuigcerver@FP:~/git_introduccio (main) $ git restore --staged README.md\njpuigcerver@FP:~/git_introduccio (main) $ git status\nOn branch main\n\nChanges not staged for commit:\n  (use \"git add <file>...\" to update what will be committed)\n  (use \"git restore <file>...\" to discard changes in working directory)\n        modified:   README.md\n

    Descartar canvis en el Directori de treball

    Descartem els canvis realitzats en el fitxer README.md del Directori de treball.

    Danger

    Aquesta comanda descartar\u00e0 els canvis realitzats en el fitxer README.md sense possibilitat de recuperar-los.

    jpuigcerver@FP:~/git_introduccio (main) $ git status\nOn branch main\n\nChanges not staged for commit:\n  (use \"git add <file>...\" to update what will be committed)\n  (use \"git restore <file>...\" to discard changes in working directory)\n        modified:   README.md\n\nno changes added to commit (use \"git add\" and/or \"git commit -a\")\njpuigcerver@FP:~/git_introduccio (main) $ git diff\ndiff --git a/README.md b/README.md\nindex 6d747b3..f3b3b3e 100644\n--- a/README.md\n+++ b/README.md\n@@ -1,2 +1,3 @@\n # 01 - Introducci\u00f3 a Git\n Estem aprenent a utilitzar Git!\n+Aquesta \u00e9s una l\u00ednia nova\njpuigcerver@FP:~/git_introduccio (main) $ git restore README.md\njpuigcerver@FP:~/git_introduccio (main) $ git status\nOn branch main\n\nnothing to commit, working tree clean\n
    ","tags":["git add","git commit","git config","git diff","git init","git log","git status","git restore","gitconfig","gitignore"]},{"location":"apunts/01_introduccio/#historic-de-canvis-git-log","title":"Hist\u00f2ric de canvis (git log)","text":"

    Git registra tots els canvis confirmats (commit) en el Repositori local. L'hist\u00f2ric de canvis es pot consultar amb l'ordre git log.

    git log [options]\n

    Documentaci\u00f3

    Consulta totes les opcions a la documentaci\u00f3 oficial de git log: https://git-scm.com/docs/git-log

    Hist\u00f2ric de canvis

    Modifiquem novament el fitxer README.md i realitzem un nou commit.

    jpuigcerver@FP:~/git_introduccio (main) $ echo \"Aquesta \u00e9s una altra l\u00ednia\" >> README.md\njpuigcerver@FP:~/git_introduccio (main) $ git commit -a -m \"Added another line to README.md\"# (1)!\n[main c9fc6c8] Added another line to README.md\n 1 file changed, 1 insertions(+)\n
    1. Amb -a afegim tots els canvis realitzats al fitxer README.md a l'\u00c0rea de Preparaci\u00f3 sense necessitat de git add.

    Consultem l'hist\u00f2ric de canvis amb git log.

    jpuigcerver@FP:~/git_introduccio (main) $ git log\ncommit c9fc6c856c2d52744b85a6f8d92feac496e60bd6 (HEAD -> main)\nAuthor: Joan Puigcerver <j.puigcerveribanez@edu.gva.es>\nDate:   Mon Oct 16 11:43:20 2023 +0200\n\n    Added another line to README.md\n\ncommit 8e702933d5dbec9ee71100a1599ae4491085e1aa\nAuthor: Joan Puigcerver <j.puigcerveribanez@edu.gva.es>\nDate:   Fri Oct 13 16:06:59 2023 +0200\n\n    Added Readme.md\n

    S'observa tota la informaci\u00f3 dels commit realitzats, com l'autor, la data, el missatge i l'identificador.

    L'ordre git log admet moltes opcions per a personalitzar com es mostren els commit i la seua informaci\u00f3.

    Una possible combicaci\u00f3 d'opcions per visualitzar l'hist\u00f2ric de canvis de manera m\u00e9s compacta i intu\u00eftiva \u00e9s:

    git log --graph --abbrev-commit --decorate --format=format:'%C(bold blue)%h%C(reset) - %C(bold green)(%ar)%C(reset) %C(white)%s%C(reset) %C(dim white)- %an%C(reset)%C(bold yellow)%d%C(reset)'\n

    Hist\u00f2ric de canvis compacte

    jpuigcerver@FP:~/git_introduccio (main) $ git log --graph --abbrev-commit --decorate --format=format:'%C(bold blue)%h%C(reset) - %C(bold green)(%ar)%C(reset) %C(white)%s%C(reset) %C(dim white)- %an%C(reset)%C(bold yellow)%d%C(reset)'\n* c9fc6c8 - (2 minutes ago) Added another line to README.md - Joan Puigcerver (HEAD -> main)\n* 8e70293 - (3 days ago) Added Readme.md - Joan Puigcerver\n

    No obstant aix\u00f2, no \u00e9s pr\u00e0ctic recordar aquesta comanda. Per aix\u00f2, podem configurar un alias per a simplificar la seua crida.

    git config --global alias.lg \"log --graph --abbrev-commit --decorate --format=format:'%C(bold blue)%h%C(reset) - %C(bold green)(%ar)%C(reset) %C(white)%s%C(reset) %C(dim white)- %an%C(reset)%C(bold yellow)%d%C(reset)'\"\ngit config --global alias.lga \"lg --all\"\n

    Hist\u00f2ric de canvis compacte amb \u00e0lias

    Despr\u00e9s de configurar l'\u00e0lias git lg per a l'ordre anterior, podem cridar-lo de la seg\u00fcent manera:

    jpuigcerver@FP:~/git_introduccio (main) $ git lg\n* c9fc6c8 - (2 minutes ago) Added another line to README.md - Joan Puigcerver (HEAD -> main)\n* 8e70293 - (3 days ago) Added README.md - Joan Puigcerver\n
    ","tags":["git add","git commit","git config","git diff","git init","git log","git status","git restore","gitconfig","gitignore"]},{"location":"apunts/01_introduccio/#configuracio-git-config","title":"Configuraci\u00f3 (git config)","text":"

    Git permet configurar diferents par\u00e0metres per a personalitzar el seu comportament mitjan\u00e7ant l'ordre git config.

    git config [--global] <key> <value>\n

    Fixa't

    Fixeu-vos que ja hem utilitzat aquesta comanda per configurar els seg\u00fcents aspectes:

    ","tags":["git add","git commit","git config","git diff","git init","git log","git status","git restore","gitconfig","gitignore"]},{"location":"apunts/01_introduccio/#fitxer-de-configuracio-gitconfig","title":"Fitxer de configuraci\u00f3 (.gitconfig)","text":"

    La configuraci\u00f3 --global s'emmagatzema en el fitxer .gitconfig, situat del directori de l'usuari.

    LinuxWindows
    /home/<username>/.gitconfig\n
    C:\\Users\\<username>\\.gitconfig\n

    Exemple configuraci\u00f3

    [core]\n    editor = vim # Editor per defecte\n\n[init]\n    defaultBranch = main # Nom de la branca principal per defecte\n\n[user]\n    name = Joan Puigcerver Ib\u00e1\u00f1ez\n    email = j.puigcerveribanez@edu.gva.es\n\n[alias]\n    lg = log --graph --abbrev-commit --decorate --format=format:'%C(bold blue)%h%C(reset) - %C(bold green)(%ar)%C(reset) %C(white)%s%C(reset) %C(dim white)- %an%C(reset)%C(bold yellow)%d%C(reset)'\n    lga = lg --all\n
    ","tags":["git add","git commit","git config","git diff","git init","git log","git status","git restore","gitconfig","gitignore"]},{"location":"apunts/01_introduccio/#ignorar-fitxers-gitignore","title":"Ignorar fitxers (.gitignore)","text":"

    En un projecte, hi ha fitxers que no volem incloure en el repositori, com arxius temporals, binaris o fitxers de configuraci\u00f3. Git permet ignorar aquests fitxers mitjan\u00e7ant el fitxer .gitignore, que cont\u00e9 una llista de patrons de fitxers els quals Git no tindr\u00e0 en compte.

    Aquest fitxer pot estar situat en qualsevol directori del repositori i Git ignorar\u00e0 per a tots els fitxers i subdirectoris d'aquest que complisquen algun dels patrons especificats.

    Documentaci\u00f3

    Documentaci\u00f3 oficial de .gitignore: https://git-scm.com/docs/gitignore

    Llista de patrons:

    Exemple de .gitignore

    # ignore ALL .log files\n*.log\n\n# ignore ALL files in ANY directory named temp\ntemp/\n
    jpuigcerver@FP:~/git_introduccio (main) $ mkdir temp\njpuigcerver@FP:~/git_introduccio (main) $ touch temp/file.txt\njpuigcerver@FP:~/git_introduccio (main) $ git status\nOn branch main\n\nUntracked files:\n  (use \"git add <file>...\" to include in what will be committed)\n        temp/file.txt\n\nnothing added to commit but untracked files present (use \"git add\" to track)\njpuigcerver@FP:~/git_introduccio (main) $ echo \"temp/\" > .gitignore\njpuigcerver@FP:~/git_introduccio (main) $ git status # (1)!\nOn branch main\n\nUntracked files:\n  (use \"git add <file>...\" to include in what will be committed)\n        .gitignore\n\nnothing added to commit but untracked files present (use \"git add\" to track)\n
    1. El fitxer temp/file.txt no apareix en l'estat del repositori despr\u00e9s de crear el fitxer .gitignore.
    ","tags":["git add","git commit","git config","git diff","git init","git log","git status","git restore","gitconfig","gitignore"]},{"location":"apunts/01_introduccio/#recursos-addicionals","title":"Recursos addicionals","text":"","tags":["git add","git commit","git config","git diff","git init","git log","git status","git restore","gitconfig","gitignore"]},{"location":"apunts/01_introduccio/#bibliografia","title":"Bibliografia","text":"","tags":["git add","git commit","git config","git diff","git init","git log","git status","git restore","gitconfig","gitignore"]},{"location":"apunts/02_branques/","title":"Bloc 2: Branques","text":"","tags":["conflictes","fast-forward","git branch","git checkout","git merge","git rebase","git switch","HEAD"]},{"location":"apunts/02_branques/#introduccio","title":"Introducci\u00f3","text":"

    Les branques s\u00f3n una de les caracter\u00edstiques m\u00e9s importants de Git, que permet el desenvolupament col\u00b7laboratiu i en paral\u00b7lel d'un projecte.

    Moltes de les estrat\u00e8gies de Git per desenvolupar projectes es basen a realitzar els canvis en branques independents que, una vegada acabades, s'integren en la branca principal. La branca principal d'un projecte originalment s'anomenava master, per\u00f2 \u00faltimament \u00e9s preferible utilitzar el nom main per evitar la nomenclatura master/slave (amo/esclau), que t\u00e9 connotacions racistes.

    Info

    S'ha canviat el nom de la branca principal de master a main per a seguir les recomanacions de la comunitat de desenvolupament.

    Vegeu: Regarding Git and Branch Naming

    Preparaci\u00f3 repositori d'exemple

    En aquest material treballarem sobre un nou repositori local.

    Inicialitzaci\u00f3:

    git init ~/git_branques\ncd ~/git_branques\necho \"# Bloc: Branques\" > README.md\ngit add README.md\ngit commit -m \"T\u00edtol\"\n

    jpuigcerver@fp:~ $ git init ~/git_branques\nInitialized empty Git repository in /home/jpuigcerver/git_branques/.git/\njpuigcerver@fp:~ $ cd ~/git_branques\njpuigcerver@fp:~/git_branques (main) $ branch -m main # (1)!\njpuigcerver@fp:~/git_branques (main) $ echo \"# Bloc: Branques\" > README.md\njpuigcerver@fp:~/git_branques (main) $ git add README.md\njpuigcerver@fp:~/git_branques (main) $ git commit -m \"T\u00edtol\"\n[master (root-commit) 0b1b3b4] T\u00edtol\n 1 file changed, 1 insertion(+)\n create mode 100644 README.md\njpuigcerver@fp:~/git_branques (main) $ git lg\n* 0b1b3b4 - (3 minutes ago) T\u00edtol - Joan Puigcerver (HEAD -> main)\n
    1. Canviem el nom de la branca principal a main.
    ","tags":["conflictes","fast-forward","git branch","git checkout","git merge","git rebase","git switch","HEAD"]},{"location":"apunts/02_branques/#branques","title":"Branques","text":"

    Una branca \u00e9s una l\u00ednia de desenvolupament independent. En Git, una branca \u00e9s un simple punter a un commit, que avan\u00e7a a mesura que es fan nous commits sobre aquesta.

    Figura 1: Estructura de branques inicial.

    Exemple

    L'estructura de branques inicial del repositori que utilitzarem en aquest material \u00e9s la seg\u00fcent \u00e9s el que es mostra a la Figura 1.

    jpuigcerver@fp:~/git_branques (main) $ git lg\n* 0b1b3b4 - (3 minutes ago) T\u00edtol - Joan Puigcerver (HEAD -> main)\n

    Vegem que tenim un \u00fanic commit amb l'identificador 0b1b3b4. A m\u00e9s, existeix una \u00fanica branca anomenada main que apunta a aquest commit.

    Tamb\u00e9 observem que el HEAD apunta a la branca main, indicant que \u00e9s la branca activa i que el Directori de Treball es troba en aquest estat.

    Es veur\u00e0 amb m\u00e9s detall a l'apartat Canviar de branca.

    La ordre git branch ens permet veure i manipular les branques d'un repositori.

    Documentaci\u00f3

    Documentaci\u00f3 de la ordre git branch: https://git-scm.com/docs/git-branch

    ","tags":["conflictes","fast-forward","git branch","git checkout","git merge","git rebase","git switch","HEAD"]},{"location":"apunts/02_branques/#mostrar-les-branques","title":"Mostrar les branques","text":"

    Per mostrar les branques d'un repositori, utilitzem l'ordre:

    git branch [--list] [-a | --all] [-v | --verbose]\n
    L'ordre git branch mostra les branques si:

    M\u00e9s opcions:

    Exemple

    Mostrem les branques del nostre repositori.

    jpuigcerver@fp:~/git_branques (main) $ git branch\n* main\n

    Vegem que tenim una \u00fanica branca anomenada main.

    ","tags":["conflictes","fast-forward","git branch","git checkout","git merge","git rebase","git switch","HEAD"]},{"location":"apunts/02_branques/#crear-una-branca","title":"Crear una branca","text":"

    Per crear una nova branca, utilitzem l'ordre:

    git branch [-f | --force] <nom>\n

    Aquesta ordre indicar\u00e0 amb un * la branca activa (on es troba el HEAD).

    Advert\u00e8ncia

    Si ja existeix una branca amb el mateix nom i no s'utilitza l'opci\u00f3 -f o --force, l'ordre mostrar\u00e0 un error i no es crear\u00e0 la branca.

    Exemple

    Creem la branca docs.

    jpuigcerver@fp:~/git_branques (main) $ git branch docs\njpuigcerver@fp:~/git_branques (main) $ git branch\n* main\n  docs\njpuigcerver@fp:~/git_branques (main) $ git lg\n* 0b1b3b4 - (3 minutes ago) T\u00edtol - Joan Puigcerver (HEAD -> main, docs)\n

    Vegem que s'ha creat la branca docs que apunta al commit 0b1b3b4. Vegem que la branca activa continua sent main.

    Figura 2: Estructura de branques despr\u00e9s de crear la branca docs.

    ","tags":["conflictes","fast-forward","git branch","git checkout","git merge","git rebase","git switch","HEAD"]},{"location":"apunts/02_branques/#canviar-de-branca","title":"Canviar de branca","text":"

    Existeixen dues ordres per canviar de branca, cadascuna amb la seva pr\u00f2pia sintaxi i opcions:

    git checkout <nom>\ngit switch <nom>\n

    Originalment, s'utilitzava l'ordre git checkout per canviar de branca, per\u00f2 com que aquesta ordre t\u00e9 moltes altres funcions, s'ha introdu\u00eft l'ordre git switch a partir de la versi\u00f3 2.23 de Git per evitar confusions.

    Documentaci\u00f3

    Info

    M\u00e9s informaci\u00f3: Stack Overflow: What's the difference between 'git switch' and 'git checkout' <branch>?

    En qualsevol cas, canviar de branca significa moure el punter HEAD a la branca desitjada. El canvi de branca tamb\u00e9 implica modificar el contingut del Directori de Treball a l'estat del commit al qual apunta la branca.

    La Figura 2 mostra l'estat del repositori quan el HEAD apunta a la branca main. La Figura 3 mostra l'estat del repositori despr\u00e9s de canviar a la branca docs.

    Figura 3: Estructura de branques despr\u00e9s de canviar a la branca docs.

    Example

    Podeu observar com l'estat del repositori \u00e9s el mateix, ja que les dues branques apunten al mateix commit, per\u00f2 el HEAD apunta a la branca docs.

    jpuigcerver@fp:~/git_branques (main) $ git branch\n* main\n  docs\njpuigcerver@fp:~/git_branques (main) $ git lg\n* 0b1b3b4 - (3 minutes ago) T\u00edtol - Joan Puigcerver (HEAD -> main, docs)\njpuigcerver@fp:~/git_branques (main) $ cat README.md\n# Bloc: Branques\njpuigcerver@fp:~/git_branques (main) $ git switch docs\nSwitched to branch 'docs'\njpuigcerver@fp:~/git_branques (docs) $ git branch\n  main\n* docs\njpuigcerver@fp:~/git_branques (docs) $ git lg\n* 0b1b3b4 - (3 minutes ago) T\u00edtol - Joan Puigcerver (HEAD -> docs, main)\njpuigcerver@fp:~/git_branques (docs) $ cat README.md\n# Bloc: Branques\n
    ","tags":["conflictes","fast-forward","git branch","git checkout","git merge","git rebase","git switch","HEAD"]},{"location":"apunts/02_branques/#canvis-en-una-branca","title":"Canvis en una branca","text":"

    Per fer canvis en una branca cal: - Situar-se en la branca on es vol fer el canvi (git checkout o git switch). - Realitzar els canvis desitjats. - Confirmar els canvis amb git commit.

    Quan es realitza un commit en una branca, el punter de la branca actual (HEAD) s'avan\u00e7a al nou commit.

    Exemple

    Afegim un subt\u00edtol al nostre fitxer README.md a la branca docs.

    jpuigcerver@fp:~/git_branques (main) $ git checkout docs\njpuigcerver@fp:~/git_branques (docs) $ echo >> README.md\njpuigcerver@fp:~/git_branques (docs) $ echo \"## Documentaci\u00f3\" >> README.md\njpuigcerver@fp:~/git_branques (docs) $ git diff\ndiff --git a/README.md b/README.md\nindex 4efb7a9..3e27f51 100644\n--- a/README.md\n+++ b/README.md\n@@ -1 +1,3 @@\n # Bloc: Branques\n+\n+## Documentaci\u00f3\njpuigcerver@fp:~/git_branques (docs) $ git add README.md\njpuigcerver@fp:~/git_branques (docs) $ git commit -m \"Subt\u00edtol documentaci\u00f3\"\n[docs 1b2c5d6] Subt\u00edtol documentaci\u00f3\n 1 file changed, 1 insertion(+)\njpuigcerver@fp:~/git_branques (docs) $ git lg\n* 1b2c5d6 - (3 seconds ago) Subt\u00edtol documentaci\u00f3 - Joan Puigcerver (HEAD -> docs)\n* 0b1b3b4 - (3 minutes ago) T\u00edtol - Joan Puigcerver (main)\n

    Vegem que la branca docs ha avan\u00e7at al nou commit 1b2c5d6, mentre que la branca main continua apuntant al commit 0b1b3b4.

    Figura 4: Estructura de branques despr\u00e9s de fer un commit a la branca docs.

    ","tags":["conflictes","fast-forward","git branch","git checkout","git merge","git rebase","git switch","HEAD"]},{"location":"apunts/02_branques/#reanomenar-una-branca","title":"Reanomenar una branca","text":"

    Per reanomenar una branca, utilitzem l'ordre:

    git branch [-m | --move] <nou_nom>\n

    Exemple

    En la Introducci\u00f3 s'ha utilitzat aquesta opci\u00f3 per canviar el nom de la branca principal de master a main.

    ","tags":["conflictes","fast-forward","git branch","git checkout","git merge","git rebase","git switch","HEAD"]},{"location":"apunts/02_branques/#eliminar-una-branca","title":"Eliminar una branca","text":"

    Per eliminar una branca, utilitzem l'ordre:

    git branch [-d | --delete] [-D] [-f | --force] <nom>\n

    Advert\u00e8ncia

    Quan un commit perd totes les refer\u00e8ncies per a ser accedit, es diu que \u00e9s un commit orfre i ser\u00e0 eliminat pel recol\u00b7lector de brossa (garbage collector) de Git.

    L'eliminaci\u00f3 d'una branca pot provocar la p\u00e8rdua de commits. En aquest cas, Git mostrar\u00e0 un error i no es podr\u00e0 eliminar la branca a no ser que s'utilitze l'opci\u00f3 -D o --delete --force.

    Example

    Eliminem la branca docs.

    jpuigcerver@fp:~/git_branques (docs) $ git checkout main\njpuigcerver@fp:~/git_branques (main) $ git lg\n* 1b2c5d6 - (3 seconds ago) Subt\u00edtol documentaci\u00f3 - Joan Puigcerver (docs)\n* 0b1b3b4 - (3 minutes ago) T\u00edtol - Joan Puigcerver (HEAD -> main)\njpuigcerver@fp:~/git_branques (main) $ git branch -d docs\nerror: the branch 'docs' is not fully merged\nhint: If you are sure you want to delete it, run 'git branch -D docs'\nhint: Disable this message with \"git config advice.forceDeleteBranch false\"\njpuigcerver@fp:~/git_branques (main) $ git branch -D docs\nDeleted branch docs (was 1b2c5d6).\njpuigcerver@fp:~/git_branques (main) $ git lg\n* 0b1b3b4 - (3 minutes ago) T\u00edtol - Joan Puigcerver (HEAD -> main)\n

    La branca docs ha estat eliminada i, per tant, el commit 1b2c5d6 s'ha convertit en un commit orfe i ser\u00e0 eliminat pel recol\u00b7lector de brossa de Git.

    ","tags":["conflictes","fast-forward","git branch","git checkout","git merge","git rebase","git switch","HEAD"]},{"location":"apunts/02_branques/#fusio-de-branques-git-merge","title":"Fusi\u00f3 de branques (git merge)","text":"

    La fusi\u00f3 de branques o merge \u00e9s el proc\u00e9s de combinar els canvis d'una branca a una altra.

    Aquest proc\u00e9s es realitza amb l'ordre:

    git merge <branca>\n

    Important

    La fusi\u00f3 de branques sempre incorpora els canvis de la branca especificada a la branca actual (on es troba el HEAD).

    Documentaci\u00f3

    Documentaci\u00f3 de la ordre git merge: https://git-scm.com/docs/git-merge

    Segons l'estrucura de les branques, la fusi\u00f3 pot ser directa (fast-forward) o mitjan\u00e7ant commit de fusi\u00f3 (merge commit).

    ","tags":["conflictes","fast-forward","git branch","git checkout","git merge","git rebase","git switch","HEAD"]},{"location":"apunts/02_branques/#fusio-directa","title":"Fusi\u00f3 directa","text":"

    La fusi\u00f3 directa (fast-forward) \u00e9s un tipus de fusi\u00f3 que es produeix quan la branca actual (HEAD) no t\u00e9 cap nou commit des de que es va crear la branca que es vol fusionar.

    En aquest cas, la fusi\u00f3 es realitza avan\u00e7ant el punter de la branca actual (HEAD) fins on es troba la branca que es vol fusionar.

    Important

    La fusi\u00f3 directa \u00e9s la forma m\u00e9s senzilla i neta de fusionar branques, ja que no es crea cap commit addicional per fusionar les branques i mant\u00e9 una hist\u00f2ria lineal i f\u00e0cil de seguir.

    Info

    Per assegurar-se que la fusi\u00f3 siga directa, es pot utilitzar l'opci\u00f3 --ff-only

    En cas que la fusi\u00f3 no siga directa, Git mostrar\u00e0 un error i no es realitzar\u00e0 la fusi\u00f3.

    Example

    Partint de la situaci\u00f3 de la Figura 4, on la branca docs t\u00e9 un commit m\u00e9s que la branca main, la fusi\u00f3 de la branca docs a la branca main ser\u00e0 una fusi\u00f3 directa.

    Figura 5: Hist\u00f2ria abans de la fusi\u00f3 directa.

    jpuigcerver@fp:~/git_branques (docs) $ git checkout main\nSwitched to branch 'main'\njpuigcerver@fp:~/git_branques (main) $ cat README.md\n# Bloc: Branques\njpuigcerver@fp:~/git_branques (main) $ git lg\n* 1b2c5d6 - (3 seconds ago) Subt\u00edtol documentaci\u00f3 - Joan Puigcerver (docs)\n* 0b1b3b4 - (3 minutes ago) T\u00edtol - Joan Puigcerver (HEAD -> main)\n

    En aquest cas, la fusi\u00f3 es portar\u00e0 a terme avan\u00e7ant el punter de la branca main fins al punt on es troba la branca docs.

    Figura 6: Hist\u00f2ria despr\u00e9s de la fusi\u00f3 directa.

    jpuigcerver@fp:~/git_branques (main) $ git merge docs\nUpdating 0b1b3b4..1b2c5d6\nFast-forward\n README.md | 1 +\n 1 file changed, 1 insertion(+)\njpuigcerver@fp:~/git_branques (main) $ cat README.md # (1)!\n# Bloc: Branques\n\n## Documentaci\u00f3\njpuigcerver@fp:~/git_branques (main) $ git lg\n* 1b2c5d6 - (3 seconds ago) Subt\u00edtol documentaci\u00f3 - Joan Puigcerver (HEAD -> main, docs)\n* 0b1b3b4 - (3 minutes ago) T\u00edtol - Joan Puigcerver\n
    1. Vegem que el fitxer README.md ha incorporat els canvis de la branca docs.
    ","tags":["conflictes","fast-forward","git branch","git checkout","git merge","git rebase","git switch","HEAD"]},{"location":"apunts/02_branques/#fusio-de-branques-divergents","title":"Fusi\u00f3 de branques divergents","text":"

    No sempre \u00e9s possible realitzar fusi\u00f3 mitjan\u00e7ant una fusi\u00f3 directa (fast-forward). Pot donar-se el cas que les dues branques hagen divergit, \u00e9s a dir, que cada branca haja realitzat canvis que no estan presents en l'altra branca.

    Preparaci\u00f3 branques divergents
    1. Realitzem canvis en la branca docs.
    jpuigcerver@fp:~/git_branques (main) $ git checkout docs\nSwitched to branch 'docs'\njpuigcerver@fp:~/git_branques (docs) $ echo \"https://git-scm.com/\" >> README.md\njpuigcerver@fp:~/git_branques (docs) $ git diff\ndiff --git a/README.md b/README.md\nindex 4efb7a9..3e27f51 100644\n--- a/README.md\n+++ b/README.md\n@@ -1,3 +1,4 @@\n # Bloc: Branques\n\n ## Documentaci\u00f3\n+- https://git-scm.com/\njpuigcerver@fp:~/git_branques (docs) $ git commit -a -m \"Documentaci\u00f3 oficial\"\n[docs 3d4e5f6] Documentaci\u00f3 oficial\n 1 file changed, 1 insertion(+)\njpuigcerver@fp:~/git_branques (docs) $ git lg\n* 3d4e5f6 - (3 seconds ago) Documentaci\u00f3 oficial - Joan Puigcerver (HEAD -> docs)\n* 1b2c5d6 - (3 minutes ago) Subt\u00edtol documentaci\u00f3 - Joan Puigcerver (main)\n* 0b1b3b4 - (3 minutes ago) T\u00edtol - Joan Puigcerver\n
    1. Realitzem canvis en la branca main.
    jpuigcerver@fp:~/git_branques (docs) $ git checkout main\nSwitched to branch 'main'\njpuigcerver@fp:~/git_branques (main) $ vim README.md # (1)!\njpuigcerver@fp:~/git_branques (main) $ git diff\ndiff --git a/README.md b/README.md\nindex 3e27f51..4efb7a9 100644\n--- a/README.md\n+++ b/README.md\n@@ -1,2 +1,3 @@\n # Bloc: Branques\n+__Autor:__ Joan Puigcerver\n\n ## Documentaci\u00f3\njpuigcerver@fp:~/git_branques (main) $ git commit -a -m \"Autor\"\n[main 2a3b4c5] Autor\n 1 file changed, 1 insertion(+)\njpuigcerver@fp:~/git_branques (main) $ git lg -a\n* 2a3b4c5 - (5 seconds ago) Autor - Joan Puigcerver (HEAD -> main)\n| * 3d4e5f6 - (3 minutes ago) Documentaci\u00f3 oficial - Joan Puigcerver (docs)\n|/\n* 1b2c5d6 - (10 minutes ago) Subt\u00edtol documentaci\u00f3 - Joan Puigcerver (docs)\n* 0b1b3b4 - (13 minutes ago) T\u00edtol - Joan Puigcerver\n
    1. Modifiquem el fitxer README.md. Pots utilitzar l'editor de text que preferisques.
    Figura 7: Hist\u00f2ria abans de la fusi\u00f3 en branques divergents.

    En aquest cas, la fusi\u00f3 es realitza mitjan\u00e7ant un commit de fusi\u00f3 (merge commit). Aquest commit de fusi\u00f3 t\u00e9 dos pares, un per cada branca que es fusiona i incorpora els canvis de les dues branques.

    Figura 8: Hist\u00f2ria despr\u00e9s de la fusi\u00f3 en branques divergents.

    En el moment de realitzar la fusi\u00f3 (git merge), Git crear\u00e0 un nou commit de fusi\u00f3 que incorporar\u00e0 els canvis de les dues branques.

    Aquest commit necessita d'un missatge, per tant, es pot utilitzar l'opci\u00f3 -m per afegir un missatge al commit. Si no se n'especifica cap, s'obrir\u00e0 l'editor de text configurat per defecte per a afegir el missatge. (Vegeu Confirmar canvis)

    Advert\u00e8ncia

    Aquest tipus de fusi\u00f3 no \u00e9s tan neta com la fusi\u00f3 directa (fast-forward), ja que la hist\u00f2ria del projecte es torna m\u00e9s complexa i no lineal.

    Info

    Per for\u00e7ar que la fusi\u00f3 es realitze amb un commit de fusi\u00f3 (merge commit), es pot utilitzar l'opci\u00f3 --no-ff.

    Fusi\u00f3 de branques divergents

    Realitzem la fusi\u00f3 de les dues branques.

    jpuigcerver@fp:~/git_branques (main) $ git merge docs -m \"Merge branch 'docs' into main\" # (1)!\nAuto-merging README.md\nMerge made by the 'ort' strategy.\n README.md | 1 +\n 1 file changed, 1 insertion(+)\njpuigcerver@fp:~/git_branques (main) $ git lg\n*   b6aa5c3 - (3 seconds ago) Merge branch 'docs' into main - Joan Puigcerver (HEAD -> main)\n|\\\n| * 3d4e5f6 - (3 minutes ago) Documentaci\u00f3 oficial - Joan Puigcerver (docs)\n* | 2a3b4c5 - (5 seconds ago) Autor - Joan Puigcerver\n|/\n* 1b2c5d6 - (10 minutes ago) Subt\u00edtol documentaci\u00f3 - Joan Puigcerver\n* 0b1b3b4 - (13 minutes ago) T\u00edtol - Joan Puigcerver\njpuigcerver@fp:~/git_branques (main) $ cat README.md\n# Bloc: Branques\n__Autor:__ Joan Puigcerver\n\n## Documentaci\u00f3\n- https://git-scm.com/\n
    1. La opci\u00f3 -m permet afegir un missatge al commit de fusi\u00f3.

    En aquest punt ens trobem en la situaci\u00f3 mostrada en la Figura 8. Vegem que el fitxer README.md ha incorporat els canvis de les dues branques.

    ","tags":["conflictes","fast-forward","git branch","git checkout","git merge","git rebase","git switch","HEAD"]},{"location":"apunts/02_branques/#resolucio-de-conflictes","title":"Resoluci\u00f3 de conflictes","text":"

    En el proc\u00e9s de fusi\u00f3 de branques, pot donar-se el cas que les dues branques hagen modificat la mateixa part d'un fitxer. En aquest cas, Git no pot resoldre el conflictes de forma autom\u00e0tica i caldr\u00e0 resoldre'ls manualment.

    En el moment que executem git merge, Git detectar\u00e0 el conflictes els marcar\u00e0 en el fitxer amb la seg\u00fcent notaci\u00f3:

    <<<<<<< HEAD\nContingut de la branca actual\n=======\nContingut de la branca a fusionar\n>>>>>>> branca_a_fusionar\n

    A m\u00e9s, el repositori passar\u00e0 a l'estat de fusi\u00f3 (MERGING), indicant que hi ha una fusi\u00f3 en curs.

    Per resoldre el conflicte, caldr\u00e0:

    1. Editar el fitxer i resoldre manualment el conflicte.
    2. Esborrar les marques de conflicte.

    Una vegada resolt el conflicte, caldr\u00e0 confirmar els canvis amb git add i git commit.

    Info

    En cas que es desitge cancel\u00b7lar el proc\u00e9s de fusi\u00f3, es pot utilitzar l'ordre git merge --abort.

    Preparaci\u00f3 branques divergents amb conflicte
    1. Creem la branca conflictes i realitzem canvis en la descripci\u00f3 del fitxer README.md.
    jpuigcerver@fp:~/git_branques (main) $ git branch conflictes\njpuigcerver@fp:~/git_branques (main) $ git checkout conflictes\nSwitched to branch 'conflictes'\njpuigcerver@fp:~/git_branques (conflictes) $ vim README.md\njpuigcerver@fp:~/git_branques (conflictes) $ git diff\ndiff --git a/README.md b/README.md\nindex f94383b..c9b0a17 100644\n--- a/README.md\n+++ b/README.md\n@@ -1,5 +1,7 @@\n # Bloc: Branques\n __Autor__: Joan Puigcerver\n\n+Estem aprenent a resoldre conflictes.\n+\n ## Documentaci\u00f3\n - https://git-scm.com/\njpuigcerver@fp:~/git_branques (conflictes) $ git commit -a -m \"Text conflictes\"\n[conflictes 4e5f6d7] Text conflictes\n 1 file changed, 2 insertions(+)\njpuigcerver@fp:~/git_branques (conflictes) $ git lg\n* 4e5f6d7 - (3 seconds ago) Text conflictes - Joan Puigcerver (HEAD -> conflictes)\n* b6aa5c3 - (3 minutes ago) Merge branch 'docs' into main - Joan Puigcerver (main)\n...\n
    1. Realitzem canvis en la descripci\u00f3 en la branca main.
    jpuigcerver@fp:~/git_branques (main) $ git checkout main\nSwitched to branch 'main'\njpuigcerver@fp:~/git_branques (main) $ vim README.md\njpuigcerver@fp:~/git_branques (main) $ git diff\ndiff --git a/README.md b/README.md\nindex f94383b..a03cd9d 100644\n--- a/README.md\n+++ b/README.md\n@@ -1,5 +1,7 @@\n # Bloc: Branques\n __Autor__: Joan Puigcerver\n\n+Estem aprenent a fusionar branques.\n+\n ## Documentaci\u00f3\n - https://git-scm.com/\njpuigcerver@fp:~/git_branques (main) $ git commit -a -m \"Text fusi\u00f3\"\n[main 072e36a] Text fusi\u00f3\n 1 file changed, 2 insertions(+)\njpuigcerver@fp:~/git_branques (main) $ git lg -a\n* 072e36a - (3 seconds ago) Text fusi\u00f3 - Joan Puigcerver (HEAD -> main)\n| * 4e5f6d7 - (3 minutes ago) Text conflictes - Joan Puigcerver (conflictes)\n|/\n* b6aa5c3 - (3 minutes ago) Merge branch 'docs' into main - Joan Puigcerver\n...\n

    Exemple de fusi\u00f3 amb resoluci\u00f3 de conflictes

    Realitzem la fusi\u00f3 de la branca conflictes a la branca main.

    jpuigcerver@fp:~/git_branques (main) $ git merge conflictes\nAuto-merging README.md\nCONFLICT (content): Merge conflict in README.md\nAutomatic merge failed; fix conflicts and then commit the result.\njpuigcerver@fp:~/git_branques (main|MERGING) $ cat README.md\n# Bloc: Branques\n__Autor__: Joan Puigcerver\n\n<<<<<<< HEAD\nEstem aprenent a fusionar branques.\n=======\nEstem aprenent a resoldre conflictes.\n>>>>>>> conflictes\n\n## Documentaci\u00f3\n- https://git-scm.com/\njpuigcerver@fp:~/git_branques (main|MERGING) $ vim README.md # (1)!\njpuigcerver@fp:~/git_branques (main|MERGING) $ cat README.md\njpuigcerver@fedora:~/git_branques (main|MERGING) $ cat README.md \n# Bloc: Branques\n__Autor__: Joan Puigcerver\n\nEstem aprenent a fusionar branques i resoldre conflictes.\n\n## Documentaci\u00f3\n- https://git-scm.com/\njpuigcerver@fp:~/git_branques (main|MERGING) $ git add README.md\njpuigcerver@fp:~/git_branques (main|MERGING) $ git commit -m \"Resoluci\u00f3 conflicte\"\n[main 8a9b0c1] Resoluci\u00f3 conflicte\njpuigcerver@fp:~/git_branques (main) $ git lg\n* 8a9b0c1 - (3 seconds ago) Resoluci\u00f3 conflicte - Joan Puigcerver (HEAD -> main)\n|\\\n| * 4e5f6d7 - (3 minutes ago) Text conflictes - Joan Puigcerver (conflictes)\n* | 072e36a - (3 minutes ago) Text fusi\u00f3 - Joan Puigcerver\n|/\n* b6aa5c3 - (3 minutes ago) Merge branch 'docs' into main - Joan Puigcerver\n...\n
    1. Hem combinat els dos textos i hem eliminat les marques de conflicte.
    ","tags":["conflictes","fast-forward","git branch","git checkout","git merge","git rebase","git switch","HEAD"]},{"location":"apunts/02_branques/#canvi-de-base-rebase","title":"Canvi de base (rebase)","text":"

    El canvi de base (rebase) \u00e9s una altra manera de fusionar canvis de branques divergents, que consiteix en aplicar els canvis dels commit d'una branca sobre una altra branca, en ordre cronol\u00f2gic.

    Aquesta t\u00e8cnica permet eliminar les branques diveregents i mantenir una hist\u00f2ria lineal.

    Aquest proc\u00e9s es realitza amb l'ordre:

    git rebase <branca>\n

    Documentaci\u00f3

    Documentaci\u00f3 de la ordre git rebase: https://git-scm.com/docs/git-rebase

    Important

    L'ordre git rebase canviar\u00e0 la base de la branca actual (HEAD).

    Preparaci\u00f3 branques divergents
    1. Creem la branca llicencia i realitzem canvis en la descripci\u00f3 del fitxer README.md.
    jpuigcerver@fp:~/git_branques (main) $ git checkout -b llicencia # (1)!\nSwitched to a new branch 'llicencia'\njpuigcerver@fp:~/git_branques (llicencia) $ echo >> README.md\njpuigcerver@fp:~/git_branques (llicencia) $ echo \"## Llic\u00e8ncia\" >> README.md\njpuigcerver@fp:~/git_branques (llicencia) $ echo \"CC BY-NC-SA 4.0\" >> README.md\njpuigcerver@fp:~/git_branques (llicencia) $ git diff\ndiff --git a/README.md b/README.md\nindex 2ca252f..6aa790e 100644\n--- a/README.md\n+++ b/README.md\n@@ -5,3 +5,6 @@ Estem aprenent a fusionar branques i resoldre conflictes.\n\n ## Documentaci\u00f3\n - https://git-scm.com/\n+\n+## Llic\u00e8ncia\n+CC BY-NC-SA 4.0\njpuigcerver@fp:~/git_branques (llicencia) $ git commit -a -m \"Llic\u00e8ncia\"\n[llicencia e474d76] Llic\u00e8ncia\n 1 file changed, 3 insertions(+)\njpuigcerver@fp:~/git_branques (llicencia) $ git lg\n* e474d76 - (14 seconds ago) Llic\u00e8ncia - Joan Puigcerver (HEAD -> llicencia)\n* 8a9b0c1 - (3 minutes ago) Resoluci\u00f3 conflicte - Joan Puigcerver (main)\n...\n
    1. Realitzem canvis en la descripci\u00f3 en la branca main.
    jpuigcerver@fp:~/git_branques (llicencia) $ git checkout main\nSwitched to branch 'main'\njpuigcerver@fp:~/git_branques (main) $ vim README.md\njpuigcerver@fp:~/git_branques (main) $ git diff\ndiff --git a/README.md b/README.md\nindex 2ca252f..3a3fe02 100644\n--- a/README.md\n+++ b/README.md\n@@ -2,6 +2,7 @@\n __Autor__: Joan Puigcerver\n\n Estem aprenent a fusionar branques i resoldre conflictes.\n+Tamb\u00e9 a canviar la base d'una branca.\n\n ## Documentaci\u00f3\n - https://git-scm.com/\njpuigcerver@fp:~/git_branques (main) $ git commit -a -m \"Text rebase\"\n[main 1b2c3d4] Text rebase\n 1 file changed, 1 insertion(+)\njpuigcerver@fp:~/git_branques (main) $ git lg -a\n* 1b2c3d4 - (3 seconds ago) Text rebase - Joan Puigcerver (HEAD -> main)\n| * e474d76 - (3 minutes ago) Llic\u00e8ncia - Joan Puigcerver (llicencia)\n|/\n* 8a9b0c1 - (3 minutes ago) Resoluci\u00f3 conflicte - Joan Puigcerver\n...\n
    1. L'opci\u00f3 git checkout -b permet crear una nova branca i situar-se en ella directament.
    Figura 9: Hist\u00f2ria abans del canvi de base. Figura 10: Hist\u00f2ria despr\u00e9s del canvi de base.

    Canvi de base

    Canviem la base de la branca llicencia a la branca main.

    jpuigcerver@fp:~/git_branques (main) $ git checkout llicencia\nSwitched to branch 'llicencia'\njpuigcerver@fp:~/git_branques (llicencia) $ git rebase main\nSuccessfully rebased and updated refs/heads/llicencia.\njpuigcerver@fp:~/git_branques (llicencia) $ git lg\n* 8bad4a1 - (3 seconds ago) Llic\u00e8ncia - Joan Puigcerver (HEAD -> llicencia)\n* 1b2c3d4 - (3 minutes ago) Text rebase - Joan Puigcerver (main)\n* 8a9b0c1 - (3 minutes ago) Resoluci\u00f3 conflicte - Joan Puigcerver\n...\njpuigcerver@fp:~/git_branques (llicencia) $ cat README.md\n# Bloc: Branques\n__Autor__: Joan Puigcerver\n\nEstem aprenent a fusionar branques i resoldre conflictes.\nTamb\u00e9 a canviar la base d'una branca.\n\n## Documentaci\u00f3\n- https://git-scm.com/\n\n## Llic\u00e8ncia\nCC BY-NC-SA 4.0\n

    Vegem que la branca llicencia ha canviat la seva base a la branca main i ha incorporat els seus canvis.

    Notice

    L'identificador (hash) del commit Llic\u00e8ncia ha canviat despr\u00e9s del rebase.

    Aix\u00f2 \u00e9s degut a que s'ha creat un nou commit amb els canvis de l'anterior.

    En aquest punt, si volem incorporar els canvis de la branca llicencia a la branca main, podem fer-ho mitjan\u00e7ant una fusi\u00f3 directa (fast-forward).

    jpuigcerver@fp:~/git_branques (llicencia) $ git checkout main\nSwitched to branch 'main'\njpuigcerver@fp:~/git_branques (main) $ git merge llicencia\nUpdating 1b2c3d4..8bad4a1\nFast-forward\n README.md | 3 +++\n 1 file changed, 3 insertions(+)\njpuigcerver@fp:~/git_branques (main) $ git lg\n* 8bad4a1 - (3 seconds ago) Llic\u00e8ncia - Joan Puigcerver (HEAD -> main, llicencia)\n* 1b2c3d4 - (3 minutes ago) Text rebase - Joan Puigcerver\n...\n
    ","tags":["conflictes","fast-forward","git branch","git checkout","git merge","git rebase","git switch","HEAD"]},{"location":"apunts/02_branques/#resolucio-de-conflictes_1","title":"Resoluci\u00f3 de conflictes","text":"

    El canvi de base (rebase) tamb\u00e9 pot provocar conflictes si les dues branques han modificat la mateixa part d'un fitxer.

    Git ens indicar\u00e0 que hi ha conflictes i caldr\u00e0 resoldre'ls manualment, d'una manera similar a la resoluci\u00f3 de conflictes en la fusi\u00f3 de branques.

    En aquest cas, caldr\u00e0 resoldre els conflictes per a cada commit en el que s'est\u00e0 canviant la base.

    Despr\u00e9s de resoldre els conflictes d'un commit, caldr\u00e0 continuar amb el proc\u00e9s de rebase amb l'ordre git rebase --continue fins que s'haja aplicat el canvi de base a tots els commit de la branca.

    Preparaci\u00f3 branques divergents amb conflictes
    1. Creem la branca docs/git_training i realitzem canvis en la descripci\u00f3 del fitxer README.md.
    jpuigcerver@fp:~/git_branques (main) $ git checkout -b docs_git_training\nSwitched to a new branch 'docs_git_training'\njpuigcerver@fp:~/git_branques (docs_git_training) $ vim README.md\njpuigcerver@fp:~/git_branques (docs_git_training) $ git diff\ndiff --git a/README.md b/README.md\nindex 54f292f..271a617 100644\n--- a/README.md\n+++ b/README.md\n@@ -6,6 +6,7 @@ Tamb\u00e9 a canviar la base d'una branca.\n\n ## Documentaci\u00f3\n - https://git-scm.com/\n+- https://github.com/UnseenWizzard/git_training \n\n ## Llic\u00e8ncia\n CC BY-NC-SA 4.0\njpuigcerver@fp:~/git_branques (docs_git_training) $ git commit -a -m \"Documentaci\u00f3 git_training\"\n[docs_git_training a136424] Documentaci\u00f3 git_training\n 1 file changed, 1 insertion(+)\njpuigcerver@fp:~/git_branques (docs_git_training) $ git lg\n* a136424 - (3 seconds ago) Documentaci\u00f3 git_training - Joan Puigcerver (HEAD -> docs_git_training)\n* 1b2c3d4 - (3 minutes ago) Text rebase - Joan Puigcerver (main)\n...\n
    1. Realitzem canvis en la descripci\u00f3 en la branca main.
    jpuigcerver@fp:~/git_branques (docs_git_training) $ git checkout main\nSwitched to branch 'main'\njpuigcerver@fp:~/git_branques (main) $ vim README.md\njpuigcerver@fp:~/git_branques (main) $ git diff\ndiff --git a/README.md b/README.md\nindex 54f292f..6f65136 100644\n--- a/README.md\n+++ b/README.md\n@@ -6,6 +6,7 @@ Tamb\u00e9 a canviar la base d'una branca.\n\n ## Documentaci\u00f3\n - https://git-scm.com/\n+- https://www.w3schools.com/git/\n\n ## Llic\u00e8ncia\n CC BY-NC-SA 4.0\njpuigcerver@fp:~/git_branques (main) $ git commit -a -m \"Documentaci\u00f3 w3schools\"\n[main 0230b1b] Documentaci\u00f3 w3schools\n 1 file changed, 1 insertion(+)\njpuigcerver@fp:~/git_branques (main) $ git lg -a\n* 0230b1b - (3 seconds ago) Documentaci\u00f3 w3schools - Joan Puigcerver (HEAD -> main)\n| * a136424 - (3 minutes ago) Documentaci\u00f3 git_training - Joan Puigcerver (docs_git_training)\n|/\n* 1b2c3d4 - (3 minutes ago) Text rebase - Joan Puigcerver\n...\n

    Canvi de base amb conflictes

    Canviem la base de la branca docs_git_training a la branca main.

    jpuigcerver@fp:~/git_branques (main) $ git checkout docs_git_training\nSwitched to branch 'docs_git_training'\njpuigcerver@fp:~/git_branques (docs_git_training) $ git rebase main\nAuto-merging README.md\nCONFLICT (content): Merge conflict in README.md\nerror: could not apply a136424... git_training\nhint: Resolve all conflicts manually, mark them as resolved with\nhint: \"git add/rm <conflicted_files>\", then run \"git rebase --continue\".\nhint: You can instead skip this commit: run \"git rebase --skip\".\nhint: To abort and get back to the state before \"git rebase\", run \"git rebase --abort\".\nhint: Disable this message with \"git config advice.mergeConflict false\"\nCould not apply a136424... Documentaci\u00f3 git_training\njpuigcerver@fp:~/git_branques (docs_git_training|REBASE 1/1) $ git status\ninteractive rebase in progress; onto 0230b1b\nLast command done (1 command done):\n   pick a136424 git_training\nNo commands remaining.\nYou are currently rebasing branch 'docs_git_training' on '0230b1b'.\n  (fix conflicts and then run \"git rebase --continue\")\n  (use \"git rebase --skip\" to skip this patch)\n  (use \"git rebase --abort\" to check out the original branch)\n\nUnmerged paths:\n  (use \"git restore --staged <file>...\" to unstage)\n  (use \"git add <file>...\" to mark resolution)\n    both modified:   README.md\n\nno changes added to commit (use \"git add\" and/or \"git commit -a\")\njpuigcerver@fp:~/git_branques (docs_git_training|REBASE 1/1) $ cat README.md\n# Bloc: Branques\n__Autor__: Joan Puigcerver\n\nEstem aprenent a fusionar branques i resoldre conflictes.\nTamb\u00e9 a canviar la base d'una branca.\n\n## Documentaci\u00f3\n- https://git-scm.com/\n<<<<<<< HEAD\n- https://www.w3schools.com/git/\n=======\n- https://github.com/UnseenWizzard/git_training \n>>>>>>> a136424 (git_training)\n\n## Llic\u00e8ncia\nCC BY-NC-SA 4.0\n

    Vegem que hi ha conflictes en el fitxer README.md. Hem de resoldre'ls manualment.

    jpuigcerver@fp:~/git_branques (docs_git_training|REBASE 1/1) $ vim README.md # (1)!\njpuigcerver@fp:~/git_branques (docs_git_training|REBASE 1/1) $ cat README.md\n# Bloc: Branques\n__Autor__: Joan Puigcerver\n\nEstem aprenent a fusionar branques i resoldre conflictes.\nTamb\u00e9 a canviar la base d'una branca.\n\n## Documentaci\u00f3\n- https://git-scm.com/\n- https://www.w3schools.com/git/\n- https://github.com/UnseenWizzard/git_training \n\n## Llic\u00e8ncia\nCC BY-NC-SA 4.0\njpuigcerver@fp:~/git_branques (docs_git_training|REBASE 1/1) $ git add README.md # (2)!\njpuigcerver@fp:~/git_branques (docs_git_training|REBASE 1/1) $ git status\ninteractive rebase in progress; onto 0230b1b\nLast command done (1 command done):\n   pick a136424 git_training\nNo commands remaining.\nYou are currently rebasing branch 'docs_git_training' on '0230b1b'.\n  (all conflicts fixed: run \"git rebase --continue\")\n\nChanges to be committed:\n  (use \"git restore --staged <file>...\" to unstage)\n    modified:   README.md\n\njpuigcerver@fp:~/git_branques (docs_git_training|REBASE 1/1) $ git rebase --continue --no-edit # (3)!\nSuccessfully rebased and updated refs/heads/docs_git_training.\njpuigcerver@fp:~/git_branques (docs_git_training) $ git lg\n* 8bad4a1 - (3 seconds ago) Documentaci\u00f3 git_training - Joan Puigcerver (HEAD -> docs_git_training)\n* 0230b1b - (3 minutes ago) Documentaci\u00f3 w3schools - Joan Puigcerver (main)\n...\n
    1. Hem eliminat les marques de conflicte i hem combinat els dos textos.
    2. Hem marcat el fitxer README.md com a resolt.
    3. L'opci\u00f3 --no-edit permet continuar el proc\u00e9s de rebase, utilitzant el missatge del commit original.
    ","tags":["conflictes","fast-forward","git branch","git checkout","git merge","git rebase","git switch","HEAD"]},{"location":"apunts/02_branques/#recursos-addicionals","title":"Recursos addicionals","text":"","tags":["conflictes","fast-forward","git branch","git checkout","git merge","git rebase","git switch","HEAD"]},{"location":"apunts/02_branques/#bibliografia","title":"Bibliografia","text":"","tags":["conflictes","fast-forward","git branch","git checkout","git merge","git rebase","git switch","HEAD"]},{"location":"apunts/030_remots/","title":"Bloc 3: Remots","text":"","tags":["git clone","git fetch","git pull","git push","git remote","github","ssh","personal access token","origin","remot","--set-upstream"]},{"location":"apunts/030_remots/#introduccio","title":"Introducci\u00f3","text":"

    En el blocs anteriors, ens hem centrat en con\u00e9ixer la seua estructura i realitzar accions b\u00e0siques per realitzar canvis sobre aquest.

    No obstant aix\u00f2, totes les accions que hem realitzat fins ara han sigut sobre un repositori local, \u00e9s a dir, un repositori que es troba en el nostre dispositiu i aquests canvis no han segut publicats en cap lloc.

    En aquest bloc, ens centrarem en la creaci\u00f3 de repositoris remots; repositoris que es troben allotjats en un servidor, que permeten l'acc\u00e9s a altres usuaris i la col\u00b7laboraci\u00f3 en el desenvolupament de projectes.

    Preparaci\u00f3 repositori local

    En aquest material treballarem sobre un nou repositori local.

    Inicialitzaci\u00f3:

    git init ~/git_remots\ncd ~/git_remots\necho \"# Bloc: Remots\" > README.md\ngit add README.md\ngit commit -m \"README.md: T\u00edtol\"\necho \"Repositori del __Bloc: Remots__ del curs __\\\"Introducci\u00f3 a Git i la seua aplicaci\u00f3 a l\u2019aula\\\"__\" >> README.md\ngit commit -a -m \"README.md: Descripci\u00f3\"\n

    Example

    jpuigcerver@fp:~ $ git init ~/git_remots\nInitialized empty Git repository in /home/jpuigcerver/git_remots/.git/\njpuigcerver@fp:~ $ cd ~/git_remots\njpuigcerver@fp:~/git_remots (main) $ branch -m main # (1)!\njpuigcerver@fp:~/git_remots (main) $ echo \"# Bloc: Remots\" > README.md\njpuigcerver@fp:~/git_remots (main) $ git add README.md\njpuigcerver@fp:~/git_remots (main) $ git commit -m \"README.md: T\u00edtol\"\n[master (root-commit) 0b1b3b4] README.md: T\u00edtol\n 1 file changed, 1 insertion(+)\n create mode 100644 README.md\njpuigcerver@fp:~/git_remots (main) $ echo \"Repositori del __Bloc: Remots__ del curs __\\\"Introducci\u00f3 a Git i la seua aplicaci\u00f3 a l\u2019aula\\\"__\" >> README.md\njpuigcerver@fp:~/git_remots (main) $ git commit -a -m \"README.md: Descripci\u00f3\"\n[master 1b3b4b0] README.md: Descripci\u00f3\n 1 file changed, 1 insertion(+)\njpuigcerver@fp:~/git_remots (main) $ git lg\n* 1b3b4b0 - (2 minutes ago) README.md: Descripci\u00f3 - Joan Puigcerver (HEAD -> main)\n* 0b1b3b4 - (3 minutes ago) README.md: T\u00edtol - Joan Puigcerver\n
    1. Canviem el nom de la branca principal a main.
    ","tags":["git clone","git fetch","git pull","git push","git remote","github","ssh","personal access token","origin","remot","--set-upstream"]},{"location":"apunts/030_remots/#repositori-remot","title":"Repositori remot","text":"

    Un Repositori Remot \u00e9s una c\u00f2pia d'un repositori de Git que es troba allotjat en un servidor o en un altre lloc fora del teu propi sistema local. Aquesta c\u00f2pia cont\u00e9 una r\u00e8plica completa de la hist\u00f2ria del repositori, incloses totes les revisions i les branques. Els repositoris remots permeten la col\u00b7laboraci\u00f3 i el seguiment del desenvolupament del codi entre m\u00faltiples persones, o tu mateix en diferents dispositius.

    Figura 1: Repositori remot vinculat a m\u00faltiples repositoris locals

    Entre les finalitats dels repositoris remots podem trobar:

    Gr\u00e0cies a aquestes caracter\u00edstiques, Git s'ha convertit en una eina clau en qualsevol desenvolupament, per\u00f2 sobretot en els projectes de codi obert (open source), ja que permet la col\u00b7laboraci\u00f3 de desenvolupadors de tot el m\u00f3n en un mateix projecte de manera senzilla i distribu\u00efda.

    ","tags":["git clone","git fetch","git pull","git push","git remote","github","ssh","personal access token","origin","remot","--set-upstream"]},{"location":"apunts/030_remots/#allotjament-de-repositoris-remots","title":"Allotjament de repositoris remots","text":"

    Els repositoris remots es poden allotjar en qualsevol m\u00e0quina o servidor dedicat. No obstant aix\u00f2, hi ha serveis d'allotjament de repositoris remots en l\u00ednia que faciliten la creaci\u00f3 i la gesti\u00f3 de repositoris remots.

    Alguns dels serveis d'allotjament repositoris remots en l\u00ednia m\u00e9s coneguts s\u00f3n:

    Info

    M\u00e9s informaci\u00f3: https://prismic.io/blog/gitlab-vs-github#similarities-between-github-and-gitlab

    ","tags":["git clone","git fetch","git pull","git push","git remote","github","ssh","personal access token","origin","remot","--set-upstream"]},{"location":"apunts/030_remots/#creacio-dun-repositori-remot-a-github","title":"Creaci\u00f3 d'un repositori remot a GitHub","text":"

    En aquesta secci\u00f3, crearem un repositori remot a GitHub.

    1. Crea un compte a GitHub si no en tens un.
    2. Inicia la sessi\u00f3 amb el teu compte.
    3. Fes clic a l'opci\u00f3 \"New\" per crear un nou repositori.
    4. Omple el formulari amb la informaci\u00f3 del teu repositori:
      • Nom del repositori. Ha de ser un nom \u00fanic en el teu compte de GitHub.
      • Descripci\u00f3 del repositori. Opcional.
      • Visibilitat del repositori. Pots triar entre p\u00fablic o privat.
        • P\u00fablic: Qualsevol persona pot veure el teu repositori. Sols les persones autoritzades poden fer canvis.
        • Privat: Nom\u00e9s tu i les persones que tu autoritzes poden veure el teu repositori. Sols les persones autoritzades poden fer canvis.
      • README: Indica si vols afegir un README al teu repositori.
      • .gitignore: Indica si vols afegir un fitxer .gitignore per ignorar fitxers en el teu repositori.
      • Llic\u00e8ncia: Indica si vols afegir una llic\u00e8ncia al teu repositori.

    Exemple

    En aquest material, crearem un repositori amb les seg\u00fcents caracter\u00edstiques:

    Figura 2: Formulari de creaci\u00f3 d'un nou repositori a GitHub

    Una vegada omplert el formulari, fes clic a \"Create repository\" per crear el teu repositori.

    El teu repositori s'hauria de crear buit i hauries de veure una p\u00e0gina com la seg\u00fcent:

    Figura 3: Repositori buit creat a GitHub

    La Figura 3 mostra els passos per enlla\u00e7ar el teu repositori local amb el repositori remot creat a GitHub. En els seg\u00fcents apartats, explicarem aquestes ordres amb m\u00e9s detall.

    ","tags":["git clone","git fetch","git pull","git push","git remote","github","ssh","personal access token","origin","remot","--set-upstream"]},{"location":"apunts/030_remots/#metodes-dautenticacio-a-github","title":"M\u00e8todes d'autenticaci\u00f3 a GitHub","text":"

    Per poder enlla\u00e7ar el teu repositori local amb el repositori remot i fer canvis en aquest, necessites autenticar-te amb el servidor de GitHub.

    GitHub ofereix diferents m\u00e8todes d'autenticaci\u00f3, utilitzant dos protocols diferents:

    Consell

    Per seguretat i reutilitzaci\u00f3, es recomana utilitzar el m\u00e8tode SSH per autenticar-se amb el servidor de GitHub.

    Consulta l'apartat Configuraci\u00f3 de la clau SSH si vols anar directament a aquest m\u00e8tode.

    ","tags":["git clone","git fetch","git pull","git push","git remote","github","ssh","personal access token","origin","remot","--set-upstream"]},{"location":"apunts/030_remots/#token-dacces-personal-pat","title":"Token d'acc\u00e9s personal (PAT)","text":"

    Un Token d'Acc\u00e9s Personal (Personal Access Token o PAT) \u00e9s una clau d'acc\u00e9s que permet autenticar-se amb el servidor de GitHub mitjan\u00e7ant el protocol HTTPS.

    Documentaci\u00f3

    Per crear un token d'acc\u00e9s personal, segueix els seg\u00fcents passos:

    Existeixen dos tipus de tokens d'acc\u00e9s personal:

    Una vegada creat el token, podr\u00e0s utilitzar-lo per autenticar-te amb el servidor de GitHub.

    Important

    Guarda el teu token d'acc\u00e9s personal en un lloc segur.

    No podr\u00e0s veure'l de nou despr\u00e9s de tancar la p\u00e0gina.

    Pots utilitzar el teu token d'acc\u00e9s personal per autenticar-te amb el servidor de GitHub de dues maneres:

    Consell

    Per tal de no haver de recordar el PAT cada vegada, \u00e9s possible configurar Git perqu\u00e8 ho recorde autom\u00e0ticament.

    git config --global credential.helper store\n
    Aquesta comanda guardar\u00e0 les credencials en un fitxer de text en el teu sistema local.

    Danger

    Aquesta opci\u00f3 guarda les credencials en text pla en el fitxer ~/.git-credentials.

    ","tags":["git clone","git fetch","git pull","git push","git remote","github","ssh","personal access token","origin","remot","--set-upstream"]},{"location":"apunts/030_remots/#configuracio-de-la-clau-ssh","title":"Configuraci\u00f3 de la clau SSH","text":"

    Per autenticar-te amb el servidor de GitHub mitjan\u00e7ant el protocol SSH, has de configurar una clau SSH en el teu sistema local i afegir-la al teu compte de GitHub.

    Documentaci\u00f3

    Per generar una clau SSH, segueix els seg\u00fcents passos.

    TerminalInterf\u00edcie gr\u00e0fica

    Despr\u00e9s, configura la clau SSH al teu compte de GitHub seguint els seg\u00fcents passos:

    Important

    Aquesta configuraci\u00f3 s'ha de repetir per cada dispositiu on vulgues autenticar-te amb el servidor de GitHub mitjan\u00e7ant el protocol SSH.

    ","tags":["git clone","git fetch","git pull","git push","git remote","github","ssh","personal access token","origin","remot","--set-upstream"]},{"location":"apunts/030_remots/#configurar-un-repositori-remot-git-remote","title":"Configurar un repositori remot (git remote)","text":"

    El primer pas \u00e9s enlla\u00e7ar el teu Repositori Local amb el Repositori Remot que acabem de crear. Per fer-ho, utilitzarem la comanda git remote.

    La comanda git remote permet gestionar els repositoris remots associats al teu repositori local.

    La sintaxi \u00e9s la seg\u00fcent:

    git remote [add|rename|remove|show] [<options>]\n

    Aquesta comanda permet realitzar les seg\u00fcents accions:

    Cadascuna d'aquestes opcions t\u00e9 les seues pr\u00f2pies opcions i arguments.

    Documentaci\u00f3

    Documentaci\u00f3 oficial de git remote: https://git-scm.com/docs/git-remote

    ","tags":["git clone","git fetch","git pull","git push","git remote","github","ssh","personal access token","origin","remot","--set-upstream"]},{"location":"apunts/030_remots/#afegir-un-repositori-remot","title":"Afegir un repositori remot","text":"

    Per afegir un repositori remot, utilitzarem la comanda git remote add.

    La sintaxi \u00e9s la seg\u00fcent:

    git remote add <nom> <url>\n

    Figura 6: Repositori Local vinculat amb un Repositori Remot

    Warning

    Si intentes publicar amb git push els canvis en un repositori remot sense haver enlla\u00e7at el teu repositori local, Git et mostrar\u00e0 un missatge d'error:

    jpuigcerver@fp:~/git_remots (main) $ git remote # (1)!\njpuigcerver@fp:~/git_remots (main) $ git push\nfatal: No configured push destination.\nEither specify the URL from the command-line or configure a remote repository using\n\n    git remote add <name> <url>\n\nand then push using the remote name\n\n    git push <name>\n

    1. Aquesta ordre no mostra res perqu\u00e8 encara no hi ha configurat cap remot.

    Example

    Enlla\u00e7arem el nostre repositori local amb el repositori remot creat anteriorment a GitHub.

    La URL del repositori remot \u00e9s git@github.com:jpuigcerver/git_remots.git(1).

    jpuigcerver@fp:~/git_remots (main) $ git remote\njpuigcerver@fp:~/git_remots (main) $ git remote add origin git@github.com:jpuigcerver/git_remots.git\njpuigcerver@fp:~/git_remots (main) $ git remote\norigin\njpuigcerver@fp:~/git_remots (main) $ git remote show origin\n* remote origin\n  Fetch URL: git@github.com:jpuigcerver/git_remots.git\n  Push  URL: git@github.com:jpuigcerver/git_remots.git\n  HEAD branch: (unknown)\n
    1. Utilitzem la URL SSH ja que he decidit utilitzar aquest m\u00e8tode d'autenticaci\u00f3.
    ","tags":["git clone","git fetch","git pull","git push","git remote","github","ssh","personal access token","origin","remot","--set-upstream"]},{"location":"apunts/030_remots/#renombrar-un-repositori-remot","title":"Renombrar un repositori remot","text":"

    L'ordre git remote rename permet canviar el nom d'un repositori remot associat al teu repositori local.

    La sintaxi \u00e9s la seg\u00fcent:

    git remote rename <antic> <nou>\n

    ","tags":["git clone","git fetch","git pull","git push","git remote","github","ssh","personal access token","origin","remot","--set-upstream"]},{"location":"apunts/030_remots/#eliminar-un-repositori-remot","title":"Eliminar un repositori remot","text":"

    L'ordre git remote remove permet eliminar un repositori remot associat al teu repositori local.

    La sintaxi \u00e9s la seg\u00fcent:

    git remote remove <nom>\n

    ","tags":["git clone","git fetch","git pull","git push","git remote","github","ssh","personal access token","origin","remot","--set-upstream"]},{"location":"apunts/030_remots/#associacio-entre-branques-locals-i-remotes-git-push-set-upstream","title":"Associaci\u00f3 entre branques locals i remotes (git push --set-upstream)","text":"

    De moment, les branques que hem creat resideixen en el repositori local, \u00e9s a dir, en el nostre dispositiu.

    Podem associar les branques locals a branques remotes, del repositori remot, perqu\u00e8 els canvis que fem localment es puguen veure reflectits en el repositori remot.

    Per fer-ho, utilitzarem la comanda git push amb l'opci\u00f3 -u o --set-upstream.

    git push [-u|--set-upstream] <remot> <branca>\n

    Documentaci\u00f3

    Documentaci\u00f3 oficial de git push: https://git-scm.com/docs/git-push

    Important

    Aquesta comanda funciona sobre la branca on estem situats (HEAD).

    Figura 7: Associaci\u00f3 d'una branca local a una branca remota

    Consell

    Pots configurar git perqu\u00e8 configure autom\u00e0ticament la branca local perqu\u00e8 s'associe amb la branca remota amb el mateix nom amb l'opci\u00f3 push.autoSetupRemote.

    git config --global push.autoSetupRemote true\n

    Associaci\u00f3 branca local i remota

    Vegem que inicialment la branca main no est\u00e0 associada a cap branca remota.

    Si intentem fer un git push, ens mostrar\u00e0 un missatge d'error com que hem d'anar associar una branca remota.

    jpuigcerver@fp:~/git_remots (main) $ git lga\n* b7adb78 - (2 seconds ago) README.md: Descripci\u00f3 - Joan Puigcerver (HEAD -> main)\n* a41ab9e - (2 seconds ago) README.md: T\u00edtol - Joan Puigcerver\njpuigcerver@fp:~/git_remots (main) $ git push\nfatal: The current branch main has no upstream branch.\nTo push the current branch and set the remote as upstream, use\n\n    git push --set-upstream origin main\n\nTo have this happen automatically for branches without a tracking\nupstream, see 'push.autoSetupRemote' in 'git help config'.\n

    Associem les branques main local i remota amb l'ordre git push --set-upstream.

    Localment, s'ha creat la refer\u00e8ncia origin/main que apunta a la branca remota main.

    jpuigcerver@fp:~/git_remots (main) $ git push --set-upstream origin main\nEnumerating objects: 6, done.\nCounting objects: 100% (6/6), done.\nDelta compression using up to 12 threads\nCompressing objects: 100% (3/3), done.\nWriting objects: 100% (6/6), 503 bytes | 503.00 KiB/s, done.\nTotal 6 (delta 1), reused 0 (delta 0), pack-reused 0 (from 0)\nremote: Resolving deltas: 100% (1/1), done.\nTo github.com:jpuigcerver/git_remots.git\n * [new branch]      main -> main\nbranch 'main' set up to track 'origin/main'.\njpuigcerver@fp:~/git_remots (main) $ git lga\n* b7adb78 - (2 seconds ago) README.md: Descripci\u00f3 - Joan Puigcerver (HEAD -> main, origin/main)\n* a41ab9e - (2 seconds ago) README.md: T\u00edtol - Joan Puigcerver\n

    Vegem que els canvis s'han publicat correctament al repositori remot:

    Figura 8: Canvis publicats a GitHub

    ","tags":["git clone","git fetch","git pull","git push","git remote","github","ssh","personal access token","origin","remot","--set-upstream"]},{"location":"apunts/030_remots/#clonacio-dun-repositori-remot-git-clone","title":"Clonaci\u00f3 d'un repositori remot (git clone)","text":"

    L'ordre git clone permet copiar un repositori remot a un repositori local en el teu sistema, des del qual podr\u00e0s realitzar canvis.

    Aquesta ordre c\u00f2pia els continguts del Directori de Treball i tota la informaci\u00f3 del Repositori Local, incloent la hist\u00f2ria de canvis. A m\u00e9s, configura autom\u00e0ticament el repositori remot com a origin.

    La sintaxi \u00e9s la seg\u00fcent:

    git clone <url> [<directori>]\n

    Figura 9: Clonaci\u00f3 d'un repositori remot

    Pau clona el repositori remot

    En aquest exemple, el desenvolupador Pau clonar\u00e0 el repositori remot git_remots sobre el directori ~/git_remots_pau del seu sistema.

    S'ha modificat el prompt per indicar les comandes que executaria Pau.

    pau@fp:~ $ git clone git@github.com:jpuigcerver/git_remots.git ~/git_remots_pau\nCloning into '/home/pau/git_remots_pau'...\nremote: Enumerating objects: 6, done.\nremote: Counting objects: 100% (6/6), done.\nremote: Compressing objects: 100% (2/2), done.\nremote: Total 6 (delta 1), reused 6 (delta 1), pack-reused 0 (from 0)\nReceiving objects: 100% (6/6), done.\nResolving deltas: 100% (1/1), done.\npau@fp:~ $ cd ~/git_remots_pau\npau@fp:~/git_remots_pau (main) $ ls\nREADME.md\npau@fp:~/git_remots_pau (main) $ git lg\n* b7adb78 - (10 minutes ago) README.md: Descripci\u00f3 - Joan Puigcerver (HEAD -> main, origin/main)\n* a41ab9e - (10 minutes ago) README.md: T\u00edtol - Joan Puigcerver\n

    S'observa que s'ha clonat correctament el repositori remot git_remots al directori ~/git_remots_pau, que cont\u00e9 els fitxers i la hist\u00f2ria de canvis del repositori remot.

    ","tags":["git clone","git fetch","git pull","git push","git remote","github","ssh","personal access token","origin","remot","--set-upstream"]},{"location":"apunts/030_remots/#sincronitzacio-entre-repositoris-git-fetch","title":"Sincronitzacio entre repositoris (git fetch)","text":"Preparaci\u00f3: Pau realitza canvis

    Pau crea el fitxer pau.txt amb el contingut Canvi realitzat per Pau.

    pau@fp:~/git_remots_pau (main) $ echo \"Canvi realitzat per Pau\" > pau.txt\npau@fp:~/git_remots_pau (main) $ git status\n    On branch main\nYour branch is up to date with 'origin/main'.\n\nUntracked files:\n  (use \"git add <file>...\" to include in what will be committed)\n    pau.txt\n\nnothing added to commit but untracked files present (use \"git add\" to track)\npau@fp:~/git_remots_pau (main) $ git add pau.txt\npau@fp:~/git_remots_pau (main) $ git commit -m \"pau.txt: Canvi realitzat per Pau\"\n[main 1b3b4b0] pau.txt: Canvi realitzat per Pau\n 1 file changed, 1 insertion(+)\n create mode 100644 pau.txt\npau@fp:~/git_remots_pau (main) $ git lg\n* 1b3b4b0 - (2 minutes ago) pau.txt: Canvi realitzat per Pau - Pau (HEAD -> main)\n* b7adb78 - (10 minutes ago) README.md: Descripci\u00f3 - Joan Puigcerver (origin/main)\n* a41ab9e - (10 minutes ago) README.md: T\u00edtol - Joan Puigcerver\n

    Despr\u00e9s, Pau puja els canvis al repositori remot.

    pau@fp:~/git_remots_pau (main) $ git push\nEnumerating objects: 4, done.\nCounting objects: 100% (4/4), done.\nDelta compression using up to 12 threads\nCompressing objects: 100% (2/2), done.\nWriting objects: 100% (3/3), 303 bytes | 303.00 KiB/s, done.\nTotal 3 (delta 0), reused 0 (delta 0), pack-reused 0\nTo github.com:jpuigcerver/git_remots.git\n   b7adb78..1b3b4b0  main -> main\npau@fp:~/git_remots_pau (main) $ git lg\n* 1b3b4b0 - (2 minutes ago) pau.txt: Canvi realitzat per Pau - Pau (HEAD -> main, origin/main)\n* b7adb78 - (10 minutes ago) README.md: Descripci\u00f3 - Joan Puigcerver\n* a41ab9e - (10 minutes ago) README.md: T\u00edtol - Joan Puigcerver\n

    En aquest moment, Pau ha realitzat un canvi en el repositori remot, que no est\u00e0 reflectit en el nostre repositori local.

    jpuigcerver@fp:~/git_remots (main) $ git lg\n* b7adb78 - (10 minutes ago) README.md: Descripci\u00f3 - Joan Puigcerver (HEAD -> main, origin/main)\n* a41ab9e - (10 minutes ago) README.md: T\u00edtol - Joan Puigcerver\n

    Per sincronitzar l'estat dels repositoris, utilitzarem l'ordre git fetch.

    Figura 10: Sincronitzaci\u00f3 entre repositoris

    Aquesta ordre actualitza la informaci\u00f3 de les branques remotes origin/<branca> al nostre repositori local, per\u00f2 no aplicar\u00e0 els canvis a les nostres branques locals.

    git fetch [<options>] [<remot>]\n

    Documentaci\u00f3

    Documentaci\u00f3 oficial de git fetch: https://git-scm.com/docs/git-fetch

    Info

    Aquesta ordre \u00e9s \u00fatil per obtindre la informaci\u00f3 dels canvis realitzats en el repositori remot i decidir si volem incorporar-los al nostre repositori local.

    git fetch

    Sincronitzem el repositori local amb el repositori remot, que cont\u00e9 els canvis realitzats per Pau.

    jpuigcerver@fp:~/git_remots (main) $ git fetch\nremote: Enumerating objects: 4, done.\nremote: Counting objects: 100% (4/4), done.\nremote: Compressing objects: 100% (2/2), done.\nremote: Total 3 (delta 0), reused 0 (delta 0), pack-reused 0\nUnpacking objects: 100% (3/3), done.\nFrom github.com:jpuigcerver/git_remots\n   b7adb78..1b3b4b0  main     -> origin/main\njpuigcerver@fp:~/git_remots (main) $ git lg\n* 1b3b4b0 - (2 minutes ago) pau.txt: Canvi realitzat per Pau - Pau (origin/main)\n* b7adb78 - (10 minutes ago) README.md: Descripci\u00f3 - Joan Puigcerver (HEAD -> main)\n* a41ab9e - (10 minutes ago) README.md: T\u00edtol - Joan Puigcerver\n

    S'observa que la branca origin/main s'ha actualitzat amb el canvi realitzat per Pau, per\u00f2 la branca main continua en el commit anterior.

    ","tags":["git clone","git fetch","git pull","git push","git remote","github","ssh","personal access token","origin","remot","--set-upstream"]},{"location":"apunts/030_remots/#incorporacio-de-canvis-git-pull","title":"Incorporaci\u00f3 de canvis (git pull)","text":"

    Per incorporar els canvis d'una branca remota a la branca local, utilitzarem l'ordre git pull.

    Aquesta ordre realitza dos accions:

    Figura 11: Incorporaci\u00f3 de canvis
    git pull [<options>] [<remot> [<branca>]]\n

    Documentaci\u00f3

    Documentaci\u00f3 oficial de git pull: https://git-scm.com/docs/git-pull

    Advert\u00e8ncia

    La fusi\u00f3 (merge) implicita de git pull pot ser directa (fast-forward) o es pot produir una fusi\u00f3 de branques divergents si la branca local i la branca remota divergeixen.

    En aquest \u00faltim cas:

    Consell

    Per evitar la fusi\u00f3 de branques divergents en git pull, es pot fer el seg\u00fcent:

    Incorporaci\u00f3 de canvis fusi\u00f3 directa

    Vegem com el commit 1b3b4b0 forma part de la branca remota origin/main, per\u00f2 no de la branca local main.

    jpuigcerver@fp:~/git_remots (main) $ git lg\n* 1b3b4b0 - (2 minutes ago) pau.txt: Canvi realitzat per Pau - Pau (origin/main)\n* b7adb78 - (10 minutes ago) README.md: Descripci\u00f3 - Joan Puigcerver (HEAD -> main)\n* a41ab9e - (10 minutes ago) README.md: T\u00edtol - Joan Puigcerver\njpuigcerver@fp:~/git_remots (main) $ git status\nOn branch main\nYour branch is behind 'origin/main' by 1 commit, and can be fast-forwarded.\n  (use \"git pull\" to update your local branch)\n\nnothing to commit, working tree clean\n

    Incorporem els canvis de la branca remota origin/main a la branca local main.

    jpuigcerver@fp:~/git_remots (main) $ git pull\nUpdating b7adb78..1b3b4b0\nFast-forward\n pau.txt | 1 +\n 1 file changed, 1 insertion(+)\n create mode 100644 pau.txt\njpuigcerver@fp:~/git_remots (main) $ git lg\n* 1b3b4b0 - (2 minutes ago) pau.txt: Canvi realitzat per Pau - Pau (HEAD -> main, origin/main)\n* b7adb78 - (10 minutes ago) README.md: Descripci\u00f3 - Joan Puigcerver\n* a41ab9e - (10 minutes ago) README.md: T\u00edtol - Joan Puigcerver\n

    Incorporaci\u00f3 de canvis canvi de base

    Preparaci\u00f3: M\u00e9s canvis de Pau
    pau@fp:~/git_remots_pau (main) $ echo \"Un altre canvi de Pau\" >> pau.txt\npau@fp:~/git_remots_pau (main) $ git commit -a -m \"pau.txt: Un altre canvi de Pau\"\n[main 2b3b4b0] pau.txt: Un altre canvi de Pau\n 1 file changed, 1 insertion(+)\npau@fp:~/git_remots_pau (main) $ git push\nEnumerating objects: 4, done.\nCounting objects: 100% (4/4), done.\nDelta compression using up to 12 threads\nCompressing objects: 100% (2/2), done.\nWriting objects: 100% (3/3), 303 bytes | 303.00 KiB/s, done.\nTotal 3 (delta 0), reused 0 (delta 0), pack-reused 0\nTo github.com:jpuigcerver/git_remots.git\n   1b3b4b0..2b3b4b0  main -> main\npau@fp:~/git_remots_pau (main) $ git lg\n* 2b3b4b0 - (2 minutes ago) pau.txt: Un altre canvi de Pau - Pau (HEAD -> main, origin/main)\n* 1b3b4b0 - (10 minutes ago) pau.txt: Canvi realitzat per Pau - Pau\n* b7adb78 - (10 minutes ago) README.md: Descripci\u00f3 - Joan Puigcerver\n* a41ab9e - (10 minutes ago) README.md: T\u00edtol - Joan Puigcerver\n

    Una de les situacions m\u00e9s comunes que ens porten a que la branca local divergisca de la branca remota \u00e9s quan realitzem canvis sobre la branca local sense haver sincronitzat abans el seu estat amb la branca remota associada.

    En aquest cas, Pau ha realitzat un altre canvi en el repositori remot, que nosaltrens no hem incorporat.

    No obstant aix\u00f2, anem a fer un canvi a la branca local main, simulant la situaci\u00f3 anteriorment descrita.

    jpuigcerver@fp:~/git_remots (main) $ git lg # (1)!\n* 1b3b4b0 - (2 minutes ago) pau.txt: Canvi realitzat per Pau - Pau (HEAD -> main, origin/main)\n* b7adb78 - (10 minutes ago) README.md: Descripci\u00f3 - Joan Puigcerver\n* a41ab9e - (10 minutes ago) README.md: T\u00edtol - Joan Puigcerver\njpuigcerver@fp:~/git_remots (main) $ echo \"Canvi realitzat per Joan\" >> joan.txt\njpuigcerver@fp:~/git_remots (main) $ git add joan.txt\njpuigcerver@fp:~/git_remots (main) $ git commit -m \"joan.txt: Canvi realitzat per Joan\"\n[main 3b4b0b0] joan.txt: Canvi realitzat per Joan\n 1 file changed, 1 insertion(+)\n create mode 100644 joan.txt\njpuigcerver@fp:~/git_remots (main) $ git lg\n* 3b4b0b0 - (2 minutes ago) joan.txt: Canvi realitzat per Joan - Joan Puigcerver (HEAD -> main)\n* 1b3b4b0 - (10 minutes ago) pau.txt: Canvi realitzat per Pau - Pau (origin/main)\n* b7adb78 - (10 minutes ago) README.md: Descripci\u00f3 - Joan Puigcerver\n* a41ab9e - (10 minutes ago) README.md: T\u00edtol - Joan Puigcerver\n
    1. En aquest moment, el canvi de Pau 2b3b4b0 no est\u00e0 reflectit en el nostre repositori local.

    En aquest moment, podr\u00edem intentar publicar aquest canvi al repositori remot, per\u00f2 ens mostrar\u00e0 un error com que el repositori remot t\u00e9 canvis que no estan reflectits en el nostre repositori local.

    jpuigcerver@fp:~/git_remots (main) $ git push\nTo github.com:jpuigcerver/git_remots.git\n! [rejected]        main -> main (fetch first)\nerror: failed to push some refs to 'github.com:jpuigcerver/git_remots.git'\nhint: Updates were rejected because the remote contains work that you do not\nhint: have locally. This is usually caused by another repository pushing to\nhint: the same ref. If you want to integrate the remote changes, use\nhint: 'git pull' before pushing again.\nhint: See the 'Note about fast-forwards' in 'git push --help' for details.\njpuigcerver@fp:~/git_remots (main) $ git lga\n* 3b4b0b0 - (2 minutes ago) joan.txt: Canvi realitzat per Joan - Joan Puigcerver (HEAD -> main)\n| * 2b3b4b0 - (2 minutes ago) pau.txt: Un altre canvi de Pau - Pau (origin/main)\n|/\n* 1b3b4b0 - (10 minutes ago) pau.txt: Canvi realitzat per Pau - Pau\n* b7adb78 - (10 minutes ago) README.md: Descripci\u00f3 - Joan Puigcerver\n* a41ab9e - (10 minutes ago) README.md: T\u00edtol - Joan Puigcerver\n

    Vegem que l'ordre git push ens recomana fer un git pull per incorporar els canvis, ja que les dues branques han divergit.

    Si executem git pull, es produir\u00e0 una fusi\u00f3 de branques divergents, que crear\u00e0 un commit de fusi\u00f3 i resultar\u00e0 en una hist\u00f2ria no lineal.

    Intentem fer un git pull --ff-only per veure-ho.

    jpuigcerver@fp:~/git_remots (main) $ git pull --ff-only\nhint: Diverging branches can't be fast-forwarded, you need to either:\nhint:\nhint:   git merge --no-ff\nhint:\nhint: or:\nhint:\nhint:   git rebase\nhint:\nhint: Disable this message with \"git config advice.diverging false\"\nfatal: Not possible to fast-forward, aborting.\n

    Si volem conservar una hist\u00f2ria lineal, haurem de fer un canvi de base amb git pull --rebase.

    jpuigcerver@fp:~/git_remots (main) $ git pull --rebase\nSuccessfully rebased and updated refs/heads/main.\njpuigcerver@fp:~/git_remots (main) $ git lga\n* 3b4b0b0 - (2 minutes ago) joan.txt: Canvi realitzat per Joan - Joan Puigcerver (HEAD -> main)\n* 2b3b4b0 - (2 minutes ago) pau.txt: Un altre canvi de Pau - Pau (origin/main)\n* 1b3b4b0 - (10 minutes ago) pau.txt: Canvi realitzat per Pau - Pau\n* b7adb78 - (10 minutes ago) README.md: Descripci\u00f3 - Joan Puigcerver\n* a41ab9e - (10 minutes ago) README.md: T\u00edtol - Joan Puigcerver\n
    ","tags":["git clone","git fetch","git pull","git push","git remote","github","ssh","personal access token","origin","remot","--set-upstream"]},{"location":"apunts/030_remots/#recursos-addicionals","title":"Recursos addicionals","text":"","tags":["git clone","git fetch","git pull","git push","git remote","github","ssh","personal access token","origin","remot","--set-upstream"]},{"location":"apunts/030_remots/#bibliografia","title":"Bibliografia","text":"","tags":["git clone","git fetch","git pull","git push","git remote","github","ssh","personal access token","origin","remot","--set-upstream"]},{"location":"apunts/04_avancat/","title":"Bloc 4: Git avan\u00e7at","text":"","tags":["tag","squash","reset","revert","cherry-pick","stash"]},{"location":"apunts/04_avancat/#git-avancat","title":"Git avan\u00e7at","text":"

    En aquest bloc estudiarem algunes de les comandes avancades de Git que ens permetran realitzar tasques m\u00e9s complexes i espec\u00edfiques en el nostre projecte.

    ","tags":["tag","squash","reset","revert","cherry-pick","stash"]},{"location":"apunts/04_avancat/#etiquetes","title":"Etiquetes","text":"","tags":["tag","squash","reset","revert","cherry-pick","stash"]},{"location":"apunts/04_avancat/#numeracio-de-versions","title":"Numeraci\u00f3 de versions","text":"","tags":["tag","squash","reset","revert","cherry-pick","stash"]},{"location":"apunts/04_avancat/#eliminacio-de-canvis","title":"Eliminaci\u00f3 de canvis","text":"","tags":["tag","squash","reset","revert","cherry-pick","stash"]},{"location":"apunts/04_avancat/#revert","title":"revert","text":"","tags":["tag","squash","reset","revert","cherry-pick","stash"]},{"location":"apunts/04_avancat/#reset","title":"reset","text":"","tags":["tag","squash","reset","revert","cherry-pick","stash"]},{"location":"apunts/04_avancat/#reserva-de-canvis-stash","title":"Reserva de canvis: stash","text":"","tags":["tag","squash","reset","revert","cherry-pick","stash"]},{"location":"apunts/04_avancat/#copia-de-canvis-cherry-pick","title":"C\u00f2pia de canvis: cherry-pick","text":"","tags":["tag","squash","reset","revert","cherry-pick","stash"]},{"location":"apunts/04_avancat/#fusio-de-canvis-en-un-sol-commit-squash","title":"Fusi\u00f3 de canvis en un sol commit: squash","text":"","tags":["tag","squash","reset","revert","cherry-pick","stash"]},{"location":"apunts/050_estrategies_ramificacio/","title":"Bloc 5: Estrat\u00e8gies de ramificaci\u00f3","text":"","tags":["gitflow","develop","feature","release","hotfix"]},{"location":"apunts/050_estrategies_ramificacio/#estrategies-de-ramificacio","title":"Estrat\u00e8gies de ramificaci\u00f3","text":"

    En un projecte de desenvolupament de programari que utilitza Git com a sistema de control de versions, la gesti\u00f3 de les branques \u00e9s important per aconseguir un flux de treball eficient i ordenat.

    Les metodologies de treball amb branques s'anomenen estrat\u00e8gies de ramificaci\u00f3, que son un conjunt de regles i pautes que defineixen com s'han de crear, fusionar i mantindre les branques en un projecte.

    Aquesta part \u00e9s essencial, ja que permet el desenvolupament en paral\u00b7lel de diferents funcionalitats i garanteix la correcta integraci\u00f3 de les diferents parts del projecte.

    Existeixen diverses estrat\u00e8gies de ramificaci\u00f3 per\u00f2, totes, en certa manera, comparteixen els mateixos principis b\u00e0sics:

    Utilitzant aquestes caracter\u00edstiques, es pot adaptar el flux de treball a les necessitats del projecte, on podem decidir quin tipus de branca incorporar en la nostra metodologia de treball.

    Exemple

    En projectes xicotets pot ser no \u00e9s necess\u00e0ria una branca de desenvolupament develop o branques de publicaci\u00f3 release/*.

    A m\u00e9s, les estrat\u00e8gies poden ser utilitzades en combinaci\u00f3 amb altres t\u00e8cniques com les Pull Requests, que veurem en el Bloc 6: Gesti\u00f3 de projectes.

    ","tags":["gitflow","develop","feature","release","hotfix"]},{"location":"apunts/050_estrategies_ramificacio/#branques-amb-un-proposit-unic","title":"Branques amb un prop\u00f2sit \u00fanic","text":"

    Les estrat\u00e8gies de ramificaci\u00f3 m\u00e9s comuns es basen en la creaci\u00f3 de diferents branques, cadascuna amb un prop\u00f2sit concret i una s\u00e8rie de regles per aconseguir una integraci\u00f3 eficient de les funcionalitats:

    ","tags":["gitflow","develop","feature","release","hotfix"]},{"location":"apunts/050_estrategies_ramificacio/#avantatges-i-desavantatges","title":"Avantatges i desavantatges","text":"

    Utilitzar aquest tipus d'estrat\u00e8gies de ramificaci\u00f3 presenta una s\u00e8rie d'avantatges i desavantatges que cal tindre en compte a l'hora de decidir si val la pena utilitzar-les.

    Els avantatges principals s\u00f3n:

    El principal desavantatge \u00e9s:

    A m\u00e9s, \u00e9s important adaptar la metodologia a les necessitats del projecte i no seguir-la de forma estricta si no aporta valor afegit.

    ","tags":["gitflow","develop","feature","release","hotfix"]},{"location":"apunts/050_estrategies_ramificacio/#bones-practiques","title":"Bones pr\u00e0ctiques","text":"

    Per utilitzar les estr\u00e0tegies de ramificaci\u00f3 de forma eficient, \u00e9s important seguir una s\u00e8rie de bones pr\u00e0ctiques que ajudaran a mantrindre l'ordre i la coher\u00e8ncia en el projecte.

    Algunes de les bones pr\u00e0ctiques m\u00e9s importants s\u00f3n:

    ","tags":["gitflow","develop","feature","release","hotfix"]},{"location":"apunts/050_estrategies_ramificacio/#integracio-de-les-funcionalitats","title":"Integraci\u00f3 de les funcionalitats","text":"

    El proc\u00e9s per integrar les funcionalitats a la branca de desenvolupament develop \u00e9s el seg\u00fcent:

    Important

    Segons la t\u00e8cnica d'integraci\u00f3 triada, els punts 3 i 4 poden variar.

    1. Sincronitzar l'estat del repositori local amb el remot amb git fetch.
    2. Actualitzar la branca local develop amb els canvis del remot git pull.

      Tip

      Per evitar possibles conflictes i errors, es recomana configurar git pull perqu\u00e8 sols puga incorporar els canvis de manera directa (fast-forward).

      git config [--global] pull.ff only\n
    3. Actualitzar la branca feature/* amb els nous canvis de develop.

    4. Incorporar els canvis de la branca feature/* amb la branca develop amb la t\u00e8cnica triada.
    5. Publicar els canvis de la branca develop al repositori remot amb git push.

      Danger

      En aquest punt podria passar que mentre has realitzat aquest proc\u00e9s, altres desenvolupadors hagen publicat nous canvis.

      En aquest cas, caldria integrar els canvis de develop amb git pull --rebase.

    6. Eliminar les branques feature/* del repositori local i del remot.

    ","tags":["gitflow","develop","feature","release","hotfix"]},{"location":"apunts/050_estrategies_ramificacio/#fusio-merge-no-ff","title":"Fusi\u00f3 merge -no-ff","text":"

    Gitflow \u00e9s una de les estrat\u00e8gies de ramificaci\u00f3 m\u00e9s conegudes i utilitzades en projectes de desenvolupament de programari.

    Aquesta metodologia es basa en la creaci\u00f3 de les branques main, develop, feature/*, release/* i hotfix/*.

    www.atlassian.com Figura 1: Exemple de branques amb Gitflow

    La particularitat d'aquesta estrat\u00e8gia \u00e9s que la fusi\u00f3 de les branques de funcionalitat feature/* amb la branca de desenvolupament develop \u00e9s realitza mitjan\u00e7ant merge --no-ff, de manera que es conserva la hist\u00f2ria de les branques de funcionalitat que es fusionen mitjan\u00e7ant un commit de fusi\u00f3.

    @TODO: Figura merge --no-ff

    Els avantatges principals s\u00f3n:

    El principal desavantatge \u00e9s:

    ","tags":["gitflow","develop","feature","release","hotfix"]},{"location":"apunts/050_estrategies_ramificacio/#canvi-de-base-rebase","title":"Canvi de base rebase","text":"

    Aquest m\u00e8tode per fusionar les branques de funcionalitat es basa en la utilitzaci\u00f3 del canvi de base rebase.

    @TODO: Figura rebase

    Els avantatges s\u00f3\u00f1:

    El principal desavantatge \u00e9s:

    ","tags":["gitflow","develop","feature","release","hotfix"]},{"location":"apunts/050_estrategies_ramificacio/#fusio-rebase-merge-no-ff","title":"Fusi\u00f3 rebase + merge -no-ff","text":"

    Aquesta opci\u00f3 combina les dues opcions anteriors per tal d'aprofitar els avantatges de cadascuna i a la vegada minimitzar els seus desavantatges.

    Aquest m\u00e8tode es basa en realitzar un canvi de base rebase i despr\u00e9s fusionar la branca de funcionalitat mitjan\u00e7ant un commit de fusi\u00f3 amb merge --no-ff.

    @TODO: Figura rebase + merge --no-ff

    Els avantatges principals s\u00f3n:

    ","tags":["gitflow","develop","feature","release","hotfix"]},{"location":"apunts/050_estrategies_ramificacio/#fusio-merge-squash","title":"Fusi\u00f3 merge --squash","text":"

    Aquesta opci\u00f3 consisteix a fusionar les branques de funcionalitat amb la branca de desenvolupament develop mitjan\u00e7ant merge --squash, de manera que tots els commits de la branca de funcionalitat es fusionen en un \u00fanic commit.

    @TODO: Figura merge --squash

    En el cas que hi hagen conflictes, una bona pr\u00e0ctica \u00e9s integrar els canvis de develop a la branca de funcionalitat i resoldre'ls abans de realitzar la fusi\u00f3.

    Per realitzar aquesta integraci\u00f3 de canvis, es recomana utilitzar git merge. Com que la branca de funcionalitat ser\u00e0 eliminada despr\u00e9s de la fusi\u00f3, no importa si la hist\u00f2ria de la branca de funcionalitat es mant\u00e9 neta o no.

    Info

    Tamb\u00e9 es podria realitzar la fusi\u00f3 amb rebase, per\u00f2 si hi ha molts commits a la branca de funcionalitat, aquesta opci\u00f3 pot ser m\u00e9s complicada ja que podrien sorgir conflictes en cada commit.

    @TODO: Figura merge --no-ff + merge --squash

    Els avantatges principals s\u00f3n:

    El principal desavantatge \u00e9s:

    ","tags":["gitflow","develop","feature","release","hotfix"]},{"location":"apunts/050_estrategies_ramificacio/#branques-de-publicacio","title":"Branques de publicaci\u00f3","text":"

    Les branques de publicaci\u00f3 s\u00f3n branques temporals que s'utilitzen per a preparar la publicaci\u00f3 d'una versi\u00f3.

    Normalment, el prefix de les branques de publicaci\u00f3 \u00e9s release/.

    Aquestes branques es creen a partir de la branca de desenvolupament develop i s'utilitzen per a realitzar tasques com:

    Una vegada acabades aquestes tasques, s'ha fusionar a la branca principal main i a la branca de desenvolupament develop.

    @TODO: Figura branques de publicaci\u00f3

    ","tags":["gitflow","develop","feature","release","hotfix"]},{"location":"apunts/050_estrategies_ramificacio/#branques-de-correccio","title":"Branques de correcci\u00f3","text":"

    Les branques de correcci\u00f3 s\u00f3n branques temporals que s'utilitzen per a corregir errors cr\u00edtics en el codi estable del projecte, quan la seua correcci\u00f3 no pot esperar a la seg\u00fcent versi\u00f3.

    Normalment, el prefix de les branques de correcci\u00f3 \u00e9s hotfix/.

    El flux de treball amb aquestes branques \u00e9s el seg\u00fcent:

    @TODO: Figura branques de correcci\u00f3

    ","tags":["gitflow","develop","feature","release","hotfix"]},{"location":"apunts/050_estrategies_ramificacio/#bibliografia","title":"Bibliografia","text":"","tags":["gitflow","develop","feature","release","hotfix"]},{"location":"apunts/051_exemple_ramificacio/","title":"Exemple 5: Estrat\u00e8gia de ramificaci\u00f3","text":""},{"location":"apunts/051_exemple_ramificacio/#exemple-estrategia-de-ramificacio","title":"Exemple: Estrat\u00e8gia de ramificaci\u00f3","text":"

    En aquest material veurem com es pot utilitzar una estrat\u00e8gia de ramificaci\u00f3 en un projecte de desenvolupament de programari.

    En aquest projecte utilitzarem la t\u00e8cnica d'integraci\u00f3 Fusi\u00f3 merge --squash.

    "},{"location":"apunts/051_exemple_ramificacio/#repositori-remot","title":"Repositori remot","text":"

    Anem a simular un projecte de desenvolupament de programari on tres desenvolupadors treballen en diferents funcionalitats de manera independent.

    Per evitar haver de crear un repositori a GitHub, crearem un repositori remot en la m\u00e0quina local.

    jpuigcerver@fp:~ $ mkdir -p ~/gitflow/remot\njpuigcerver@fp:~ $ cd ~/gitflow/remot\njpuigcerver@fp:~/gitflow/remot $ git init\nInitialized empty Git repository in ~/gitflow/remot/.git/\njpuigcerver@fp:~/gitflow/remot (main) $ git branch -m main\njpuigcerver@fp:~/gitflow/remot (main) $ echo \"# Estrat\u00e8gies de ramificaci\u00f3\" > README.md\njpuigcerver@fp:~/gitflow/remot (main) $ git add README.md\njpuigcerver@fp:~/gitflow/remot (main) $ git commit -m \"Commit inicial\"\n[main (root-commit) a1acfb5] Commit inicial\n 1 file changed, 1 insertion(+)\n create mode 100644 README.md\njpuigcerver@fp:~/gitflow/remot (main) $ git lga\n* a1acfb5 - (0 seconds ago) Commit inicial - Joan Puigcerver (HEAD -> main)\njpuigcerver@fp:~/gitflow/remot (main) $ git config --bool core.bare true # (1)!\n
    1. Aquesta comanda \u00e9s necess\u00e0ria perqu\u00e8 el repositori siga configurat com a bare i puga ser utilitzat com a repositori remot.
    "},{"location":"apunts/051_exemple_ramificacio/#branca-de-desenvolupament","title":"Branca de desenvolupament","text":"

    El primer pas per establir un flux de treball amb Gitflow \u00e9s crear la branca de desenvolupament develop.

    jpuigcerver@fp:~/gitflow/remot (main) $ git branch develop\njpuigcerver@fp:~/gitflow/remot (main) $ git lga\n* a1acfb5 - (0 seconds ago) Commit inicial - Joan Puigcerver (HEAD -> main, develop)\n
    "},{"location":"apunts/051_exemple_ramificacio/#desenvolupament-de-funcionalitats","title":"Desenvolupament de funcionalitats","text":"

    En aquest punt, podem comen\u00e7ar a desenvolupar les diferents funcionalitats del projecte en branques independents.

    Crearem un repositori local per a cada desenvolupador, simulant que cadasc\u00fa treballa en el seu dispositiu.

    jpuigcerver@fp:~/gitflow/remot (main) $ cd ~/gitflow\njpuigcerver@fp:~/gitflow $ git clone remot anna\nCloning into 'anna'...\ndone.\njpuigcerver@fp:~/gitflow $ git clone remot pau\nCloning into 'pau'...\ndone.\njpuigcerver@fp:~/gitflow $ git clone remot mar\nCloning into 'mar'...\ndone.\njpuigcerver@fp:~/gitflow $ git clone remot carles\nCloning into 'carles'...\ndone.\njpuigcerver@fp:~/gitflow $ tree .\n.\n\u251c\u2500\u2500 anna\n\u2502\u00a0\u00a0 \u2514\u2500\u2500 README.md\n\u251c\u2500\u2500 carles\n\u2502\u00a0\u00a0 \u2514\u2500\u2500 README.md\n\u251c\u2500\u2500 mar\n\u2502\u00a0\u00a0 \u2514\u2500\u2500 README.md\n\u251c\u2500\u2500 pau\n\u2502\u00a0\u00a0 \u2514\u2500\u2500 README.md\n\u2514\u2500\u2500 remot\n    \u2514\u2500\u2500 README.md\n\n6 directories, 5 files\n

    Cada desenvolupador comen\u00e7ar\u00e0 a treballar en una nova funcionalitat.

    A partir d'aquest moment, cada desenvolupador treballar\u00e0 en el seu propi repositori, en la seua pr\u00f2pia branca de funcionalitat de manera independent i paral\u00b7lela.

    Important

    \u00c9s important que cada desenvolupador treballe en una \u00fanica 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\u00e0 ben definida i podr\u00e0 ser dividida en diverses funcionalitats m\u00e9s xicotetes.

    "},{"location":"apunts/051_exemple_ramificacio/#branca-featurereadme","title":"Branca feature/readme","text":"

    Anna comen\u00e7ar\u00e0 a treballar en la seua funcionalitat feature/readme en el seu repositori local.

    Nota

    Configurem l'usuari i el correu electr\u00f2nic per a cada repositori local per simular que cada desenvolupador treballa en el seu propi dispositiu.

    Tamb\u00e9 es mostra el nom en el prompt.

    anna@fp:~/gitflow $ cd ~/gitflow/anna\nanna@fp:~/gitflow/anna (main) $ git config user.name \"Anna\"\nanna@fp:~/gitflow/anna (main) $ git config user.email \"anna@fpmislata.com\"\nanna@fp:~/gitflow/anna (main) $ git checkout develop\nbranch 'develop' set up to track 'origin/develop'.\nSwitched to a new branch 'develop'\nanna@fp:~/gitflow/anna (develop) $ git checkout -b feature/readme\nSwitched to a new branch 'feature/readme'\nanna@fp:~/gitflow/anna (feature/readme) $ echo \"Les estrat\u00e8gies de ramificaci\u00f3 proporcionen un\" >> README.md\nanna@fp:~/gitflow/anna (feature/readme) $ echo \"marc de treball organitzat que facilita la col\u00b7laboraci\u00f3\" >> README.md\nanna@fp:~/gitflow/anna (feature/readme) $ echo \"entre diferents desenvolupadors en un mateix projecte\" >> README.md\nanna@fp:~/gitflow/anna (feature/readme) $ git commit -a -m \"README.md: Descripci\u00f3\"\n[feature/readme 651842a] README.md: Descripci\u00f3\n 1 file changed, 3 insertions(+)\nanna@fp:~/gitflow/anna (feature/readme) $ echo \"\" >> README.md\nanna@fp:~/gitflow/anna (feature/readme) $ echo \"La caracter\u00edstica principal \u00e9s la utilitzaci\u00f3\" >> README.md\nanna@fp:~/gitflow/anna (feature/readme) $ echo \"de branques amb un \u00fanic prop\u00f2sit.\" >> README.md\nanna@fp:~/gitflow/anna (feature/readme) $ git commit -a -m \"README.md: Branques prop\u00f2sit \u00fanic\"\n[feature/readme ad0d531] README.md: Branques prop\u00f2sit \u00fanic\n 1 file changed, 3 insertions(+)\nanna@fp:~/gitflow/anna (feature/readme) $ git push\nbranch 'feature/readme' set up to track 'origin/feature/readme'.\nTo ~/gitflow/remot\n * [new branch]      feature/readme -> feature/readme\nanna@fp:~/gitflow/anna (feature/readme) $ git lga\n* ad0d531 - (0 seconds ago) README.md: Branques prop\u00f2sit \u00fanic - Anna (HEAD -> feature/readme, origin/feature/readme)\n* 651842a - (0 seconds ago) README.md: Descripci\u00f3 - Anna\n* a1acfb5 - (0 seconds ago) Commit inicial - Joan Puigcerver (origin/main, origin/develop, origin/HEAD, main, develop)\n

    Els passos seguits per Anna s\u00f3n:

    "},{"location":"apunts/051_exemple_ramificacio/#branca-featurelicense","title":"Branca feature/license","text":"

    Pau comen\u00e7ar\u00e0 a treballar en la seua funcionalitat feature/license en el seu repositori local.

    pau@fp:~/gitflow $ cd ~/gitflow/pau\npau@fp:~/gitflow/pau (main) $ git config user.name \"Pau\"\npau@fp:~/gitflow/pau (main) $ git config user.email \"pau@fpmislata.com\"\npau@fp:~/gitflow/pau (main) $ git checkout develop\nbranch 'develop' set up to track 'origin/develop'.\nSwitched to a new branch 'develop'\npau@fp:~/gitflow/pau (develop) $ git checkout -b feature/license\nSwitched to a new branch 'feature/license'\npau@fp:~/gitflow/pau (feature/license) $ echo \"\" > LICENSE\npau@fp:~/gitflow/pau (feature/license) $ echo \"## Llic\u00e8ncia\" >> LICENSE\npau@fp:~/gitflow/pau (feature/license) $ echo \"CC BY-NC-SA 4.0 DEED - Reconeixement-NoComercial-CompartirIgual 4.0 Internacional\" >> LICENSE\npau@fp:~/gitflow/pau (feature/license) $ git add LICENSE\npau@fp:~/gitflow/pau (feature/license) $ git commit -m \"LICENSE: Afegida llic\u00e8ncia\"\n[feature/license d20ffa3] LICENSE: Afegida llic\u00e8ncia\n 1 file changed, 3 insertions(+)\n create mode 100644 LICENSE\npau@fp:~/gitflow/pau (feature/license) $ echo \"\" >> LICENSE\npau@fp:~/gitflow/pau (feature/license) $ echo \"M\u00e9s informaci\u00f3: https://creativecommons.org/licenses/by-nc-sa/4.0/deed.ca\" >> LICENSE\npau@fp:~/gitflow/pau (feature/license) $ git commit -a -m \"LICENSE: Enlla\u00e7 a la llic\u00e8ncia\"\n[feature/license db2c8a8] LICENSE: Enlla\u00e7 a la llic\u00e8ncia\n 1 file changed, 2 insertions(+)\npau@fp:~/gitflow/pau (feature/license) $ git push\nbranch 'feature/license' set up to track 'origin/feature/license'.\nTo ~/gitflow/remot\n * [new branch]      feature/license -> feature/license\npau@fp:~/gitflow/pau (feature/license) $ git lga\n* db2c8a8 - (0 seconds ago) LICENSE: Enlla\u00e7 a la llic\u00e8ncia - Pau (HEAD -> feature/license, origin/feature/license)\n* d20ffa3 - (0 seconds ago) LICENSE: Afegida llic\u00e8ncia - Pau\n* a1acfb5 - (0 seconds ago) Commit inicial - Joan Puigcerver (origin/main, origin/develop, origin/HEAD, main, develop)\n

    Els passos seguits per Pau s\u00f3n:

    "},{"location":"apunts/051_exemple_ramificacio/#branca-featureauthor","title":"Branca feature/author","text":"

    Mar comen\u00e7ar\u00e0 a treballar en la seua funcionalitat feature/author en el seu repositori local.

    mar@fp:~/gitflow $ cd ~/gitflow/mar\nmar@fp:~/gitflow/mar (main) $ git config user.name \"Mar\"\nmar@fp:~/gitflow/mar (main) $ git config user.email \"mar@fpmislata.com\"\nmar@fp:~/gitflow/mar (main) $ git checkout develop\nbranch 'develop' set up to track 'origin/develop'.\nSwitched to a new branch 'develop'\nmar@fp:~/gitflow/mar (develop) $ git checkout -b feature/author\nSwitched to a new branch 'feature/author'\nmar@fp:~/gitflow/mar (feature/author) $ echo \"\" >> README.md\nmar@fp:~/gitflow/mar (feature/author) $ echo \"## Autors\" >> README.md\nmar@fp:~/gitflow/mar (feature/author) $ git commit -a -m \"README.md: Secci\u00f3 d'autors\"\n[feature/author 0677978] README.md: Secci\u00f3 d'autors\n 1 file changed, 2 insertions(+)\nmar@fp:~/gitflow/mar (feature/author) $ echo \"- Anna (anna@fpmislata.com)\" >> README.md\nmar@fp:~/gitflow/mar (feature/author) $ git commit -a -m \"Autors: Anna\"\n[feature/author cebc3c1] Autors: Anna\n 1 file changed, 1 insertion(+)\nmar@fp:~/gitflow/mar (feature/author) $ echo \"- Pau (pau@fpmislata.com)\" >> README.md\nmar@fp:~/gitflow/mar (feature/author) $ git commit -a -m \"Autors: Pau\"\n[feature/author 32a7bd7] Autors: Pau\n 1 file changed, 1 insertion(+)\nmar@fp:~/gitflow/mar (feature/author) $ echo \"- Mar (mar@fpmislata.com)\" >> README.md\nmar@fp:~/gitflow/mar (feature/author) $ git commit -a -m \"Autors: Mar\"\n[feature/author 3e60c32] Autors: Mar\n 1 file changed, 1 insertion(+)\nmar@fp:~/gitflow/mar (feature/author) $ git push\nbranch 'feature/author' set up to track 'origin/feature/author'.\nTo ~/gitflow/remot\n * [new branch]      feature/author -> feature/author\nmar@fp:~/gitflow/mar (feature/author) $ git lga\n* 3e60c32 - (0 seconds ago) Autors: Mar - Mar (HEAD -> feature/author, origin/feature/author)\n* 32a7bd7 - (0 seconds ago) Autors: Pau - Mar\n* cebc3c1 - (0 seconds ago) Autors: Anna - Mar\n* 0677978 - (0 seconds ago) README.md: Secci\u00f3 d'autors - Mar\n* a1acfb5 - (0 seconds ago) Commit inicial - Joan Puigcerver (origin/main, origin/develop, origin/HEAD, main, develop)\n

    Els passos seguits per Mar s\u00f3n:

    "},{"location":"apunts/051_exemple_ramificacio/#integracio-de-les-funcionalitats","title":"Integraci\u00f3 de les funcionalitats","text":"

    En aquest punt, les tres funcionalitats han sigut desenvolupades de manera independent, i encara no han segut integrades a la branca de desenvolupament develop.

    jpuigcerver@fp:~/gitflow $ cd ~/gitflow/remot\njpuigcerver@fp:~/gitflow/remot (main) $ git lga\n* 3e60c32 - (0 seconds ago) Autors: Mar - Mar (feature/author)\n* 32a7bd7 - (0 seconds ago) Autors: Pau - Mar\n* cebc3c1 - (0 seconds ago) Autors: Anna - Mar\n* 0677978 - (0 seconds ago) README.md: Secci\u00f3 d'autors - Mar\n| * db2c8a8 - (0 seconds ago) LICENSE: Enlla\u00e7 a la llic\u00e8ncia - Pau (feature/license)\n| * d20ffa3 - (0 seconds ago) LICENSE: Afegida llic\u00e8ncia - Pau\n|/  \n| * ad0d531 - (0 seconds ago) README.md: Branques prop\u00f2sit \u00fanic - Anna (feature/readme)\n| * 651842a - (0 seconds ago) README.md: Descripci\u00f3 - Anna\n|/  \n* a1acfb5 - (0 seconds ago) Commit inicial - Joan Puigcerver (HEAD -> main, develop)\n

    Anem a veure com integrar les funcionalitats amb la t\u00e8cnica merge + merge --squash seguint el proc\u00e9s indicat a Integraci\u00f3 de les funcionalitats.

    "},{"location":"apunts/051_exemple_ramificacio/#integraco-de-featurereadme","title":"Integrac\u00f3 de feature/readme","text":"

    Anna ja ha acabat la seua funcionalitat feature/readme i vol integrar-la a la branca develop.

    Els passos que ha de seguir s\u00f3n:

    1. Sincronitzar l'estat del repositori local amb el remot amb git fetch.

      anna@fp:~/gitflow $ cd ~/gitflow/anna\nanna@fp:~/gitflow/anna (feature/readme) $ git fetch\nFrom ~/gitflow/remot\n * [new branch]      feature/author  -> origin/feature/author\n * [new branch]      feature/license -> origin/feature/license\nanna@fp:~/gitflow/anna (feature/readme) $ git lga\n* ad0d531 - (0 seconds ago) README.md: Branques prop\u00f2sit \u00fanic - Anna (HEAD -> feature/readme, origin/feature/readme)\n* 651842a - (0 seconds ago) README.md: Descripci\u00f3 - Anna\n| * 3e60c32 - (0 seconds ago) Autors: Mar - Mar (origin/feature/author)\n| * 32a7bd7 - (0 seconds ago) Autors: Pau - Mar\n| * cebc3c1 - (0 seconds ago) Autors: Anna - Mar\n| * 0677978 - (0 seconds ago) README.md: Secci\u00f3 d'autors - Mar\n|/  \n| * db2c8a8 - (0 seconds ago) LICENSE: Enlla\u00e7 a la llic\u00e8ncia - Pau (origin/feature/license)\n| * d20ffa3 - (0 seconds ago) LICENSE: Afegida llic\u00e8ncia - Pau\n|/  \n* a1acfb5 - (0 seconds ago) Commit inicial - Joan Puigcerver (origin/main, origin/develop, origin/HEAD, main, develop)\n
    2. Actualitzar la branca develop amb els canvis del remot.

      En aquest cas, ja est\u00e0 actualitzada.

      anna@fp:~/gitflow/anna (feature/readme) $ git checkout develop\nYour branch is up to date with 'origin/develop'.\nSwitched to branch 'develop'\nanna@fp:~/gitflow/anna (develop) $ git pull --ff-only\nAlready up to date.\n
    3. Actualitzar la branca feature/readme amb els canvis develop.

      En aquest cas, ja est\u00e0 actualitzada.

      anna@fp:~/gitflow/anna (develop) $ git checkout feature/readme\nYour branch is up to date with 'origin/feature/readme'.\nSwitched to branch 'feature/readme'\nanna@fp:~/gitflow/anna (feature/readme) $ git merge --no-ff --no-edit develop #(1)!\nAlready up to date.\n
      1. L'opci\u00f3 --no-edit evita obrir l'editor de text i deixa el missatge de commit per defecte.
    4. Fusionar la branca feature/readme amb develop.

      anna@fp:~/gitflow/anna (feature/readme) $ git checkout develop\nYour branch is up to date with 'origin/develop'.\nSwitched to branch 'develop'\nanna@fp:~/gitflow/anna (develop) $ git merge --squash feature/readme\nUpdating a1acfb5..ad0d531\nFast-forward\nSquash commit -- not updating HEAD\n README.md | 6 ++++++\n 1 file changed, 6 insertions(+)\nanna@fp:~/gitflow/anna (develop) $ git status\nOn branch develop\nYour branch is up to date with 'origin/develop'.\n\nChanges to be committed:\n  (use \"git restore --staged <file>...\" to unstage)\n    modified:   README.md\n\nanna@fp:~/gitflow/anna (develop) $ git diff --staged\ndiff --git a/README.md b/README.md\nindex 05c1f5b..9e7f142 100644\n--- a/README.md\n+++ b/README.md\n@@ -1 +1,7 @@\n # Estrat\u00e8gies de ramificaci\u00f3\n+Les estrat\u00e8gies de ramificaci\u00f3 proporcionen un\n+marc de treball organitzat que facilita la col\u00b7laboraci\u00f3\n+entre diferents desenvolupadors en un mateix projecte\n+\n+La caracter\u00edstica principal \u00e9s la utilitzaci\u00f3\n+de branques amb un \u00fanic prop\u00f2sit.\nanna@fp:~/gitflow/anna (develop) $ git commit -m \"Merge branch 'feature/readme'\"\n[develop 069239c] Merge branch 'feature/readme'\n 1 file changed, 6 insertions(+)\nanna@fp:~/gitflow/anna (develop) $ git lga\n* 069239c - (0 seconds ago) Merge branch 'feature/readme' - Anna (HEAD -> develop)\n| * ad0d531 - (0 seconds ago) README.md: Branques prop\u00f2sit \u00fanic - Anna (origin/feature/readme, feature/readme)\n| * 651842a - (0 seconds ago) README.md: Descripci\u00f3 - Anna\n|/  \n| * 3e60c32 - (0 seconds ago) Autors: Mar - Mar (origin/feature/author)\n| * 32a7bd7 - (0 seconds ago) Autors: Pau - Mar\n| * cebc3c1 - (0 seconds ago) Autors: Anna - Mar\n| * 0677978 - (0 seconds ago) README.md: Secci\u00f3 d'autors - Mar\n|/  \n| * db2c8a8 - (0 seconds ago) LICENSE: Enlla\u00e7 a la llic\u00e8ncia - Pau (origin/feature/license)\n| * d20ffa3 - (0 seconds ago) LICENSE: Afegida llic\u00e8ncia - Pau\n|/  \n* a1acfb5 - (0 seconds ago) Commit inicial - Joan Puigcerver (origin/main, origin/develop, origin/HEAD, main)\n
    5. Publicar els canvis de la branca develop al repositori remot.

      anna@fp:~/gitflow/anna (develop) $ git push\nTo ~/gitflow/remot\n   a1acfb5..069239c  develop -> develop\nanna@fp:~/gitflow/anna (develop) $ git lga\n* 069239c - (0 seconds ago) Merge branch 'feature/readme' - Anna (HEAD -> develop, origin/develop)\n| * ad0d531 - (0 seconds ago) README.md: Branques prop\u00f2sit \u00fanic - Anna (origin/feature/readme, feature/readme)\n| * 651842a - (0 seconds ago) README.md: Descripci\u00f3 - Anna\n|/  \n| * 3e60c32 - (0 seconds ago) Autors: Mar - Mar (origin/feature/author)\n| * 32a7bd7 - (0 seconds ago) Autors: Pau - Mar\n| * cebc3c1 - (0 seconds ago) Autors: Anna - Mar\n| * 0677978 - (0 seconds ago) README.md: Secci\u00f3 d'autors - Mar\n|/  \n| * db2c8a8 - (0 seconds ago) LICENSE: Enlla\u00e7 a la llic\u00e8ncia - Pau (origin/feature/license)\n| * d20ffa3 - (0 seconds ago) LICENSE: Afegida llic\u00e8ncia - Pau\n|/  \n* a1acfb5 - (0 seconds ago) Commit inicial - Joan Puigcerver (origin/main, origin/HEAD, main)\n
    6. Eliminar la branca feature/readme del repositori local i del remot.

      anna@fp:~/gitflow/anna (develop) $ git branch -D feature/readme\nDeleted branch feature/readme (was ad0d531).\nanna@fp:~/gitflow/anna (develop) $ git push origin --delete feature/readme\nTo ~/gitflow/remot\n - [deleted]         feature/readme\nanna@fp:~/gitflow/anna (develop) $ git lga\n* 069239c - (0 seconds ago) Merge branch 'feature/readme' - Anna (HEAD -> develop, origin/develop)\n| * 3e60c32 - (0 seconds ago) Autors: Mar - Mar (origin/feature/author)\n| * 32a7bd7 - (0 seconds ago) Autors: Pau - Mar\n| * cebc3c1 - (0 seconds ago) Autors: Anna - Mar\n| * 0677978 - (0 seconds ago) README.md: Secci\u00f3 d'autors - Mar\n|/  \n| * db2c8a8 - (0 seconds ago) LICENSE: Enlla\u00e7 a la llic\u00e8ncia - Pau (origin/feature/license)\n| * d20ffa3 - (0 seconds ago) LICENSE: Afegida llic\u00e8ncia - Pau\n|/  \n* a1acfb5 - (0 seconds ago) Commit inicial - Joan Puigcerver (origin/main, origin/HEAD, main)\n

    En aquest punt, la funcionalitat desenvolupada per Anna ha sigut integrada a la branca de desenvolupament develop i pot continuar treballant en altres funcionalitats.

    "},{"location":"apunts/051_exemple_ramificacio/#integracio-de-featurelicense","title":"Integraci\u00f3 de feature/license","text":"

    Pau ja ha acabat la seua funcionalitat feature/license i vol integrar-la a la branca develop.

    Els passos que ha de seguir s\u00f3n:

    1. Sincronitzar l'estat del repositori local amb el remot amb git fetch.

      pau@fp:~/gitflow $ cd ~/gitflow/pau\npau@fp:~/gitflow/pau (feature/license) $ git fetch\nFrom ~/gitflow/remot\n   a1acfb5..069239c  develop        -> origin/develop\n * [new branch]      feature/author -> origin/feature/author\npau@fp:~/gitflow/pau (feature/license) $ git lga\n* db2c8a8 - (0 seconds ago) LICENSE: Enlla\u00e7 a la llic\u00e8ncia - Pau (HEAD -> feature/license, origin/feature/license)\n* d20ffa3 - (0 seconds ago) LICENSE: Afegida llic\u00e8ncia - Pau\n| * 069239c - (0 seconds ago) Merge branch 'feature/readme' - Anna (origin/develop)\n|/  \n| * 3e60c32 - (0 seconds ago) Autors: Mar - Mar (origin/feature/author)\n| * 32a7bd7 - (0 seconds ago) Autors: Pau - Mar\n| * cebc3c1 - (0 seconds ago) Autors: Anna - Mar\n| * 0677978 - (0 seconds ago) README.md: Secci\u00f3 d'autors - Mar\n|/  \n* a1acfb5 - (0 seconds ago) Commit inicial - Joan Puigcerver (origin/main, origin/HEAD, main, develop)\n
    2. Actualitzar la branca develop amb els canvis del remot.

      pau@fp:~/gitflow/pau (feature/license) $ git checkout develop\nYour branch is behind 'origin/develop' by 1 commit, and can be fast-forwarded.\n  (use \"git pull\" to update your local branch)\nSwitched to branch 'develop'\npau@fp:~/gitflow/pau (develop) $ git pull --ff-only\nUpdating a1acfb5..069239c\nFast-forward\n README.md | 6 ++++++\n 1 file changed, 6 insertions(+)\npau@fp:~/gitflow/pau (develop) $ git lga\n* 069239c - (0 seconds ago) Merge branch 'feature/readme' - Anna (HEAD -> develop, origin/develop)\n| * db2c8a8 - (0 seconds ago) LICENSE: Enlla\u00e7 a la llic\u00e8ncia - Pau (origin/feature/license, feature/license)\n| * d20ffa3 - (0 seconds ago) LICENSE: Afegida llic\u00e8ncia - Pau\n|/  \n| * 3e60c32 - (0 seconds ago) Autors: Mar - Mar (origin/feature/author)\n| * 32a7bd7 - (0 seconds ago) Autors: Pau - Mar\n| * cebc3c1 - (0 seconds ago) Autors: Anna - Mar\n| * 0677978 - (0 seconds ago) README.md: Secci\u00f3 d'autors - Mar\n|/  \n* a1acfb5 - (0 seconds ago) Commit inicial - Joan Puigcerver (origin/main, origin/HEAD, main)\n
    3. Actualitzar la branca feature/license amb els canvis develop.

      pau@fp:~/gitflow/pau (develop) $ git checkout feature/license\nYour branch is up to date with 'origin/feature/license'.\nSwitched to branch 'feature/license'\npau@fp:~/gitflow/pau (feature/license) $ git merge --no-ff --no-edit develop # (1)!\nMerge made by the 'ort' strategy.\n README.md | 6 ++++++\n 1 file changed, 6 insertions(+)\npau@fp:~/gitflow/pau (feature/license) $ git lga\n*   cd0d7ee - (0 seconds ago) Merge branch 'develop' into feature/license - Pau (HEAD -> feature/license)\n|\\  \n| * 069239c - (0 seconds ago) Merge branch 'feature/readme' - Anna (origin/develop, develop)\n* | db2c8a8 - (0 seconds ago) LICENSE: Enlla\u00e7 a la llic\u00e8ncia - Pau (origin/feature/license)\n* | d20ffa3 - (0 seconds ago) LICENSE: Afegida llic\u00e8ncia - Pau\n|/  \n| * 3e60c32 - (0 seconds ago) Autors: Mar - Mar (origin/feature/author)\n| * 32a7bd7 - (0 seconds ago) Autors: Pau - Mar\n| * cebc3c1 - (0 seconds ago) Autors: Anna - Mar\n| * 0677978 - (0 seconds ago) README.md: Secci\u00f3 d'autors - Mar\n|/  \n* a1acfb5 - (0 seconds ago) Commit inicial - Joan Puigcerver (origin/main, origin/HEAD, main)\n
      1. L'opci\u00f3 --no-edit evita obrir l'editor de text i deixa el missatge de commit per defecte.
    4. Fusionar la branca feature/license amb develop.

      pau@fp:~/gitflow/pau (feature/license) $ git checkout develop\nYour branch is up to date with 'origin/develop'.\nSwitched to branch 'develop'\npau@fp:~/gitflow/pau (develop) $ git merge --squash feature/license\nUpdating 069239c..cd0d7ee\nFast-forward\nSquash commit -- not updating HEAD\n LICENSE | 5 +++++\n 1 file changed, 5 insertions(+)\n create mode 100644 LICENSE\npau@fp:~/gitflow/pau (develop) $ git status\nOn branch develop\nYour branch is up to date with 'origin/develop'.\n\nChanges to be committed:\n  (use \"git restore --staged <file>...\" to unstage)\n    new file:   LICENSE\n\npau@fp:~/gitflow/pau (develop) $ git diff --staged\ndiff --git a/LICENSE b/LICENSE\nnew file mode 100644\nindex 0000000..809d714\n--- /dev/null\n+++ b/LICENSE\n@@ -0,0 +1,5 @@\n+\n+## Llic\u00e8ncia\n+CC BY-NC-SA 4.0 DEED - Reconeixement-NoComercial-CompartirIgual 4.0 Internacional\n+\n+M\u00e9s informaci\u00f3: https://creativecommons.org/licenses/by-nc-sa/4.0/deed.ca\npau@fp:~/gitflow/pau (develop) $ git commit -m \"Merge branch 'feature/license'\"\n[develop 9ee1217] Merge branch 'feature/license'\n 1 file changed, 5 insertions(+)\n create mode 100644 LICENSE\npau@fp:~/gitflow/pau (develop) $ git lga\n* 9ee1217 - (0 seconds ago) Merge branch 'feature/license' - Pau (HEAD -> develop)\n| *   cd0d7ee - (0 seconds ago) Merge branch 'develop' into feature/license - Pau (feature/license)\n| |\\  \n| |/  \n|/|   \n* | 069239c - (0 seconds ago) Merge branch 'feature/readme' - Anna (origin/develop)\n| * db2c8a8 - (0 seconds ago) LICENSE: Enlla\u00e7 a la llic\u00e8ncia - Pau (origin/feature/license)\n| * d20ffa3 - (0 seconds ago) LICENSE: Afegida llic\u00e8ncia - Pau\n|/  \n| * 3e60c32 - (0 seconds ago) Autors: Mar - Mar (origin/feature/author)\n| * 32a7bd7 - (0 seconds ago) Autors: Pau - Mar\n| * cebc3c1 - (0 seconds ago) Autors: Anna - Mar\n| * 0677978 - (0 seconds ago) README.md: Secci\u00f3 d'autors - Mar\n|/  \n* a1acfb5 - (0 seconds ago) Commit inicial - Joan Puigcerver (origin/main, origin/HEAD, main)\n
    5. Publicar els canvis de la branca develop al repositori remot.

      pau@fp:~/gitflow/pau (develop) $ git push\nTo ~/gitflow/remot\n   069239c..9ee1217  develop -> develop\npau@fp:~/gitflow/pau (develop) $ git lga\n* 9ee1217 - (0 seconds ago) Merge branch 'feature/license' - Pau (HEAD -> develop, origin/develop)\n| *   cd0d7ee - (0 seconds ago) Merge branch 'develop' into feature/license - Pau (feature/license)\n| |\\  \n| |/  \n|/|   \n* | 069239c - (0 seconds ago) Merge branch 'feature/readme' - Anna\n| * db2c8a8 - (0 seconds ago) LICENSE: Enlla\u00e7 a la llic\u00e8ncia - Pau (origin/feature/license)\n| * d20ffa3 - (0 seconds ago) LICENSE: Afegida llic\u00e8ncia - Pau\n|/  \n| * 3e60c32 - (0 seconds ago) Autors: Mar - Mar (origin/feature/author)\n| * 32a7bd7 - (0 seconds ago) Autors: Pau - Mar\n| * cebc3c1 - (0 seconds ago) Autors: Anna - Mar\n| * 0677978 - (0 seconds ago) README.md: Secci\u00f3 d'autors - Mar\n|/  \n* a1acfb5 - (0 seconds ago) Commit inicial - Joan Puigcerver (origin/main, origin/HEAD, main)\n
    6. Eliminar la branca feature/license del repositori local i del remot.

      pau@fp:~/gitflow/pau (develop) $ git branch -D feature/license\nDeleted branch feature/license (was cd0d7ee).\npau@fp:~/gitflow/pau (develop) $ git push origin --delete feature/license\nTo ~/gitflow/remot\n - [deleted]         feature/license\npau@fp:~/gitflow/pau (develop) $ git lga\n* 9ee1217 - (0 seconds ago) Merge branch 'feature/license' - Pau (HEAD -> develop, origin/develop)\n* 069239c - (0 seconds ago) Merge branch 'feature/readme' - Anna\n| * 3e60c32 - (0 seconds ago) Autors: Mar - Mar (origin/feature/author)\n| * 32a7bd7 - (0 seconds ago) Autors: Pau - Mar\n| * cebc3c1 - (0 seconds ago) Autors: Anna - Mar\n| * 0677978 - (0 seconds ago) README.md: Secci\u00f3 d'autors - Mar\n|/  \n* a1acfb5 - (0 seconds ago) Commit inicial - Joan Puigcerver (origin/main, origin/HEAD, main)\n
    "},{"location":"apunts/051_exemple_ramificacio/#integracio-de-featureauthor","title":"Integraci\u00f3 de feature/author","text":"

    Mar ja ha acabat la seua funcionalitat feature/author i vol integrar-la a la branca develop.

    Els passos que ha de seguir s\u00f3n:

    1. Sincronitzar l'estat del repositori local amb el remot amb git fetch.

      mar@fp:~/gitflow $ cd ~/gitflow/mar\nmar@fp:~/gitflow/mar (feature/author) $ git fetch\nFrom ~/gitflow/remot\n   a1acfb5..9ee1217  develop    -> origin/develop\nmar@fp:~/gitflow/mar (feature/author) $ git lga\n* 3e60c32 - (0 seconds ago) Autors: Mar - Mar (HEAD -> feature/author, origin/feature/author)\n* 32a7bd7 - (0 seconds ago) Autors: Pau - Mar\n* cebc3c1 - (0 seconds ago) Autors: Anna - Mar\n* 0677978 - (0 seconds ago) README.md: Secci\u00f3 d'autors - Mar\n| * 9ee1217 - (0 seconds ago) Merge branch 'feature/license' - Pau (origin/develop)\n| * 069239c - (0 seconds ago) Merge branch 'feature/readme' - Anna\n|/  \n* a1acfb5 - (0 seconds ago) Commit inicial - Joan Puigcerver (origin/main, origin/HEAD, main, develop)\n
    2. Actualitzar la branca develop amb els canvis del remot.

      mar@fp:~/gitflow/mar (feature/author) $ git checkout develop\nYour branch is behind 'origin/develop' by 2 commits, and can be fast-forwarded.\n  (use \"git pull\" to update your local branch)\nSwitched to branch 'develop'\nmar@fp:~/gitflow/mar (develop) $ git pull --ff-only\nUpdating a1acfb5..9ee1217\nFast-forward\n LICENSE   | 5 +++++\n README.md | 6 ++++++\n 2 files changed, 11 insertions(+)\n create mode 100644 LICENSE\nmar@fp:~/gitflow/mar (develop) $ git lga\n* 9ee1217 - (0 seconds ago) Merge branch 'feature/license' - Pau (HEAD -> develop, origin/develop)\n* 069239c - (0 seconds ago) Merge branch 'feature/readme' - Anna\n| * 3e60c32 - (0 seconds ago) Autors: Mar - Mar (origin/feature/author, feature/author)\n| * 32a7bd7 - (0 seconds ago) Autors: Pau - Mar\n| * cebc3c1 - (0 seconds ago) Autors: Anna - Mar\n| * 0677978 - (0 seconds ago) README.md: Secci\u00f3 d'autors - Mar\n|/  \n* a1acfb5 - (0 seconds ago) Commit inicial - Joan Puigcerver (origin/main, origin/HEAD, main)\n
    3. Actualitzar la branca feature/author amb els canvis develop.

      Info

      En aquest cas, han sorgit conflictes que hem hagut de solucionar manualment.

      mar@fp:~/gitflow/mar (develop) $ git checkout feature/author\nYour branch is up to date with 'origin/feature/author'.\nSwitched to branch 'feature/author'\nmar@fp:~/gitflow/mar (feature/author) $ git merge --no-ff --no-edit develop # (1)!\nAuto-merging README.md\nCONFLICT (content): Merge conflict in README.md\nAutomatic merge failed; fix conflicts and then commit the result.\nmar@fp:~/gitflow/mar (feature/author) $ vim README.md # (2)!\nmar@fp:~/gitflow/mar (feature/author) $ git add README.md\nmar@fp:~/gitflow/mar (feature/author) $ git commit --no-edit # (1)!\n[feature/author 170a575] Merge branch 'develop' into feature/author\nmar@fp:~/gitflow/mar (feature/author) $ git lga\n*   170a575 - (0 seconds ago) Merge branch 'develop' into feature/author - Mar (HEAD -> feature/author)\n|\\  \n| * 9ee1217 - (1 second ago) Merge branch 'feature/license' - Pau (origin/develop, develop)\n| * 069239c - (1 second ago) Merge branch 'feature/readme' - Anna\n* | 3e60c32 - (1 second ago) Autors: Mar - Mar (origin/feature/author)\n* | 32a7bd7 - (1 second ago) Autors: Pau - Mar\n* | cebc3c1 - (1 second ago) Autors: Anna - Mar\n* | 0677978 - (1 second ago) README.md: Secci\u00f3 d'autors - Mar\n|/  \n* a1acfb5 - (1 second ago) Commit inicial - Joan Puigcerver (origin/main, origin/HEAD, main)\n
      1. L'opci\u00f3 --no-edit evita obrir l'editor de text i deixa el missatge de commit per defecte.
      2. S'han esborrat les marques de conflicte manualment.
    4. Fusionar la branca feature/author amb develop.

      mar@fp:~/gitflow/mar (feature/author) $ git checkout develop\nYour branch is up to date with 'origin/develop'.\nSwitched to branch 'develop'\nmar@fp:~/gitflow/mar (develop) $ git merge --squash feature/author\nUpdating 9ee1217..170a575\nFast-forward\nSquash commit -- not updating HEAD\n README.md | 5 +++++\n 1 file changed, 5 insertions(+)\nmar@fp:~/gitflow/mar (develop) $ git status\nOn branch develop\nYour branch is up to date with 'origin/develop'.\n\nChanges to be committed:\n  (use \"git restore --staged <file>...\" to unstage)\n    modified:   README.md\n\nmar@fp:~/gitflow/mar (develop) $ git diff --staged\ndiff --git a/README.md b/README.md\nindex 9e7f142..416ca41 100644\n--- a/README.md\n+++ b/README.md\n@@ -1,4 +1,9 @@\n # Estrat\u00e8gies de ramificaci\u00f3\n+\n+## Autors\n+- Anna (anna@fpmislata.com)\n+- Pau (pau@fpmislata.com)\n+- Mar (mar@fpmislata.com)\n Les estrat\u00e8gies de ramificaci\u00f3 proporcionen un\n marc de treball organitzat que facilita la col\u00b7laboraci\u00f3\n entre diferents desenvolupadors en un mateix projecte\nmar@fp:~/gitflow/mar (develop) $ git commit -m \"Merge branch 'feature/author'\"\n[develop d528774] Merge branch 'feature/author'\n 1 file changed, 5 insertions(+)\nmar@fp:~/gitflow/mar (develop) $ git lga\n* d528774 - (0 seconds ago) Merge branch 'feature/author' - Mar (HEAD -> develop)\n| *   170a575 - (0 seconds ago) Merge branch 'develop' into feature/author - Mar (feature/author)\n| |\\  \n| |/  \n|/|   \n* | 9ee1217 - (1 second ago) Merge branch 'feature/license' - Pau (origin/develop)\n* | 069239c - (1 second ago) Merge branch 'feature/readme' - Anna\n| * 3e60c32 - (1 second ago) Autors: Mar - Mar (origin/feature/author)\n| * 32a7bd7 - (1 second ago) Autors: Pau - Mar\n| * cebc3c1 - (1 second ago) Autors: Anna - Mar\n| * 0677978 - (1 second ago) README.md: Secci\u00f3 d'autors - Mar\n|/  \n* a1acfb5 - (1 second ago) Commit inicial - Joan Puigcerver (origin/main, origin/HEAD, main)\n
    5. Publicar els canvis de la branca develop al repositori remot.

      mar@fp:~/gitflow/mar (develop) $ git push\nTo ~/gitflow/remot\n   9ee1217..d528774  develop -> develop\nmar@fp:~/gitflow/mar (develop) $ git lga\n* d528774 - (0 seconds ago) Merge branch 'feature/author' - Mar (HEAD -> develop, origin/develop)\n| *   170a575 - (0 seconds ago) Merge branch 'develop' into feature/author - Mar (feature/author)\n| |\\  \n| |/  \n|/|   \n* | 9ee1217 - (1 second ago) Merge branch 'feature/license' - Pau\n* | 069239c - (1 second ago) Merge branch 'feature/readme' - Anna\n| * 3e60c32 - (1 second ago) Autors: Mar - Mar (origin/feature/author)\n| * 32a7bd7 - (1 second ago) Autors: Pau - Mar\n| * cebc3c1 - (1 second ago) Autors: Anna - Mar\n| * 0677978 - (1 second ago) README.md: Secci\u00f3 d'autors - Mar\n|/  \n* a1acfb5 - (1 second ago) Commit inicial - Joan Puigcerver (origin/main, origin/HEAD, main)\n
    6. Eliminar la branca feature/author del repositori local i del remot.

      mar@fp:~/gitflow/mar (develop) $ git branch -D feature/author\nDeleted branch feature/author (was 170a575).\nmar@fp:~/gitflow/mar (develop) $ git push origin --delete feature/author\nTo ~/gitflow/remot\n - [deleted]         feature/author\nmar@fp:~/gitflow/mar (develop) $ git lga\n* d528774 - (0 seconds ago) Merge branch 'feature/author' - Mar (HEAD -> develop, origin/develop)\n* 9ee1217 - (1 second ago) Merge branch 'feature/license' - Pau\n* 069239c - (1 second ago) Merge branch 'feature/readme' - Anna\n* a1acfb5 - (1 second ago) Commit inicial - Joan Puigcerver (origin/main, origin/HEAD, main)\n
    "},{"location":"apunts/051_exemple_ramificacio/#publicacio-de-la-versio-100","title":"Publicaci\u00f3 de la versi\u00f3 1.0.0","text":"

    Anna \u00e9s l'encarregada de preparar la publicaci\u00f3 de la versi\u00f3 1.0.0.

    Els passos que ha de seguir s\u00f3n:

    1. Actualitzar la branca develop amb els canvis del remot.

      \n
    2. Crear la branca de publicaci\u00f3 release/v1.0.0 a partir de la branca develop.

      \n
    3. Realitzar les tasques necess\u00e0ries per a preparar la publicaci\u00f3 de la versi\u00f3 1.0.0.

      \n
    4. Crear i publicar una etiqueta amb la versi\u00f3 1.0.0.

      \n
    5. Integrar aquesta branca a la branca de desenvolupament develop i publicar-la.

      \n
    6. Integrar aquesta branca a la branca principal main i publicar els canvis.

      \n
    7. Eliminar la branca de publicaci\u00f3.

      \n
    "},{"location":"apunts/06_gestio_projectes/","title":"Bloc 6: Gesti\u00f3 de projectes","text":"","tags":["pull requests","github projects","actions","pages","issues"]},{"location":"apunts/06_gestio_projectes/#gestio-de-projectes","title":"Gesti\u00f3 de projectes","text":"","tags":["pull requests","github projects","actions","pages","issues"]},{"location":"apunts/07_educativa/","title":"Bloc 7: GitHub com a plataforma educativa","text":"","tags":["GitHub Classroom","organitzacions"]},{"location":"apunts/07_educativa/#gestio-de-projectes","title":"Gesti\u00f3 de projectes","text":"","tags":["GitHub Classroom","organitzacions"]},{"location":"exercicis/","title":"Exercicis","text":""},{"location":"exercicis/01_introduccio/","title":"Exercici Bloc 1: Introducci\u00f3 a Git","text":""},{"location":"exercicis/01_introduccio/#objectius","title":"Objectius","text":"

    Els objectius d'aquests exercici s\u00f3n:

    "},{"location":"exercicis/01_introduccio/#exercici","title":"Exercici","text":"

    Important

    Comprova l'estat del repositori amb git status despr\u00e9s de cada ordre per entendre els diferents estats dels fitxers.

    1. Crea un directori anomenat bloc1_exercici en la teua carpeta de treball.
    2. Inicialitza un repositori de Git en aquest directori.
    3. Crea un fitxer anomenat llibres.txt i afegeix tres llibres que t'agraden.
    4. Fes un primer commit. Tria un missatge significatiu.
    5. Afegeix un altre llibre a llibres.txt.
    6. Fes un segon commit.
    7. Crea un fitxer anomenat musica.txt i afegeix tres can\u00e7ons que t'agraden.
    8. Crea un fitxer anomenat pelicules.txt i afegeix tres pel\u00b7l\u00edcules que t'agraden.
    9. Fes un tercer commit que sols incloga el fitxer musica.txt.
    10. Crea un fitxer anomenat series.txt i afegeix tres s\u00e8ries que t'agraden.
    11. Fes un quart commit que incloga els fitxers pelicules.txt i series.txt.
    12. Modifica el fitxer llibres.txt per a eliminar un dels llibres.
    13. Fes un cinqu\u00e9 commit.
    14. Modifica el fitxer pelicules.txt per a afegir una pel\u00b7l\u00edcula.
    15. Desf\u00e9s aquest canvi.
    16. Afegeix el fitxer {data}.log amb qualsevol contingut.
      • {data} \u00e9s la data actual en format YYYYMMDD.
    17. Configura el repositori perqu\u00e8 ignore els fitxers amb extensi\u00f3 .log.
    18. Fes un commit amb aquesta configuraci\u00f3.
    19. Crea la carpeta tmp i c\u00f2pia tots els fitxers de text a aquesta carpeta.
    20. Configura el repositori perqu\u00e8 ignore la carpeta tmp.
    21. Fes un commit amb aquesta configuraci\u00f3.
    22. Comprova la hist\u00f2ria de canvis del repositori.
    "},{"location":"exercicis/01_introduccio/#bibliografia","title":"Bibliografia","text":""},{"location":"exercicis/02_branques/","title":"Exercici Bloc 2: Branques","text":""},{"location":"exercicis/02_branques/#objectius","title":"Objectius","text":"

    Els objectius d'aquests exercici s\u00f3n:

    "},{"location":"exercicis/02_branques/#exercici","title":"Exercici","text":""},{"location":"exercicis/02_branques/#inicialitzacio","title":"Inicialitzaci\u00f3","text":"

    Important

    Comprova l'estat del repositori amb git status i git lga (1) despr\u00e9s de cada ordre per entendre els diferents estats dels fitxers.

    1. Revisa Hist\u00f2ric de canvis (git log) per veure la configuraci\u00f3 de l'\u00e0lies git lga.
    1. Crea un directori anomenat bloc2_exercici en la teua carpeta de treball.
    2. Inicialitza un repositori de Git en aquest directori.
    3. Crea un fitxer anomenat llibres.txt i afegeix tres llibres que t'agraden.
    4. Fes un primer commit. Tria un missatge significatiu.
    5. Reanomena la branca principal a main.
    "},{"location":"exercicis/02_branques/#fusio-directa","title":"Fusi\u00f3 directa","text":"
    1. Crea una branca anomenada musica i situa't en aquesta branca.
    2. Crea un fitxer anomenat musica.txt i afegeix tres can\u00e7ons que t'agraden.
    3. Fes un commit en aquesta branca.
    4. Fusiona la branca musica amb la branca main.
    "},{"location":"exercicis/02_branques/#fusio-de-branques-divergents","title":"Fusi\u00f3 de branques divergents","text":"
    1. Des de la branca main, crea les branques mes-llibres i mes-musica.
    2. Des de la branca mes-llibres:
      1. Afegeix un llibre a llibres.txt.
      2. Fes un commit.
    3. Des de la branca mes-musica:

      1. Afegeix una can\u00e7\u00f3 a musica.txt.
      2. Fes un commit.
    4. Fusiona la branca mes-llibres amb la branca main.

    5. Fusiona la branca mes-musica amb la branca main.
    "},{"location":"exercicis/02_branques/#resolucio-de-conflictes-en-la-fusio","title":"Resoluci\u00f3 de conflictes en la fusi\u00f3","text":"
    1. Des de la branca main, crea les branques llibres-ciencia-ficcio i llibres-fantasia.
    2. Des de la branca llibres-ciencia-ficcio:
      1. Afegeix un llibre de ci\u00e8ncia-ficci\u00f3 a llibres.txt.
      2. Fes un commit.
    3. Des de la branca llibres-fantasia:
      1. Afegeix un llibre de fantasia a llibres.txt.
      2. Fes un commit.
    4. Fusiona la branca llibres-ciencia-ficcio amb la branca main.
    5. Fusiona la branca llibres-fantasia amb la branca main.
    "},{"location":"exercicis/02_branques/#eliminacio-duna-branca","title":"Eliminaci\u00f3 d'una branca","text":"
    1. Des de la branca main, crea una branca anomenada series.
    2. Des de la branca main, crea una branca anomenada pelicules.
    3. Des de la branca series:
      1. Afegeix una s\u00e8rie a series.txt.
      2. Fes un commit.
    4. Elimina la branca pelicules.
    5. Elimina la branca series.

    Pregunta

    Qu\u00e8 ha passat amb el commit de la branca series?

    "},{"location":"exercicis/02_branques/#canvi-de-base-duna-branca","title":"Canvi de base d'una branca","text":"
    1. Des de la branca main, crea una branca anomenada series.
    2. Des de la branca main, crea una branca anomenada pelicules.
    3. Des de la branca series:
      1. Afegeix una s\u00e8rie a series.txt.
      2. Fes un commit.
    4. Des de la branca pelicules:
      1. Afegeix una pel\u00b7l\u00edcula a pelicules.txt.
      2. Fes un commit.
    5. Fusiona la branca pelicules amb la branca main.
    6. Canvia la base de la branca series a la branca main.
    7. Fusiona la branca series amb la branca main.

    Info

    Aquest proc\u00e9s \u00e9s el que cal seguir per fusionar branques divergents d'una manera que la hist\u00f2ria siga lineal.

    "},{"location":"exercicis/02_branques/#resolucio-de-conflictes-en-el-canvi-de-base","title":"Resoluci\u00f3 de conflictes en el canvi de base","text":"
    1. Des de la branca main, crea una branca anomenada series-accio i series-drama.
    2. Des de la branca series-accio:
      1. Afegeix una s\u00e8rie d'acci\u00f3 a series.txt.
      2. Fes un commit.
    3. Des de la branca series-drama:
      1. Afegeix una s\u00e8rie de drama a series.txt.
      2. Fes un commit.
    4. Fusiona la branca series-accio amb la branca main.
    5. Canvia la base de la branca series-drama a la branca main.
    6. Fusiona la branca series-drama amb la branca main.
    "},{"location":"exercicis/03_remots/","title":"Exercici Bloc 3: Remots","text":""},{"location":"exercicis/03_remots/#objectius","title":"Objectius","text":"

    Els objectius d'aquests exercici s\u00f3n:

    "},{"location":"exercicis/03_remots/#exercici","title":"Exercici","text":""},{"location":"exercicis/03_remots/#creacio-repositori-remot","title":"Creaci\u00f3 repositori remot","text":"
    1. Crea un compte a GitHub si no en tens un.
    2. Crea un repositori remot anomenat bloc3_exercici completament buit:
      1. No afegisques cap fitxer (README.md, LICENCE, .gitignore, etc.).
    "},{"location":"exercicis/03_remots/#creacio-repositori-local","title":"Creaci\u00f3 repositori local","text":"
    1. Crea un directori anomenat bloc3_exercici en la teua carpeta de treball.
    2. Inicialitza un repositori de Git en aquest directori.
    3. Crea un fitxer anomenat llibres.txt i afegeix tres llibres que t'agraden.
    4. Fes un primer commit.
    5. Reanomena la branca principal a main.
    "},{"location":"exercicis/03_remots/#enllac-amb-repositori-remot","title":"Enlla\u00e7 amb repositori remot","text":"
    1. Configura el repositori local per afegir el repositori remot creat anteriorment com a origin.
    2. Publica la branca main al repositori remot, associant-la a la branca origin/main del repositori remot.

    Consell

    Comprova a GitHub que el repositori remot cont\u00e9 el fitxer llibres.txt.

    "},{"location":"exercicis/03_remots/#clonaclo-del-repositori-remot","title":"Clonacl\u00f3 del repositori remot","text":"
    1. Clona el repositori remot a un directori anomenat bloc3_exercici_clone en la teua carpeta de treball.
    2. Comprova que el directori bloc3_exercici_clone cont\u00e9 el fitxer llibres.txt.
    3. Configura el repositori clonat per realitzar commits amb el seg\u00fcent usuari:
      git config user.name \"Brian\"\ngit config user.email \"brian.cohen@fpmislata.com\"\n
    "},{"location":"exercicis/03_remots/#publicacio-de-canvis","title":"Publicaci\u00f3 de canvis","text":"

    Important

    A partir d'aquest punt treballarem amb els dos repositoris locals: bloc3_exercici i bloc3_exercici_clone.

    Des del repositori bloc3_exercici_clone:

    1. Afegeix la pel\u00b7l\u00edcula La vida de Brian al fitxer pelicules.txt.
    2. Realitza un commit.
    3. Publica la branca main al repositori remot.
    "},{"location":"exercicis/03_remots/#incorporacio-de-canvis-amb-fusio-directa","title":"Incorporaci\u00f3 de canvis amb fusi\u00f3 directa","text":"

    Des del repositori bloc3_exercici:

    1. Sincronitza el repositori local amb el repositori remot amb git fetch.
    2. Observa el log de canvis.
    3. Incorpora els canvis de la branca origin/main a la branca main local.
    "},{"location":"exercicis/03_remots/#incorporacio-de-canvis-amb-fusio-de-branques-divergents","title":"Incorporaci\u00f3 de canvis amb fusi\u00f3 de branques divergents","text":"

    Des del repositori bloc3_exercici:

    1. Afegeix una pel\u00b7l\u00edcula a pelicules.txt.
    2. Realitza un commit.
    3. Publica la branca main al repositori remot.

    Des del repositori bloc3_exercici_clone:

    1. Afegeix la pel\u00b7l\u00edcula Monty Python and the Holy Grail al fitxer pelicules.txt.
    2. Realitza un commit.
    3. Tracta de publicar la branca main al repositori remot.

      Question

      Per qu\u00e8 no pots publicar la branca main al repositori remot?

    4. Incorpora els canvis de la branca origin/main a la branca main local.

    5. Resol els conflictes que puguen apar\u00e9ixer.
    6. Publica la branca main al repositori remot.
    "},{"location":"exercicis/03_remots/#incorporacio-de-canvis-amb-canvi-de-base","title":"Incorporaci\u00f3 de canvis amb canvi de base","text":"

    Des del repositori bloc3_exercici:

    1. Incorpora els canvis de la branca origin/main a la branca main local.
    2. Afegeix una altra pel\u00b7l\u00edcula a pelicules.txt.
    3. Realitza un commit.
    4. Publica la branca main al repositori remot.

    Des del repositori bloc3_exercici_clone:

    1. Sinconitza el repositori local amb el repositori remot (git fetch).
    2. Afegeix la pel\u00b7l\u00edcula El sentido de la vida al fitxer pelicules.txt.
    3. Realitza un commit.
    4. Incorpora els canvis de la branca origin/main a la branca main local amb un canvi de base.
    5. Resol els conflictes que puguen apar\u00e9ixer.
    6. Publica la branca main al repositori remot.
    "},{"location":"exercicis/03_remots/#branques-i-remots","title":"Branques i remots","text":"

    Des del repositori bloc3_exercici:

    1. Incorpora els canvis de la branca origin/main a la branca main local.
    2. Crea una branca anomenada musica.
    3. Afegeix una can\u00e7\u00f3 a musica.txt.
    4. Realitza un commit.
    5. Publica la branca musica al repositori remot.
    6. Comprova que la branca musica est\u00e0 publicada al repositori remot.
    7. Elimina la branca local musica.
    8. Elimina la branca remota musica.
    "},{"location":"exercicis/05_estrategies/","title":"Exercici Bloc 5: Estrat\u00e8gies de ramificaci\u00f3","text":""},{"location":"exercicis/05_estrategies/#objectius","title":"Objectius","text":"

    Els objectius d'aquests exercici s\u00f3n:

    "},{"location":"exercicis/05_estrategies/#exercici","title":"Exercici","text":""},{"location":"exercicis/05_estrategies/#tasca","title":"Tasca","text":""},{"location":"exercicis/05_estrategies/#integracio-amb-merge-no-ff","title":"Integraci\u00f3 amb merge --no-ff","text":""},{"location":"exercicis/05_estrategies/#integracio-amb-rebase","title":"Integraci\u00f3 amb rebase","text":""},{"location":"exercicis/05_estrategies/#integracio-amb-rebase-merge-no-ff","title":"Integraci\u00f3 amb rebase + merge --no-ff","text":""},{"location":"exercicis/05_estrategies/#integracio-amb-merge-squash","title":"Integraci\u00f3 amb merge --squash","text":""},{"location":"videos/","title":"V\u00eddeos i transpar\u00e8ncies","text":""},{"location":"videos/01_introduccio_slides/","title":"Bloc 1: Introducci\u00f3 a Git","text":""},{"location":"videos/01_introduccio_slides/#introduccio-a-git","title":"Introducci\u00f3 a Git","text":""},{"location":"videos/01_introduccio_slides/#introduccio-a-git-i-la-seua-aplicacio-a-laula","title":"Introducci\u00f3 a Git i la seua aplicaci\u00f3 a l\u2019aula","text":""},{"location":"videos/01_introduccio_slides/#que-es-git","title":"Qu\u00e8 \u00e9s Git?","text":"

    Sistema de control de versions lliure i distribu\u00eft.

    https://git-scm.com/

    "},{"location":"videos/01_introduccio_slides/#git-vs-github","title":"Git vs GitHub","text":"

    Git \u00e9s el sistema de control de versions.

    GitHub o GitLab s\u00f3n un servei d'allotjament de repositoris de Git.

    https://github.com https://gitlab.com"},{"location":"videos/01_introduccio_slides/#estructura-dun-repositori","title":"Estructura d'un repositori","text":""},{"location":"videos/01_introduccio_slides/#inicialitzar-un-repositori","title":"Inicialitzar un repositori","text":"
    mkdir git_introduccio\ncd git_introduccio\ngit init\n
    "},{"location":"videos/01_introduccio_slides/#area-de-preparacio","title":"\u00c0rea de preparaci\u00f3","text":"
    git add <files>\n
    "},{"location":"videos/01_introduccio_slides/#confirmar-canvis","title":"Confirmar canvis","text":"
    git commit [-m <message>]\n
    "},{"location":"videos/01_introduccio_slides/#mostrar-commit","title":"Mostrar commit","text":"
    git show [ref]\n
    "},{"location":"videos/01_introduccio_slides/#diferencies","title":"Difer\u00e8ncies","text":"
    git diff [--staged]\n
    "},{"location":"videos/01_introduccio_slides/#historic-de-canvis","title":"Hist\u00f2ric de canvis","text":"
    git log\n

    \u00c0lies:

    git config --global alias.lg \"log --graph --abbrev-commit --decorate --format=format:'%C(bold blue)%h%C(reset) - %C(bold green)(%ar)%C(reset) %C(white)%s%C(reset) %C(dim white)- %an%C(reset)%C(bold yellow)%d%C(reset)'\"\ngit config --global alias.lga \"lg --all\"\n

    "},{"location":"videos/01_introduccio_slides/#descartar-canvis","title":"Descartar canvis","text":"
    git restore <files>\n
    "},{"location":"videos/02_branques_slides/","title":"Bloc 2: Branques","text":""},{"location":"videos/02_branques_slides/#branques","title":"Branques","text":""},{"location":"videos/02_branques_slides/#introduccio-a-git-i-la-seua-aplicacio-a-laula","title":"Introducci\u00f3 a Git i la seua aplicaci\u00f3 a l\u2019aula","text":""},{"location":"videos/02_branques_slides/#branques_1","title":"Branques","text":""},{"location":"videos/02_branques_slides/#canviar-de-branca","title":"Canviar de branca","text":""},{"location":"videos/02_branques_slides/#nous-canvis-en-una-branca","title":"Nous canvis en una branca","text":""},{"location":"videos/02_branques_slides/#fusio-directa-de-branques","title":"Fusi\u00f3 directa de branques","text":"

    Abans

    --

    Despr\u00e9s

    "},{"location":"videos/02_branques_slides/#fusio-de-branques-divergents","title":"Fusi\u00f3 de branques divergents","text":"

    Abans

    --

    Despr\u00e9s

    "},{"location":"videos/02_branques_slides/#resolucio-de-conflictes","title":"Resoluci\u00f3 de conflictes","text":"
    <<<<<<< HEAD\nContingut de la branca actual\n=======\nContingut de la branca a fusionar\n>>>>>>> branca_a_fusionar\n
    "},{"location":"videos/02_branques_slides/#canvi-de-base","title":"Canvi de base","text":"

    Abans

    --

    Despr\u00e9s

    "},{"location":"videos/031_remots_auth_slides/","title":"Bloc 3.1: M\u00e8todes d'autenticaci\u00f3 a GitHub","text":""},{"location":"videos/031_remots_auth_slides/#metodes-dautenticacio-a-github","title":"M\u00e8todes d'autenticaci\u00f3 a GitHub","text":""},{"location":"videos/031_remots_auth_slides/#introduccio-a-git-i-la-seua-aplicacio-a-laula","title":"Introducci\u00f3 a Git i la seua aplicaci\u00f3 a l\u2019aula","text":""},{"location":"videos/031_remots_auth_slides/#repositori-remot","title":"Repositori remot","text":""},{"location":"videos/031_remots_auth_slides/#desenvolupament-distribuit","title":"Desenvolupament distribu\u00eft","text":""},{"location":"videos/031_remots_auth_slides/#metodes-dautenticacio-a-github_1","title":"M\u00e8todes d'autenticaci\u00f3 a GitHub","text":""},{"location":"videos/031_remots_auth_slides/#token-dacces-personal-pat","title":"Token d'acc\u00e9s personal (PAT)","text":"

    Generat desde Settings > Developer settings > Personal access tokens

    git config --global credential.helper store\n
    "},{"location":"videos/031_remots_auth_slides/#clau-ssh","title":"Clau SSH","text":"
    ssh-keygen -t rsa -b 4096\n
    "},{"location":"videos/032_remots_slides/","title":"Bloc 3.2: Remots","text":""},{"location":"videos/032_remots_slides/#remots","title":"Remots","text":""},{"location":"videos/032_remots_slides/#introduccio-a-git-i-la-seua-aplicacio-a-laula","title":"Introducci\u00f3 a Git i la seua aplicaci\u00f3 a l\u2019aula","text":""},{"location":"videos/032_remots_slides/#repositori-remot","title":"Repositori remot","text":""},{"location":"videos/032_remots_slides/#desenvolupament-distribuit","title":"Desenvolupament distribu\u00eft","text":""},{"location":"videos/032_remots_slides/#afegir-un-repositori-remot","title":"Afegir un repositori remot","text":"
    git remote add origin <url>\n
    "},{"location":"videos/032_remots_slides/#associacio-branques-locals-i-remotes","title":"Associaci\u00f3 branques locals i remotes","text":"
    git push [-u | --set-upstream] origin <branca>\n
    "},{"location":"videos/032_remots_slides/#clonar-un-repositori","title":"Clonar un repositori","text":"
    git clone <url> [<directori>]\n
    "},{"location":"videos/032_remots_slides/#sincronitzacio","title":"Sincronitzaci\u00f3","text":"

    git fetch\n

    "},{"location":"videos/032_remots_slides/#integracio-de-canvis","title":"Integraci\u00f3 de canvis","text":"
    git pull [--rebase]\n
    "}]} \ No newline at end of file