Salta el contingut
 

Branques

Joan Puigcerver Ibáñez

Llicència: CC BY-NC-SA 4.0

(Reconeixement - NoComercial - CompartirIgual) 🅭

Introducció

Les branques són una de les característiques més importants de Git, ja que permeten desenvolupar un projecte de manera col·laborativa i en paral·lel.

Moltes de les estratègies de treball amb Git es basen a fer els canvis en branques independents que, una vegada acabades, s'integren en la branca principal. Aquesta branca s'anomena main (o master en repositoris més antics), tal com s'explica en l'apartat Inicialització d'un repositori.

Preparació del repositori d'exemple

En aquests apunts es treballa sobre un nou repositori local, que s'inicialitza amb les ordres següents:

#!/bin/bash

# Elimina el repositori si existeix
if [ -d ~/git_branques ]; then
    rm -rf ~/git_branques
fi

mkdir -p ~/git_branques
cd ~/git_branques
git init
git branch -m main # (1)!
echo "# Branques a Git" > README.md
git add README.md
git commit -m "Commit inicial"
git lga
  1. Es canvia el nom de la branca principal a main.
jpuigcerver@fp:~ $ mkdir -p ~/git_branques
jpuigcerver@fp:~ $ cd ~/git_branques
jpuigcerver@fp:~/git_branques $ git init
Initialized empty Git repository in ~/git_branques/.git/
jpuigcerver@fp:~/git_branques (main) $ git branch -m main # (1)!
jpuigcerver@fp:~/git_branques (main) $ echo "# Branques a Git" > README.md
jpuigcerver@fp:~/git_branques (main) $ git add README.md
jpuigcerver@fp:~/git_branques (main) $ git commit -m "Commit inicial"
[main (root-commit) ec4c927] Commit inicial
 1 file changed, 1 insertion(+)
 create mode 100644 README.md
jpuigcerver@fp:~/git_branques (main) $ git lga
* ec4c927 - (0 seconds ago) Commit inicial - Joan Puigcerver (HEAD -> main)
  1. Es canvia el nom de la branca principal a main.

Crea el nou repositori en una carpeta independent per evitar problemes amb els exemples i exercicis anteriors.

Branques

Una branca és una línia de desenvolupament independent. En Git, una branca és simplement un punter a un commit, que avança a mesura que s'hi fan nous commits.

Estructura de branques inicial Estructura de branques inicial

Figura 1. Estructura de branques inicial.

Exemple: Estructura de branques inicial

L'estructura de branques inicial del repositori d'aquests apunts és la que mostra la Figura 1.

jpuigcerver@fp:~/git_branques (main) $ git lga
* ec4c927 - (0 seconds ago) Commit inicial - Joan Puigcerver (HEAD -> main)

S'observa que hi ha un únic commit, on està situada l'única branca, anomenada main.

A més, HEAD apunta a la branca main. Això indica que és la branca activa i que el Directori de treball es troba en aquest estat. El HEAD es tracta amb més detall en l'apartat Canviar de branca.

L'ordre git branch permet consultar i manipular les branques d'un repositori.

Documentació oficial: git branch – Git

Mostrar les branques

Per a mostrar les branques d'un repositori, s'utilitza l'ordre git branch sense cap opció o amb l'opció --list:

git branch [--list] [-a | --all] [-v | --verbose]
  • [--list]: (opcional) mostra les branques. És el comportament per defecte.
  • [-a | --all]: (opcional) mostra totes les branques, incloses les remotes, que es presenten en els apunts de Remots.
  • [-v | --verbose]: (opcional) mostra més informació de cada branca.
Exemple: Mostrar les branques

Es mostren les branques del repositori.

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

S'observa que només hi ha una branca, anomenada main. L'ordre marca amb un * la branca activa, és a dir, on es troba el HEAD.

Crear una branca

Per a crear una branca nova, s'utilitza l'ordre:

git branch [-f | --force] <nom> [<ref>]
  • [-f | --force]: (opcional) força la creació de la branca, encara que ja n'existisca una amb el mateix nom.
  • <nom>: nom de la branca nova.
  • [<ref>]: (opcional) referència on es crea la branca nova. Si no s'especifica, es crea en el commit actual, on es troba el HEAD.

Si ja existeix una branca amb el mateix nom i no s'utilitza l'opció -f o --force, l'ordre mostra un error i no crea la branca.

Exemple: Creació de les branques menjar, beguda i neteja

Es creen les branques menjar, beguda i neteja, on es faran canvis relacionats amb una llista de la compra.

jpuigcerver@fp:~/git_branques (main) $ git lga
* ec4c927 - (0 seconds ago) Commit inicial - Joan Puigcerver (HEAD -> main)
jpuigcerver@fp:~/git_branques (main) $ git branch menjar
jpuigcerver@fp:~/git_branques (main) $ git branch beguda
jpuigcerver@fp:~/git_branques (main) $ git branch neteja
jpuigcerver@fp:~/git_branques (main) $ git branch
  beguda
* main
  menjar
  neteja
jpuigcerver@fp:~/git_branques (main) $ git lga
* ec4c927 - (0 seconds ago) Commit inicial - Joan Puigcerver (HEAD -> main, neteja, menjar, beguda)

S'observa que les branques s'han creat en el mateix commit on es trobava el HEAD. No obstant això, la branca activa (HEAD) continua sent main.

Estructura de branques després de crear les branques Estructura de branques després de crear les branques

Figura 2. Estructura de branques després de crear les branques menjar, beguda i neteja.

Canviar de branca

Canviar de branca significa moure el punter HEAD a la branca desitjada. A més, el contingut del Directori de treball passa a l'estat del commit al qual apunta la branca.

Hi ha dues ordres per a canviar de branca, cadascuna amb la seua sintaxi i opcions:

git checkout <nom>
git switch <nom>
  • <nom>: nom de la branca a la qual es vol canviar.

Documentació oficial de Git

Originalment, s'utilitzava l'ordre git checkout per a canviar de branca.

No obstant això, com que aquesta ordre té moltes altres funcions, a partir de la versió 2.23 de Git es va introduir l'ordre git switch per a evitar confusions1.

La Figura 2 mostra l'estat del repositori quan el HEAD apunta a la branca main i la Figura 3, l'estat després de canviar a la branca menjar.

Exemple: Canviar a la branca menjar

L'estat del repositori abans de canviar a la branca menjar és el següent:

jpuigcerver@fp:~/git_branques (main) $ cat README.md
# Branques a Git
jpuigcerver@fp:~/git_branques (main) $ git branch
  beguda
* main
  menjar
  neteja
jpuigcerver@fp:~/git_branques (main) $ git lga
* ec4c927 - (0 seconds ago) Commit inicial - Joan Puigcerver (HEAD -> main, neteja, menjar, beguda)

A continuació, es canvia a la branca menjar:

jpuigcerver@fp:~/git_branques (main) $ git checkout menjar
Switched to branch 'menjar'
jpuigcerver@fp:~/git_branques (menjar) $ cat README.md
# Branques a Git
jpuigcerver@fp:~/git_branques (menjar) $ git branch
  beguda
  main
* menjar
  neteja
jpuigcerver@fp:~/git_branques (menjar) $ git lga
* ec4c927 - (0 seconds ago) Commit inicial - Joan Puigcerver (HEAD -> menjar, neteja, main, beguda)

S'observa que HEAD s'ha desplaçat a la branca menjar. No obstant això, el contingut del repositori és el mateix, ja que les dues branques apunten al mateix commit.

Estructura de branques després de canviar a la branca menjar Estructura de branques després de canviar a la branca menjar

Figura 3. Estructura de branques després de canviar a la branca menjar.

Canvis en una branca

Per a fer canvis en una branca, cal seguir aquests passos:

  1. Situar-se en la branca on es vol fer el canvi (git checkout o git switch).
  2. Fer els canvis desitjats.
  3. Confirmar els canvis amb git commit.

Quan es fa un commit en una branca, el punter de la branca actual (HEAD) avança al nou commit.

Exemple: Canvis en la branca menjar

S'afigen dos productes al fitxer menjar.txt en la branca menjar.

jpuigcerver@fp:~/git_branques (menjar) $ echo "Pa" >> menjar.txt
jpuigcerver@fp:~/git_branques (menjar) $ echo "Macarrons" >> menjar.txt
jpuigcerver@fp:~/git_branques (menjar) $ git status
On branch menjar
Untracked files:
  (use "git add <file>..." to include in what will be committed)
    menjar.txt

nothing added to commit but untracked files present (use "git add" to track)
jpuigcerver@fp:~/git_branques (menjar) $ git add menjar.txt
jpuigcerver@fp:~/git_branques (menjar) $ git commit -m "Menjar"
[menjar a7ef672] Menjar
 1 file changed, 2 insertions(+)
 create mode 100644 menjar.txt
jpuigcerver@fp:~/git_branques (menjar) $ git lga
* a7ef672 - (0 seconds ago) Menjar - Joan Puigcerver (HEAD -> menjar)
* ec4c927 - (0 seconds ago) Commit inicial - Joan Puigcerver (neteja, main, beguda)

S'observa que la branca menjar i el HEAD han avançat al nou commit, mentre que les altres branques continuen apuntant al commit anterior.

Estructura de branques després de fer un commit en la branca menjar Estructura de branques després de fer un commit en la branca menjar

Figura 4. Estructura de branques després de fer un commit en la branca menjar.

Exemple: Canvis en la branca beguda

S'afigen dos productes al fitxer beguda.txt en la branca beguda.

jpuigcerver@fp:~/git_branques (menjar) $ git checkout beguda
Switched to branch 'beguda'
jpuigcerver@fp:~/git_branques (beguda) $ echo "Aigua" >> beguda.txt
jpuigcerver@fp:~/git_branques (beguda) $ echo "Orxata" >> beguda.txt
jpuigcerver@fp:~/git_branques (beguda) $ git status
On branch beguda
Untracked files:
  (use "git add <file>..." to include in what will be committed)
    beguda.txt

nothing added to commit but untracked files present (use "git add" to track)
jpuigcerver@fp:~/git_branques (beguda) $ git add beguda.txt
jpuigcerver@fp:~/git_branques (beguda) $ git commit -m "Beguda"
[beguda 7540d67] Beguda
 1 file changed, 2 insertions(+)
 create mode 100644 beguda.txt
jpuigcerver@fp:~/git_branques (beguda) $ git lga
* 7540d67 - (0 seconds ago) Beguda - Joan Puigcerver (HEAD -> beguda)
| * a7ef672 - (0 seconds ago) Menjar - Joan Puigcerver (menjar)
|/  
* ec4c927 - (0 seconds ago) Commit inicial - Joan Puigcerver (neteja, main)

S'observa que la branca beguda i el HEAD han avançat al nou commit.

Estructura de branques després de fer un commit en la branca beguda Estructura de branques després de fer un commit en la branca beguda

Figura 5. Estructura de branques després de fer un commit en la branca beguda.

Exemple: Canvis en la branca neteja

S'afigen dos productes al fitxer neteja.txt en la branca neteja.

jpuigcerver@fp:~/git_branques (beguda) $ git checkout neteja
Switched to branch 'neteja'
jpuigcerver@fp:~/git_branques (neteja) $ echo "Paper higiènic" >> neteja.txt
jpuigcerver@fp:~/git_branques (neteja) $ echo "Fregall" >> neteja.txt
jpuigcerver@fp:~/git_branques (neteja) $ git status
On branch neteja
Untracked files:
  (use "git add <file>..." to include in what will be committed)
    neteja.txt

nothing added to commit but untracked files present (use "git add" to track)
jpuigcerver@fp:~/git_branques (neteja) $ git add neteja.txt
jpuigcerver@fp:~/git_branques (neteja) $ git commit -m "Neteja"
[neteja 06d7d94] Neteja
 1 file changed, 2 insertions(+)
 create mode 100644 neteja.txt
jpuigcerver@fp:~/git_branques (neteja) $ git lga
* 7540d67 - (0 seconds ago) Beguda - Joan Puigcerver (beguda)
| * a7ef672 - (0 seconds ago) Menjar - Joan Puigcerver (menjar)
|/  
| * 06d7d94 - (0 seconds ago) Neteja - Joan Puigcerver (HEAD -> neteja)
|/  
* ec4c927 - (0 seconds ago) Commit inicial - Joan Puigcerver (main)

S'observa que la branca neteja i el HEAD han avançat al nou commit.

Estructura de branques després de fer un commit en la branca neteja Estructura de branques després de fer un commit en la branca neteja

Figura 6. Estructura de branques després de fer un commit en la branca neteja.

Reanomenar una branca

Per a reanomenar la branca actual, s'utilitza l'ordre:

git branch -m <nou_nom>
  • -m o --move: reanomena la branca actual, on es troba el HEAD.
  • <nou_nom>: nom nou de la branca.
Exemple: Reanomenar la branca principal

En la preparació del repositori s'ha utilitzat aquesta ordre per a canviar el nom de la branca principal de master a main.

git branch -m main

Eliminar una branca

Per a eliminar una branca, s'utilitza l'ordre:

git branch -d [-f | --force] <nom>
git branch -D <nom>
  • -d o --delete: elimina la branca.
  • [-f | --force]: (opcional) força l'eliminació de la branca.
  • -D: abreviatura de --delete --force.
  • <nom>: nom de la branca que es vol eliminar.

Eliminar una branca pot provocar la pèrdua de commits.

Quan un commit perd totes les referències que permeten accedir-hi, es diu que és un commit orfe, i el recol·lector de fem (garbage collector) de Git l'eliminarà.

Per evitar-ho, si l'eliminació deixa commits orfes, Git mostra un error i no elimina la branca, tret que s'utilitze l'opció -D o --delete --force.

Exemple: Eliminació de la branca neteja

S'intenta eliminar la branca neteja amb l'opció -d. Com que els seus canvis no s'han fusionat, eliminar la branca provocaria la pèrdua dels commits realitzats. Per tant, per a esborrar-la cal utilitzar l'opció -D.

jpuigcerver@fp:~/git_branques (neteja) $ git checkout main
Switched to branch 'main'
jpuigcerver@fp:~/git_branques (main) $ git lga
* 7540d67 - (0 seconds ago) Beguda - Joan Puigcerver (beguda)
| * a7ef672 - (0 seconds ago) Menjar - Joan Puigcerver (menjar)
|/  
| * 06d7d94 - (0 seconds ago) Neteja - Joan Puigcerver (neteja)
|/  
* ec4c927 - (0 seconds ago) Commit inicial - Joan Puigcerver (HEAD -> main)
jpuigcerver@fp:~/git_branques (main) $ git branch -d neteja
error: the branch 'neteja' is not fully merged
hint: If you are sure you want to delete it, run 'git branch -D neteja'
hint: Disable this message with "git config advice.forceDeleteBranch false"
jpuigcerver@fp:~/git_branques (main) $ git branch -D neteja
Deleted branch neteja (was 06d7d94).
jpuigcerver@fp:~/git_branques (main) $ git lga
* 7540d67 - (0 seconds ago) Beguda - Joan Puigcerver (beguda)
| * a7ef672 - (0 seconds ago) Menjar - Joan Puigcerver (menjar)
|/  
* ec4c927 - (0 seconds ago) Commit inicial - Joan Puigcerver (HEAD -> main)

S'observa que la branca neteja s'ha eliminat i, per tant, el commit Productes de neteja s'ha convertit en un commit orfe que el recol·lector de fem de Git eliminarà.

Estructura de branques després d'eliminar la branca neteja Estructura de branques després d'eliminar la branca neteja

Figura 7. Estructura de branques després d'eliminar la branca neteja.

Fusió de branques (git merge)

La fusió de branques (merge) és el procés de combinar els canvis d'una branca en una altra. Aquest procés es fa amb l'ordre:

git merge <branca>
  • <branca>: nom de la branca que es vol fusionar amb la branca actual.

La fusió de branques sempre incorpora els canvis de la branca indicada sobre la branca actual (on es troba el HEAD).

Segons l'estructura de les branques, la fusió pot ser directa (fast-forward) o mitjançant un commit de fusió (merge commit).

Fusió directa

La fusió directa (fast-forward) es produeix quan la branca actual (HEAD) no té cap commit nou des que es va crear la branca que es vol fusionar. És a dir, la branca actual està darrere de la branca que es vol fusionar i la història és lineal.

Estructura de branques abans de la fusió directa Estructura de branques abans de la fusió directa

Figura 8. Estructura de branques abans de la fusió directa.

Aquesta fusió consisteix a avançar el punter de la branca actual (HEAD) fins on es troba la branca que es vol fusionar.

Estructura de branques després de la fusió directa Estructura de branques després de la fusió directa

Figura 9. Estructura de branques després de la fusió directa de la branca menjar en la branca main.

La fusió directa és la manera més senzilla i neta de fusionar branques, ja que no crea cap commit addicional i manté una història lineal i fàcil de seguir.

Per a assegurar que la fusió és directa, es pot utilitzar l'opció --ff-only.

Si la fusió no pot ser directa, Git mostra un error i no la fa. També es pot configurar Git perquè només faça fusions directes:

git config --global merge.ff only
Exemple: Fusió directa de la branca menjar en la branca main

Partint de la situació de la Figura 8, on la branca menjar té un commit més que la branca main, la fusió de menjar en main és una fusió directa.

jpuigcerver@fp:~/git_branques (main) $ git checkout main
Already on 'main'
jpuigcerver@fp:~/git_branques (main) $ ls
README.md
jpuigcerver@fp:~/git_branques (main) $ git lga
* 7540d67 - (0 seconds ago) Beguda - Joan Puigcerver (beguda)
| * a7ef672 - (0 seconds ago) Menjar - Joan Puigcerver (menjar)
|/  
* ec4c927 - (0 seconds ago) Commit inicial - Joan Puigcerver (HEAD -> main)

En aquest cas, la fusió avança el punter de la branca main fins on es troba la branca menjar, tal com mostra la Figura 9.

jpuigcerver@fp:~/git_branques (main) $ git checkout main
Already on 'main'
jpuigcerver@fp:~/git_branques (main) $ git merge menjar
Updating ec4c927..a7ef672
Fast-forward
 menjar.txt | 2 ++
 1 file changed, 2 insertions(+)
 create mode 100644 menjar.txt
jpuigcerver@fp:~/git_branques (main) $ ls # (1)!
menjar.txt
README.md
jpuigcerver@fp:~/git_branques (main) $ cat menjar.txt
Pa
Macarrons
jpuigcerver@fp:~/git_branques (main) $ git lga
* 7540d67 - (0 seconds ago) Beguda - Joan Puigcerver (beguda)
| * a7ef672 - (0 seconds ago) Menjar - Joan Puigcerver (HEAD -> main, menjar)
|/  
* ec4c927 - (0 seconds ago) Commit inicial - Joan Puigcerver
  1. S'observa que s'ha incorporat el fitxer menjar.txt amb els canvis de la branca menjar.

Fusió de branques divergents

No sempre és possible fer una fusió directa (fast-forward). Pot ocórrer que les dues branques hagen divergit, és a dir, que cada branca tinga canvis que no estan presents en l'altra.

Història abans de la fusió de branques divergents Història abans de la fusió de branques divergents

Figura 10. Estructura de branques abans de la fusió de branques divergents.

En aquest cas, la fusió es fa mitjançant un commit de fusió (merge commit), un commit que té dos pares, un per cada branca que es fusiona, i que incorpora els canvis de totes dues.

Història després de la fusió de branques divergents Història després de la fusió de branques divergents

Figura 11. Estructura de branques després de la fusió de la branca divergent beguda en la branca main.

Com qualsevol altre commit, el commit de fusió necessita un missatge, que es pot indicar amb l'opció -m. Si no se n'especifica cap, s'obri l'editor de text configurat per defecte (vegeu Confirmar canvis (git commit)).

Aquest tipus de fusió no és tan neta com la fusió directa (fast-forward), ja que la història del projecte es torna més complexa i no lineal.

Per a forçar que la fusió es faça amb un commit de fusió, es pot utilitzar l'opció --no-ff.

També es pot configurar Git perquè sempre utilitze aquesta opció:

git config --global merge.ff no
Exemple: Fusió de la branca divergent beguda en la branca main

Es parteix de la situació de la Figura 10, on la branca beguda ha divergit de la branca main.

jpuigcerver@fp:~/git_branques (main) $ git checkout main
Already on 'main'
jpuigcerver@fp:~/git_branques (main) $ ls
menjar.txt
README.md
jpuigcerver@fp:~/git_branques (main) $ git lga
* 7540d67 - (0 seconds ago) Beguda - Joan Puigcerver (beguda)
| * a7ef672 - (0 seconds ago) Menjar - Joan Puigcerver (HEAD -> main, menjar)
|/  
* ec4c927 - (0 seconds ago) Commit inicial - Joan Puigcerver

A continuació, es fusiona la branca beguda en la branca main.

jpuigcerver@fp:~/git_branques (main) $ git checkout main
Already on 'main'
jpuigcerver@fp:~/git_branques (main) $ git merge beguda --no-ff -m "Merge branch 'beguda' into 'main'" # (1)!
Merge made by the 'ort' strategy.
 beguda.txt | 2 ++
 1 file changed, 2 insertions(+)
 create mode 100644 beguda.txt
jpuigcerver@fp:~/git_branques (main) $ ls # (2)!
beguda.txt
menjar.txt
README.md
jpuigcerver@fp:~/git_branques (main) $ cat beguda.txt
Aigua
Orxata
jpuigcerver@fp:~/git_branques (main) $ git lga
*   d71a079 - (0 seconds ago) Merge branch 'beguda' into 'main' - Joan Puigcerver (HEAD -> main)
|\  
| * 7540d67 - (0 seconds ago) Beguda - Joan Puigcerver (beguda)
* | a7ef672 - (0 seconds ago) Menjar - Joan Puigcerver (menjar)
|/  
* ec4c927 - (0 seconds ago) Commit inicial - Joan Puigcerver
  1. L'opció -m permet indicar el missatge del commit de fusió. Si no s'especifica, s'obri l'editor de text per a escriure'l.
  2. S'observa que s'han incorporat els canvis de la branca beguda en la branca main.

El repositori queda en la situació de la Figura 11, amb un commit de fusió que incorpora els canvis de la branca beguda en la branca main.

Resolució de conflictes

Durant la fusió de branques, pot ocórrer que les dues branques hagen modificat la mateixa part d'un fitxer. En aquest cas, Git no pot resoldre el conflicte de manera automàtica i cal resoldre'l manualment.

Quan s'executa git merge, Git detecta els conflictes i els marca en el fitxer amb la notació següent:

<<<<<<< HEAD
Contingut de la branca actual
=======
Contingut de la branca a fusionar
>>>>>>> branca_a_fusionar

A més, el repositori passa a l'estat de fusió (MERGING), que indica que hi ha una fusió en curs. Per a resoldre el conflicte, cal seguir aquests passos:

  1. Editar el fitxer i resoldre manualment el conflicte.
  2. Esborrar les marques de conflicte.
  3. Marcar el fitxer com a resolt amb git add i confirmar els canvis amb git commit.

Per a cancel·lar el procés de fusió (MERGING), es pot utilitzar l'ordre git merge --abort.

Preparació de les branques divergents fruita i verdura
  1. Es creen les branques fruita i verdura des de la branca main.

    jpuigcerver@fp:~/git_branques (main) $ git checkout main
    Already on 'main'
    jpuigcerver@fp:~/git_branques (main) $ git branch fruita
    jpuigcerver@fp:~/git_branques (main) $ git branch verdura
    jpuigcerver@fp:~/git_branques (main) $ git lga
    *   d71a079 - (0 seconds ago) Merge branch 'beguda' into 'main' - Joan Puigcerver (HEAD -> main, verdura, fruita)
    |\  
    | * 7540d67 - (0 seconds ago) Beguda - Joan Puigcerver (beguda)
    * | a7ef672 - (0 seconds ago) Menjar - Joan Puigcerver (menjar)
    |/  
    * ec4c927 - (0 seconds ago) Commit inicial - Joan Puigcerver
    
  2. S'afigen dues fruites al fitxer menjar.txt en la branca fruita.

    jpuigcerver@fp:~/git_branques (main) $ git checkout fruita
    Switched to branch 'fruita'
    jpuigcerver@fp:~/git_branques (fruita) $ echo "Pomes" >> menjar.txt
    jpuigcerver@fp:~/git_branques (fruita) $ echo "Bresquilles" >> menjar.txt
    jpuigcerver@fp:~/git_branques (fruita) $ git status
    On branch fruita
    Changes not staged for commit:
      (use "git add <file>..." to update what will be committed)
      (use "git restore <file>..." to discard changes in working directory)
        modified:   menjar.txt
    
    no changes added to commit (use "git add" and/or "git commit -a")
    jpuigcerver@fp:~/git_branques (fruita) $ git add menjar.txt
    jpuigcerver@fp:~/git_branques (fruita) $ git commit -m "Fruta"
    [fruita d32e3ba] Fruta
     1 file changed, 2 insertions(+)
    jpuigcerver@fp:~/git_branques (fruita) $ git lga
    * d32e3ba - (1 second ago) Fruta - Joan Puigcerver (HEAD -> fruita)
    *   d71a079 - (1 second ago) Merge branch 'beguda' into 'main' - Joan Puigcerver (verdura, main)
    |\  
    | * 7540d67 - (1 second ago) Beguda - Joan Puigcerver (beguda)
    * | a7ef672 - (1 second ago) Menjar - Joan Puigcerver (menjar)
    |/  
    * ec4c927 - (1 second ago) Commit inicial - Joan Puigcerver
    
  3. S'afigen dues verdures al fitxer menjar.txt en la branca verdura.

    jpuigcerver@fp:~/git_branques (fruita) $ git checkout verdura
    Switched to branch 'verdura'
    jpuigcerver@fp:~/git_branques (verdura) $ echo "Tomaques" >> menjar.txt
    jpuigcerver@fp:~/git_branques (verdura) $ echo "Creïlles" >> menjar.txt
    jpuigcerver@fp:~/git_branques (verdura) $ git status
    On branch verdura
    Changes not staged for commit:
      (use "git add <file>..." to update what will be committed)
      (use "git restore <file>..." to discard changes in working directory)
        modified:   menjar.txt
    
    no changes added to commit (use "git add" and/or "git commit -a")
    jpuigcerver@fp:~/git_branques (verdura) $ git add menjar.txt
    jpuigcerver@fp:~/git_branques (verdura) $ git commit -m "Verdura"
    [verdura e4cfd4d] Verdura
     1 file changed, 2 insertions(+)
    jpuigcerver@fp:~/git_branques (verdura) $ git lga
    * e4cfd4d - (0 seconds ago) Verdura - Joan Puigcerver (HEAD -> verdura)
    | * d32e3ba - (1 second ago) Fruta - Joan Puigcerver (fruita)
    |/  
    *   d71a079 - (1 second ago) Merge branch 'beguda' into 'main' - Joan Puigcerver (main)
    |\  
    | * 7540d67 - (1 second ago) Beguda - Joan Puigcerver (beguda)
    * | a7ef672 - (1 second ago) Menjar - Joan Puigcerver (menjar)
    |/  
    * ec4c927 - (1 second ago) Commit inicial - Joan Puigcerver
    
Exemple: Fusió de les branques fruita i verdura amb conflictes

Les branques fruita i verdura han modificat la mateixa secció del fitxer menjar.txt. Per tant, quan es fusionen, es produeix un conflicte.

jpuigcerver@fp:~/git_branques (verdura) $ git checkout main
Switched to branch 'main'
jpuigcerver@fp:~/git_branques (main) $ git lg
*   d71a079 - (1 second ago) Merge branch 'beguda' into 'main' - Joan Puigcerver (HEAD -> main)
|\  
| * 7540d67 - (1 second ago) Beguda - Joan Puigcerver (beguda)
* | a7ef672 - (1 second ago) Menjar - Joan Puigcerver (menjar)
|/  
* ec4c927 - (1 second ago) Commit inicial - Joan Puigcerver
jpuigcerver@fp:~/git_branques (main) $ git show fruita
commit d32e3bac4fc8792f3c13805d983a926c72841fb5
Author: Joan Puigcerver <j.puigcerveribanez@edu.gva.es>
Date:   Tue Oct 29 16:23:59 2024 +0100

    Fruta

diff --git a/menjar.txt b/menjar.txt
index c8d5456..312ebef 100644
--- a/menjar.txt
+++ b/menjar.txt
@@ -1,2 +1,4 @@
 Pa
 Macarrons
+Pomes
+Bresquilles
jpuigcerver@fp:~/git_branques (main) $ git show verdura
commit e4cfd4d48cb94e0e87c573f14f6eed310bb12750
Author: Joan Puigcerver <j.puigcerveribanez@edu.gva.es>
Date:   Tue Oct 29 16:24:00 2024 +0100

    Verdura

diff --git a/menjar.txt b/menjar.txt
index c8d5456..03fb9ab 100644
--- a/menjar.txt
+++ b/menjar.txt
@@ -1,2 +1,4 @@
 Pa
 Macarrons
+Tomaques
+Creïlles
  1. Primer, es fa una fusió directa de la branca fruita en la branca main, que no provoca cap conflicte.

    jpuigcerver@fp:~/git_branques (main) $ git merge fruita
    Updating d71a079..d32e3ba
    Fast-forward
     menjar.txt | 2 ++
     1 file changed, 2 insertions(+)
    jpuigcerver@fp:~/git_branques (main) $ git lga
    * e4cfd4d - (0 seconds ago) Verdura - Joan Puigcerver (verdura)
    | * d32e3ba - (1 second ago) Fruta - Joan Puigcerver (HEAD -> main, fruita)
    |/  
    *   d71a079 - (1 second ago) Merge branch 'beguda' into 'main' - Joan Puigcerver
    |\  
    | * 7540d67 - (1 second ago) Beguda - Joan Puigcerver (beguda)
    * | a7ef672 - (1 second ago) Menjar - Joan Puigcerver (menjar)
    |/  
    * ec4c927 - (1 second ago) Commit inicial - Joan Puigcerver
    
  2. Després, es fusiona la branca verdura en la branca main, i es produeix un conflicte.

    jpuigcerver@fp:~/git_branques (main) $ git merge verdura
    Auto-merging menjar.txt
    CONFLICT (content): Merge conflict in menjar.txt
    Automatic merge failed; fix conflicts and then commit the result.
    jpuigcerver@fp:~/git_branques (main|MERGING) $ git status
    On branch main
    You have unmerged paths.
      (fix conflicts and run "git commit")
      (use "git merge --abort" to abort the merge)
    
    Unmerged paths:
      (use "git add <file>..." to mark resolution)
        both modified:   menjar.txt
    
    no changes added to commit (use "git add" and/or "git commit -a")
    jpuigcerver@fp:~/git_branques (main|MERGING) $ cat menjar.txt
    Pa
    Macarrons
    <<<<<<< HEAD
    Pomes
    Bresquilles
    =======
    Tomaques
    Creïlles
    >>>>>>> verdura
    
  3. Es resol el conflicte eliminant les marques de conflicte i mantenint els canvis de les dues branques. Després, es marca el fitxer com a resolt amb git add i es confirmen els canvis amb git commit.

    Pa
    Macarrons
    <<<<<<< HEAD
    Pomes
    Bresquilles
    =======
    Tomaques
    Creïlles
    >>>>>>> verdura
    
    Pa
    Macarrons
    Pomes
    Bresquilles
    Tomaques
    Creïlles
    
    jpuigcerver@fp:~/git_branques (main|MERGING) $ code menjar.txt # (1)!
    jpuigcerver@fp:~/git_branques (main|MERGING) $ git add menjar.txt
    jpuigcerver@fp:~/git_branques (main|MERGING) $ git status
    On branch main
    All conflicts fixed but you are still merging.
      (use "git commit" to conclude merge)
    
    Changes to be committed:
        modified:   menjar.txt
    
    jpuigcerver@fp:~/git_branques (main|MERGING) $ git commit -m "Merge branch 'verdura' into 'main'"
    [main ce43962] Merge branch 'verdura' into 'main'
    jpuigcerver@fp:~/git_branques (main) $ git lga
    *   ce43962 - (0 seconds ago) Merge branch 'verdura' into 'main' - Joan Puigcerver (HEAD -> main)
    |\  
    | * e4cfd4d - (0 seconds ago) Verdura - Joan Puigcerver (verdura)
    * | d32e3ba - (1 second ago) Fruta - Joan Puigcerver (fruita)
    |/  
    *   d71a079 - (1 second ago) Merge branch 'beguda' into 'main' - Joan Puigcerver
    |\  
    | * 7540d67 - (1 second ago) Beguda - Joan Puigcerver (beguda)
    * | a7ef672 - (1 second ago) Menjar - Joan Puigcerver (menjar)
    |/  
    * ec4c927 - (1 second ago) Commit inicial - Joan Puigcerver
    
    1. S'edita el fitxer menjar.txt per a eliminar les marques de conflicte i mantenir els canvis de les dues branques.

Canvi de base (git rebase)

El canvi de base (rebase) és una altra manera d'integrar els canvis de dues branques divergents. Consisteix a aplicar, en ordre cronològic, els canvis dels commits d'una branca sobre una altra branca.

Aquesta tècnica permet incorporar canvis entre branques divergents mantenint una història lineal.

Aquest procés es fa amb l'ordre git rebase, amb la sintaxi següent:

git rebase <nova_base> [<branca>]
  • <nova_base>: nom de la branca que es vol utilitzar com a nova base.
  • [<branca>]: (opcional) nom de la branca a la qual es vol canviar la base. Si no s'especifica, es canvia la base de la branca actual (HEAD). Si s'especifica, l'operació fa automàticament un git checkout <branca> abans de començar.

Per exemple, per a canviar la base de la branca paella a la branca main, es pot executar qualsevol de les ordres següents des de la branca paella:

git rebase main
git rebase main paella

Història abans del canvi de base Història abans del canvi de base

Figura 12. Història abans del canvi de base.

En primer lloc, el canvi de base identifica tots els commits de la branca que no estan presents en la nova_base, és a dir, tots els posteriors a l'avantpassat comú.

Després, el HEAD es mou a la nova_base (main en aquest cas) i s'hi apliquen els commits de la branca en ordre seqüencial.

Història després del canvi de base Història després del canvi de base

Figura 13. Història després del canvi de base.

Preparació de les branques divergents desdejuni i paella
  1. Es creen les branques desdejuni i paella des de la branca main.

    jpuigcerver@fp:~/git_branques (main) $ git checkout main
    Already on 'main'
    jpuigcerver@fp:~/git_branques (main) $ git branch desdejuni
    jpuigcerver@fp:~/git_branques (main) $ git branch paella
    jpuigcerver@fp:~/git_branques (main) $ git lga -3 # (1)!
    *   ce43962 - (0 seconds ago) Merge branch 'verdura' into 'main' - Joan Puigcerver (HEAD -> main, paella, desdejuni)
    |\  
    | * e4cfd4d - (0 seconds ago) Verdura - Joan Puigcerver (verdura)
    * | d32e3ba - (1 second ago) Fruta - Joan Puigcerver (fruita)
    |/  
    
    1. L'opció -3 mostra només els tres últims commits de la història del repositori.
  2. S'afig un producte al fitxer beguda.txt en la branca desdejuni.

    jpuigcerver@fp:~/git_branques (main) $ git checkout desdejuni
    Switched to branch 'desdejuni'
    jpuigcerver@fp:~/git_branques (desdejuni) $ echo "Café" >> beguda.txt
    jpuigcerver@fp:~/git_branques (desdejuni) $ git add beguda.txt
    jpuigcerver@fp:~/git_branques (desdejuni) $ git commit -m "Beguda desdejuni"
    [desdejuni 8a3c34b] Beguda desdejuni
     1 file changed, 1 insertion(+)
    jpuigcerver@fp:~/git_branques (desdejuni) $ git lga -3
    * 8a3c34b - (0 seconds ago) Beguda desdejuni - Joan Puigcerver (HEAD -> desdejuni)
    *   ce43962 - (0 seconds ago) Merge branch 'verdura' into 'main' - Joan Puigcerver (paella, main)
    |\  
    | * e4cfd4d - (0 seconds ago) Verdura - Joan Puigcerver (verdura)
    
  3. S'afigen alguns productes al fitxer menjar.txt en la branca paella.

    jpuigcerver@fp:~/git_branques (desdejuni) $ git checkout paella
    Switched to branch 'paella'
    jpuigcerver@fp:~/git_branques (paella) $ echo "Arròs" >> menjar.txt
    jpuigcerver@fp:~/git_branques (paella) $ echo "Pollastre" >> menjar.txt
    jpuigcerver@fp:~/git_branques (paella) $ git add menjar.txt
    jpuigcerver@fp:~/git_branques (paella) $ git commit -m "Menjar paella"
    [paella 641c594] Menjar paella
     1 file changed, 2 insertions(+)
    jpuigcerver@fp:~/git_branques (paella) $ git lga -3
    * 8a3c34b - (0 seconds ago) Beguda desdejuni - Joan Puigcerver (desdejuni)
    | * 641c594 - (0 seconds ago) Menjar paella - Joan Puigcerver (HEAD -> paella)
    |/  
    *   ce43962 - (0 seconds ago) Merge branch 'verdura' into 'main' - Joan Puigcerver (main)
    |\  
    
Exemple: Fusió de les branques desdejuni i paella amb canvi de base

Es fusionen les branques desdejuni i paella en la branca main mantenint una història lineal.

  1. Es fusiona la branca desdejuni en la branca main amb una fusió directa (fast-forward).

    jpuigcerver@fp:~/git_branques (paella) $ git checkout main
    Switched to branch 'main'
    jpuigcerver@fp:~/git_branques (main) $ git merge desdejuni
    Updating ce43962..8a3c34b
    Fast-forward
     beguda.txt | 1 +
     1 file changed, 1 insertion(+)
    jpuigcerver@fp:~/git_branques (main) $ git lga -3
    * 8a3c34b - (0 seconds ago) Beguda desdejuni - Joan Puigcerver (HEAD -> main, desdejuni)
    | * 641c594 - (0 seconds ago) Menjar paella - Joan Puigcerver (paella)
    |/  
    *   ce43962 - (0 seconds ago) Merge branch 'verdura' into 'main' - Joan Puigcerver
    |\  
    
  2. La branca paella ha divergit de la branca main. Per a mantindre una història lineal, es canvia la base de la branca paella a la branca main.

    jpuigcerver@fp:~/git_branques (main) $ git checkout paella
    Switched to branch 'paella'
    jpuigcerver@fp:~/git_branques (paella) $ git rebase main
    Rebasing (1/1)
    Successfully rebased and updated refs/heads/paella.
    jpuigcerver@fp:~/git_branques (paella) $ git lga -3
    * 8c43498 - (0 seconds ago) Menjar paella - Joan Puigcerver (HEAD -> paella)
    * 8a3c34b - (0 seconds ago) Beguda desdejuni - Joan Puigcerver (main, desdejuni)
    *   ce43962 - (0 seconds ago) Merge branch 'verdura' into 'main' - Joan Puigcerver
    |\  
    
  3. Després del canvi de base, ja és possible fusionar la branca paella en la branca main amb una fusió directa (fast-forward).

    jpuigcerver@fp:~/git_branques (paella) $ git checkout main
    Switched to branch 'main'
    jpuigcerver@fp:~/git_branques (main) $ git merge paella
    Updating 8a3c34b..8c43498
    Fast-forward
     menjar.txt | 2 ++
     1 file changed, 2 insertions(+)
    jpuigcerver@fp:~/git_branques (main) $ git lga -3
    * 8c43498 - (0 seconds ago) Menjar paella - Joan Puigcerver (HEAD -> main, paella)
    * 8a3c34b - (0 seconds ago) Beguda desdejuni - Joan Puigcerver (desdejuni)
    *   ce43962 - (0 seconds ago) Merge branch 'verdura' into 'main' - Joan Puigcerver
    |\  
    

Resolució de conflictes en un canvi de base

El canvi de base (rebase) també pot provocar conflictes si les dues branques han modificat la mateixa part d'un fitxer. Git indica que hi ha conflictes i cal resoldre'ls manualment, d'una manera semblant a la resolució de conflictes en la fusió de branques.

La diferència és que cal resoldre els conflictes de cada commit al qual s'està canviant la base, seguint aquests passos:

  1. Editar el fitxer per a resoldre manualment el conflicte i esborrar les marques de conflicte.
  2. Marcar els fitxers com a resolts amb git add.
  3. Continuar el procés de rebase amb l'ordre git rebase --continue.

Aquest procés es repeteix per a cada commit que tinga conflictes.

Per a cancel·lar el procés de canvi de base (REBASING), es pot utilitzar l'ordre git rebase --abort.

Preparació de les branques divergents postre i aperitiu
  1. Es creen les branques postre i aperitiu des de la branca main.

    jpuigcerver@fp:~/git_branques (main) $ git checkout main
    Already on 'main'
    jpuigcerver@fp:~/git_branques (main) $ git branch postre
    jpuigcerver@fp:~/git_branques (main) $ git branch aperitiu
    jpuigcerver@fp:~/git_branques (main) $ git lga -3
    * 8c43498 - (0 seconds ago) Menjar paella - Joan Puigcerver (HEAD -> main, postre, paella, aperitiu)
    * 8a3c34b - (0 seconds ago) Beguda desdejuni - Joan Puigcerver (desdejuni)
    *   ce43962 - (0 seconds ago) Merge branch 'verdura' into 'main' - Joan Puigcerver
    |\  
    
  2. S'afig un producte al fitxer menjar.txt en la branca postre.

    jpuigcerver@fp:~/git_branques (main) $ git checkout postre
    Switched to branch 'postre'
    jpuigcerver@fp:~/git_branques (postre) $ echo "Iogurt" >> menjar.txt
    jpuigcerver@fp:~/git_branques (postre) $ git add menjar.txt
    jpuigcerver@fp:~/git_branques (postre) $ git commit -m "Menjar postre"
    [postre 0d71e2b] Menjar postre
     1 file changed, 1 insertion(+)
    jpuigcerver@fp:~/git_branques (postre) $ git lga -3
    * 0d71e2b - (0 seconds ago) Menjar postre - Joan Puigcerver (HEAD -> postre)
    * 8c43498 - (0 seconds ago) Menjar paella - Joan Puigcerver (paella, main, aperitiu)
    * 8a3c34b - (0 seconds ago) Beguda desdejuni - Joan Puigcerver (desdejuni)
    
  3. S'afigen alguns productes al fitxer menjar.txt en la branca aperitiu.

    jpuigcerver@fp:~/git_branques (postre) $ git checkout aperitiu
    Switched to branch 'aperitiu'
    jpuigcerver@fp:~/git_branques (aperitiu) $ echo "Olives" >> menjar.txt
    jpuigcerver@fp:~/git_branques (aperitiu) $ git add menjar.txt
    jpuigcerver@fp:~/git_branques (aperitiu) $ git commit -m "Menjar aperitiu"
    [aperitiu f3c59a0] Menjar aperitiu
     1 file changed, 1 insertion(+)
    jpuigcerver@fp:~/git_branques (aperitiu) $ git lga -3
    * f3c59a0 - (0 seconds ago) Menjar aperitiu - Joan Puigcerver (HEAD -> aperitiu)
    | * 0d71e2b - (0 seconds ago) Menjar postre - Joan Puigcerver (postre)
    |/  
    * 8c43498 - (0 seconds ago) Menjar paella - Joan Puigcerver (paella, main)
    
Exemple: Fusió de les branques postre i aperitiu amb canvi de base i conflictes

Les branques postre i aperitiu han modificat la mateixa secció del fitxer menjar.txt. Per tant, quan es fa el canvi de base es produeixen conflictes.

jpuigcerver@fp:~/git_branques (aperitiu) $ git checkout main
Switched to branch 'main'
jpuigcerver@fp:~/git_branques (main) $ git lga -3
* f3c59a0 - (0 seconds ago) Menjar aperitiu - Joan Puigcerver (aperitiu)
| * 0d71e2b - (0 seconds ago) Menjar postre - Joan Puigcerver (postre)
|/  
* 8c43498 - (0 seconds ago) Menjar paella - Joan Puigcerver (HEAD -> main, paella)
jpuigcerver@fp:~/git_branques (main) $ git show postre
commit 0d71e2b271221eaffbd345ef63010188981a973a
Author: Joan Puigcerver <j.puigcerveribanez@edu.gva.es>
Date:   Tue Oct 29 16:24:00 2024 +0100

    Menjar postre

diff --git a/menjar.txt b/menjar.txt
index 1a238ca..aef7ce7 100644
--- a/menjar.txt
+++ b/menjar.txt
@@ -6,3 +6,4 @@ Tomaques
 Creïlles
 Arròs
 Pollastre
+Iogurt
jpuigcerver@fp:~/git_branques (main) $ git show aperitiu
commit f3c59a0b667fa226aa7b6c8918d7ed27c377bbc9
Author: Joan Puigcerver <j.puigcerveribanez@edu.gva.es>
Date:   Tue Oct 29 16:24:00 2024 +0100

    Menjar aperitiu

diff --git a/menjar.txt b/menjar.txt
index 1a238ca..c6c2b2b 100644
--- a/menjar.txt
+++ b/menjar.txt
@@ -6,3 +6,4 @@ Tomaques
 Creïlles
 Arròs
 Pollastre
+Olives
  1. Primer, es fa una fusió directa de la branca postre en la branca main, que no provoca cap conflicte.

    jpuigcerver@fp:~/git_branques (main) $ git checkout main
    Already on 'main'
    jpuigcerver@fp:~/git_branques (main) $ git merge postre
    Updating 8c43498..0d71e2b
    Fast-forward
     menjar.txt | 1 +
     1 file changed, 1 insertion(+)
    jpuigcerver@fp:~/git_branques (main) $ git lga -3
    * f3c59a0 - (0 seconds ago) Menjar aperitiu - Joan Puigcerver (aperitiu)
    | * 0d71e2b - (0 seconds ago) Menjar postre - Joan Puigcerver (HEAD -> main, postre)
    |/  
    * 8c43498 - (0 seconds ago) Menjar paella - Joan Puigcerver (paella)
    
  2. La branca aperitiu ha divergit de la branca main. Per a mantindre una història lineal, es canvia la base de la branca aperitiu a la branca main. Com que les dues branques han modificat la mateixa secció del fitxer menjar.txt, es produeixen conflictes.

    jpuigcerver@fp:~/git_branques (main) $ git checkout aperitiu
    Switched to branch 'aperitiu'
    jpuigcerver@fp:~/git_branques (aperitiu) $ git rebase main
    Auto-merging menjar.txt
    CONFLICT (content): Merge conflict in menjar.txt
    Rebasing (1/1)
    error: could not apply f3c59a0... Menjar aperitiu
    hint: Resolve all conflicts manually, mark them as resolved with
    hint: "git add/rm <conflicted_files>", then run "git rebase --continue".
    hint: You can instead skip this commit: run "git rebase --skip".
    hint: To abort and get back to the state before "git rebase", run "git rebase --abort".
    hint: Disable this message with "git config advice.mergeConflict false"
    Could not apply f3c59a0... Menjar aperitiu
    jpuigcerver@fp:~/git_branques (aperitiu|REBASE 1/1) $ git status
    interactive rebase in progress; onto 0d71e2b
    Last command done (1 command done):
       pick f3c59a0 Menjar aperitiu
    No commands remaining.
    You are currently rebasing branch 'aperitiu' on '0d71e2b'.
      (fix conflicts and then run "git rebase --continue")
      (use "git rebase --skip" to skip this patch)
      (use "git rebase --abort" to check out the original branch)
    
    Unmerged paths:
      (use "git restore --staged <file>..." to unstage)
      (use "git add <file>..." to mark resolution)
        both modified:   menjar.txt
    
    no changes added to commit (use "git add" and/or "git commit -a")
    
  3. Es resolen els conflictes eliminant les marques de conflicte i mantenint els canvis de les dues branques. Després, es marquen els fitxers com a resolts amb git add i es continua el procés de rebase.

    Pa
    Macarrons
    Pomes
    Bresquilles
    Tomaques
    Creïlles
    Arròs
    Pollastre
    <<<<<<< HEAD
    Iogurt
    =======
    Olives
    >>>>>>> f3c59a0 (Menjar aperitiu)
    
    Pa
    Macarrons
    Pomes
    Bresquilles
    Tomaques
    Creïlles
    Arròs
    Pollastre
    Iogurt
    Olives
    
    jpuigcerver@fp:~/git_branques (aperitiu|REBASE 1/1) $ code menjar.txt # (1)!
    jpuigcerver@fp:~/git_branques (aperitiu|REBASE 1/1) $ git add menjar.txt
    jpuigcerver@fp:~/git_branques (aperitiu|REBASE 1/1) $ git status
    interactive rebase in progress; onto 0d71e2b
    Last command done (1 command done):
       pick f3c59a0 Menjar aperitiu
    No commands remaining.
    You are currently rebasing branch 'aperitiu' on '0d71e2b'.
      (all conflicts fixed: run "git rebase --continue")
    
    Changes to be committed:
      (use "git restore --staged <file>..." to unstage)
        modified:   menjar.txt
    
    jpuigcerver@fp:~/git_branques (aperitiu|REBASE 1/1) $ git rebase --continue
    [detached HEAD 0a53b4b] Menjar aperitiu
     Author: Joan Puigcerver <j.puigcerveribanez@edu.gva.es>
     1 file changed, 1 insertion(+)
    
    
    Successfully rebased and updated refs/heads/aperitiu.
    jpuigcerver@fp:~/git_branques (aperitiu) $ git lga -3
    * 0a53b4b - (0 seconds ago) Menjar aperitiu - Joan Puigcerver (HEAD -> aperitiu)
    * 0d71e2b - (0 seconds ago) Menjar postre - Joan Puigcerver (postre, main)
    * 8c43498 - (0 seconds ago) Menjar paella - Joan Puigcerver (paella)
    
    1. S'eliminen les marques de conflicte i es combinen els dos textos.
  4. Després del canvi de base, ja és possible fusionar la branca aperitiu en la branca main amb una fusió directa (fast-forward).

    jpuigcerver@fp:~/git_branques (aperitiu) $ git checkout main
    Switched to branch 'main'
    jpuigcerver@fp:~/git_branques (main) $ git merge aperitiu
    Updating 0d71e2b..0a53b4b
    Fast-forward
     menjar.txt | 1 +
     1 file changed, 1 insertion(+)
    jpuigcerver@fp:~/git_branques (main) $ git lga -3
    * 0a53b4b - (0 seconds ago) Menjar aperitiu - Joan Puigcerver (HEAD -> main, aperitiu)
    * 0d71e2b - (0 seconds ago) Menjar postre - Joan Puigcerver (postre)
    * 8c43498 - (0 seconds ago) Menjar paella - Joan Puigcerver (paella)
    
📌 Aquest document pot quedar desactualitzat després d’imprimir-lo. Pots consultar la versió més recent a la pàgina web.
🌿 Abans d’imprimir aquest document, considera si és realment necessari. Redueix el consum de paper i ajuda a protegir el nostre entorn.