Salta el contingut
 

Remots

Autor: Joan Puigcerver Ibáñez

Correu electrònic: j.puigcerveribanez@edu.gva.es

Llicència: CC BY-NC-SA 4.0

(Reconeixement - NoComercial - CompartirIgual) 🅭

Introducció

En el blocs anteriors, ens hem centrat en conéixer la seua estructura i realitzar accions bàsiques per realitzar canvis sobre aquest.

No obstant això, totes les accions que hem realitzat fins ara han sigut sobre un repositori local, és 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ó de repositoris remots; repositoris que es troben allotjats en un servidor, que permeten l'accés a altres usuaris i la col·laboració en el desenvolupament de projectes.

Preparació repositori local

En aquest material treballarem sobre un nou repositori local.

Inicialització:

#!/bin/bash

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

mkdir -p ~/git_remots
cd ~/git_remots
git init
git branch -m main # (1)!
echo "# Remots a Git" > README.md
echo "Repositori del __Bloc: Remots__ del curs __\"Introducció a Git i la seua aplicació a l’aula\"__" >> README.md
git add README.md
git commit -m "Commit inicial"
git lga

jpuigcerver@fp:~ $ mkdir -p ~/git_remots
jpuigcerver@fp:~ $ cd ~/git_remots
jpuigcerver@fp:~/git_remots $ git init
Initialized empty Git repository in ~/git_remots/.git/
jpuigcerver@fp:~/git_remots (main) $ git branch -m main # (1)!
jpuigcerver@fp:~/git_remots (main) $ echo "# Remots a Git" > README.md
jpuigcerver@fp:~/git_remots (main) $ echo "Repositori del __Bloc: Remots__ del curs __\"Introducció a Git i la seua aplicació a l’aula\"__" >> README.md
jpuigcerver@fp:~/git_remots (main) $ git add README.md
jpuigcerver@fp:~/git_remots (main) $ git commit -m "Commit inicial"
[main (root-commit) 113f1d4] Commit inicial
 1 file changed, 2 insertions(+)
 create mode 100644 README.md
jpuigcerver@fp:~/git_remots (main) $ git lga
* 113f1d4 - (0 seconds ago) Commit inicial - Joan Puigcerver (HEAD -> main)
  1. Canviem el nom de la branca principal a main.
README.md
# Remots a Git
Repositori del __Bloc: Remots__ del curs __"Introducció a Git i la seua aplicació a l’aula"__

Repositori remot

Un Repositori Remot és una còpia 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òpia conté una rèplica completa de la història del repositori, incloses totes les revisions i les branques. Els repositoris remots permeten la col·laboració i el seguiment del desenvolupament del codi entre múltiples persones, o tu mateix en diferents dispositius.

Repositori remot vinculat a múltiples repositoris locals

Figura 1. Repositori remot vinculat a múltiples repositoris locals

Entre les finalitats dels repositoris remots podem trobar:

  • Col·laboració: Permeten que diversos desenvolupadors treballen junts en un mateix projecte. Cada desenvolupador pot treballar en la seua còpia local del repositori remot i, una vegada fetes les seues modificacions, pot pujar els canvis al repositori remot perquè altres membres de l'equip puguen veure i incorporar aquestes modificacions.
  • Còpia de seguretat: Un repositori remot pot servir com a còpia de seguretat del teu projecte. Si el teu sistema local es danya o es perd, encara tindràs accés a la teua història completa i als fitxers del projecte mitjançant el repositori remot.
  • Distribució: Els repositoris remots permeten distribuir el teu codi a altres llocs. Això pot ser útil per compartir el teu codi amb altres persones o per desplegar el teu projecte en un servidor en línia.

Gràcies a aquestes característiques, Git s'ha convertit en una eina clau en qualsevol desenvolupament, però sobretot en els projectes de codi obert (open source), ja que permet la col·laboració de desenvolupadors de tot el món en un mateix projecte de manera senzilla i distribuïda.

Allotjament de repositoris remots

Els repositoris remots es poden allotjar en qualsevol màquina o servidor dedicat. No obstant això, hi ha serveis d'allotjament de repositoris remots en línia que faciliten la creació i la gestió de repositoris remots.

Alguns dels serveis d'allotjament repositoris remots en línia més coneguts són:

  • GitHub: Servei d'allotjament de repositoris creat en 2008 i adquirit per Microsoft en 2018. És el servei d'allotjament de repositoris de Git més utilitzat.

    Ofereix una opció gratuïta, que permet crear projectes públics i privats, però amb algunes restriccions. També ofereix plans de pagament per projectes empresarials.

  • GitLab: Servei d'allotjament de repositoris. GitLab és una plataforma de codi obert.

  • Bitbucket: Servei d'allotjament de repositoris propietat de l'empresa Atlassian, s'integra estretament amb altres eines d'aquesta empresa, com Jira.

Creació d'un repositori remot a GitHub

En aquesta secció, crearem un repositori remot a GitHub.

  1. Crea un compte a GitHub si no en tens un.
  2. Inicia la sessió amb el teu compte.
  3. Fes clic a l'opció "New" per crear un nou repositori.
  4. Omple el formulari amb la informació del teu repositori:
    • Nom del repositori. Ha de ser un nom únic en el teu compte de GitHub.
    • Descripció del repositori. Opcional.
    • Visibilitat del repositori. Pots triar entre públic o privat.
      • Públic: Qualsevol persona pot veure el teu repositori. Sols les persones autoritzades poden fer canvis.
      • Privat: Només 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ència: Indica si vols afegir una llicència al teu repositori.
Exemple: Creació d'un repositori a GitHub

Creem un repositori amb les següents característiques:

  • Nom: git_remots
  • Descripció: Repositori del Bloc: Remots del curs "Introducció a Git i la seua aplicació a l’aula"
  • Visibilitat: Públic
  • README: No
  • .gitignore: No
  • Llicència: No

Formulari de creació d'un nou repositori a GitHub

Figura 2. Formulari de creació 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àgina com la següent:

Repositori buit creat a GitHub

Figura 3. Repositori buit creat a GitHub

La Figura 3 mostra els passos per enllaçar el teu repositori local amb el repositori remot creat a GitHub. En els següents apartats, explicarem aquestes ordres amb més detall.

Mètodes d'autenticació a GitHub

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

Recomanació

Per seguretat i fàcil reutilització, es recomana utilitzar el mètode SSH per autenticar-se amb el servidor de GitHub.

Pots consultar l'apartat Configuració de la clau SSH per configurar aquest mètode d'autenticació directament.

GitHub ofereix diferents mètodes d'autenticació, utilitzant dos protocols diferents:

  • Protocol HTTPS: Utilitza el protocol HTTPS per autenticar-se amb el servidor de GitHub.

    Per utilitzar aquest mètode, has de configurar les teues credencials d'accés a GitHub en el teu sistema local.

    Aquesta autenticació es pot realitzar mitjançant:

    • Nom d'usuari i contrasenya: Des del 2021-08-13, aquest mètode està deshabilitat a GitHub.
    • Token d'accés personal (Personal Access Token o PAT): GitHub permet crear un token d'accés personal per autenticar-se amb el servidor de GitHub.
    • Extensions de l'IDE: Algunes extensions de l'IDE que utilitzes poden gestionar l'autenticació amb GitHub directament.
  • Protocol SSH: Utilitza el protocol SSH per autenticar-se amb el servidor de GitHub.

    Per utilitzar aquest mètode, has de configurar una clau SSH en el teu sistema local i afegir-la al teu compte de GitHub.

Token d'accés personal (PAT)

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

Per crear un token d'accés personal, segueix els següents passos:

  • Inicia la sessió a GitHub
  • Fes clic a la teua foto de perfil i selecciona Settings.
  • A la barra lateral esquerra, fes clic a Developer settings.
  • A la barra lateral esquerra, fes clic a Personal access tokens.
  • Fes clic a Generate new token.

Existeixen dos tipus de tokens d'accés personal:

  • Access token (classic): Permet especificar els permisos que vols donar al token, que són globals per a tot el teu compte.
  • Fine-grained token: Permet especificar els permisos que vols donar al token, que són específics per a un repositori o organització.

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

Important

Guarda el teu token d'accés personal en un lloc segur.

No podràs veure'l de nou després de tancar la pàgina.

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

  • Mitjançant la URL: Pots afegir el teu token d'accés personal a la URL del repositori per autenticar-te amb el servidor de GitHub.
    git clone https://<token>@github.com/<usuari>/<repositori>
    
  • Mitjançant la contrasenya: Pots utilitzar el teu token d'accés personal com a contrasenya per autenticar-te amb el servidor de GitHub.

    jpuigcerver@fp:~ $ git clone https://github.com/<usuari>/<repositori>
    Cloning into '<repositori>'...
    Username for 'https://github.com': <usuari>
    Password for 'https://<username>@github.com': <token>
    

    Note

    Per seguretat, no es mostrarà res en el camp de la contrasenya.

Consell

Per tal de no haver de recordar el PAT cada vegada, és possible configurar Git perquè ho recorde automàticament.

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

Danger

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

Configuració de la clau SSH

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

Per generar una clau SSH, segueix els següents passos.

  • Crea una clau SSH al teu sistema local mitjançant la comanda ssh-keygen.

    jpuigcerver@fp:~ $ ssh-keygen -t rsa -b 4096
    Generating public/private rsa key pair.
    Enter file in which to save the key (/home/jpuigcerver/.ssh/id_rsa):
    Enter passphrase (empty for no passphrase):
    Enter same passphrase again:
    Your identification has been saved in /home/jpuigcerver/.ssh/id_rsa
    
    • -t rsa: Indica el tipus de clau RSA.
    • -b 4096: Indica la longitud de la clau en bits.
    • Pots indicar la ruta on guardar la clau. Per defecte, es guarda en /home/<usuari>/.ssh/id_rsa.
    • Pots indicar una contrasenya per protegir la clau. Si no vols protegir-la, deixa el camp buit.
  • Còpia el contingut de la clau pública (id_rsa.pub) al porta-retalls.

    jpuigcerver@fp:~ $ cat ~/.ssh/id_rsa.pub
    ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAQC7GqFnEFQZK4+l3zvXF07hN/cMk5ZtJmMkHWAJyTYQ+pDwMXp9eQs
    +VASLlz9z+0Q3vnnXN4vBO/+2u29fKJ4YlrecDYtCDpEhMXCkaCv9/ggkru09j2rELFuAqER55lgEtRKTfLKAVFa3Ws
    2VV7zlTSAH2y8nVddzlJRE9Y1BAfH0+1hjpCe+vgGObBLyIGGsXwlmm3mwI7NKHuKCIVskIEX3F0jw668dBex+6VUtG
    ...
    
  • Obri el programa Git GUI.
  • Obri el diàleg a Help > Show SSH Key.

    Git GUI: menú diàleg SSH

    Menú diàleg SSH de Git GUI

  • Fes clic a Generate Key.

    • Indica una contrasenya (passphrase) per protegir la clau (opcional) o deixa el camp buit per no protegir-la.
  • Fes clic a Copy to Clipboard per copiar la clau pública al porta-retalls.

    Git GUI: clau SSH generada

    Clau SSH generada amb Git GUI

Després, configura la clau SSH al teu compte de GitHub seguint els següents passos:

  • Inicia la sessió a GitHub
  • Fes clic a la teua foto de perfil i selecciona Settings.
  • A la barra lateral esquerra, fes clic a SSH and GPG keys.
  • Fes clic a New SSH key.
  • Indica un títol per a la clau SSH.
  • Enganxa el contingut de la clau pública al camp Key.

Important

Aquesta configuració s'ha de repetir per cada dispositiu on vulgues autenticar-te amb el servidor de GitHub mitjançant el protocol SSH.

Configurar un repositori remot (git remote)

El primer pas és enllaçar 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 és la següent:

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

Aquesta comanda permet realitzar les següents accions:

  • Sense opcions: Mostra els repositoris remots associats al teu repositori local.
  • add: Afegeix un nou repositori remot.
  • rename: Canvia el nom d'un repositori remot.
  • remove: Elimina un repositori remot.
  • show: Mostra informació detallada d'un repositori remot.

Cadascuna d'aquestes opcions té les seues pròpies opcions i arguments.

Documentació

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

Afegir un repositori remot

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

La sintaxi és la següent:

git remote add <nom> <url>

  • <nom>: Nom o àlies del repositori remot en el teu repositori local. Normalment, s'utilitza el nom origin per referir-se al repositori remot principal.
  • <url>: URL del repositori remot.

Repositori Local vinculat amb un Repositori Remot

Figura 4. Repositori Local vinculat amb un Repositori Remot

Warning

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

jpuigcerver@fp:~/git_remots (main) $ git push
fatal: No configured push destination.
Either specify the URL from the command-line or configure a remote repository using

    git remote add <name> <url>

and then push using the remote name

    git push <name>
Exemple: Afegir un repositori remot

Enllaçarem el nostre repositori local amb el repositori remot creat anteriorment a GitHub.

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

jpuigcerver@fp:~/git_remots (main) $ git remote add origin git@github.com:joapuiib/git_remots.git
jpuigcerver@fp:~/git_remots (main) $ git remote show origin
* remote origin
  Fetch URL: git@github.com:joapuiib/git_remots.git
  Push  URL: git@github.com:joapuiib/git_remots.git
  HEAD branch: (unknown)
  1. Utilitzem la URL SSH ja que he decidit utilitzar aquest mètode d'autenticació.

Reanomenar un repositori remot

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

La sintaxi és la següent:

git remote rename <antic> <nou>

  • <antic>: Nom actual del repositori remot.
  • <nou>: Nou nom del repositori remot.

Eliminar un repositori remot

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

La sintaxi és la següent:

git remote remove <nom>

  • <nom>: Nom del repositori remot a eliminar.

Associació entre branques locals i remotes (git push --set-upstream)

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

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

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

git push [-u|--set-upstream] <remot> <branca>
  • -u|--set-upstream: Configura la branca local perquè s'associe amb la branca remota.
  • <remot>: Àlies del repositori remot (configurat amb git remote add).
  • <branca>: Nom de la branca remota.

Documentació

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

Important

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

Associació d'una branca local a una branca remota

Figura 5. Associació d'una branca local a una branca remota

Consell

Pots configurar git perquè configure automàticament la branca local perquè s'associe amb la branca remota amb el mateix nom amb l'opció push.autoSetupRemote.

git config --global push.autoSetupRemote true
Exemple: Associació branca local i remota

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

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

jpuigcerver@fp:~/git_remots (main) $ git lga
* 113f1d4 - (4 seconds ago) Commit inicial - Joan Puigcerver (HEAD -> main)
jpuigcerver@fp:~/git_remots (main) $ git push
fatal: The current branch main has no upstream branch.
To push the current branch and set the remote as upstream, use

    git push --set-upstream origin main

To have this happen automatically for branches without a tracking
upstream, see 'push.autoSetupRemote' in 'git help config'.

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

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

jpuigcerver@fp:~/git_remots (main) $ git push --set-upstream origin main
branch 'main' set up to track 'origin/main'.
To github.com:joapuiib/git_remots.git
 * [new branch]      main -> main
jpuigcerver@fp:~/git_remots (main) $ git lga
* 113f1d4 - (6 seconds ago) Commit inicial - Joan Puigcerver (HEAD -> main, origin/main)

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

Canvis publicats a GitHub

Figura 5.1. Canvis publicats a GitHub

Clonació d'un repositori remot (git clone)

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

Aquesta ordre còpia els continguts del Directori de Treball i tota la informació del Repositori Local, incloent la història de canvis. A més, configura automàticament el repositori remot com a origin.

La sintaxi és la següent:

git clone <url> [<directori>]

  • <url>: URL del repositori remot. Pot ser una URL HTTPS o SSH.
  • <directori>: Opcional. Nom del directori on es copiarà el repositori. Per defecte, es crea un directori amb el nom del repositori remot.

Clonació d'un repositori remot

Figura 6. Clonació d'un repositori remot

Exemple: Clonació d'un repositori remot

Com que ja tenim els canvis publicats al repositori remot, podem clonar el repositori remot al nostre sistema local.

Esborrem el directori git_remots i el clonarem des del repositori remot.

jpuigcerver@fp:~/git_remots (main) $ cd ~
jpuigcerver@fp:~ $ rm -rf ~/git_remots
jpuigcerver@fp:~ $ ls -l ~/git_remots
ls: cannot access '~/git_remots': No such file or directory
jpuigcerver@fp:~ $ git clone git@github.com:joapuiib/git_remots.git
Cloning into 'git_remots'...
jpuigcerver@fp:~ $ cd ~/git_remots
jpuigcerver@fp:~/git_remots (main) $ git lga
* 113f1d4 - (8 seconds ago) Commit inicial - Joan Puigcerver (HEAD -> main, origin/main, origin/HEAD)

S'observa que s'ha clonat correctament el repositori remot git_remots que conté els fitxers i la història de canvis del repositori remot.

Sincronització entre repositoris (git fetch)

L'ordre git fetch actualitza la informació de les branques remotes origin/<branca> al nostre repositori local, però no aplica els canvis a les nostres branques locals.

git fetch [<options>] [<remot>]
  • <options>: Opcions de la comanda.
  • <remot>: Àlies del repositori remot. Per defecte, s'utilitza origin.

Sincronització entre repositoris amb git fetch

Figura 7. Sincronització entre repositoris amb git fetch

Aquesta ordre és útil per obtindre la informació dels canvis realitzats en el repositori remot i decidir si volem incorporar-los al nostre repositori local.

Documentació

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

Informació

L'opció --prune permet eliminar les referències de les branques remotes que ja no existeixen en el repositori remot.

Aquesta opció pot ser configurada per defecte amb la comanda git config.

git config --global fetch.prune true

També es pot configurar perquè aquesta opció s'aplique en la comanda git pull.

git config --global remote.origin.prune true
Preparació: Canvis en el repositori remot

Anem a realitzar un canvi en el repositori remot directament a GitHub.

  1. Creem un fitxer menjar.txt amb el contingut:

    menjar.txt
    Pa
    Macarrons
    

Crear un nou fitxer a GitHub

Figura 7.1. Crear un nou fitxer a GitHub

Afegir contingut a un fitxer en GitHub

Figura 7.2. Afegir contingut a menjar.txt en GitHub

  1. Creem un commit amb el missatge Menjar.

Crear un commit a GitHub

Figura 7.3. Crear un commit a GitHub

  1. Comprovem que el canvi s'ha realitzat correctament.

Canvi realitzat a GitHub

Figura 7.4. Canvi realitzat a GitHub

Exemple: Sincronització entre repositoris (fetch)

En aquest moment, s'ha realitzat un canvi en el repositori remot, que no figura en el nostre repositori local.

jpuigcerver@fp:~/git_remots (main) $ git lga
* 113f1d4 - (12 seconds ago) Commit inicial - Joan Puigcerver (HEAD -> main, origin/main, origin/HEAD)

Sincronitzem el repositori local amb el repositori remot, que conté els nous canvis realitzats.

jpuigcerver@fp:~/git_remots (main) $ git fetch
From github.com:joapuiib/git_remots
   113f1d4..8594cb9  main       -> origin/main
jpuigcerver@fp:~/git_remots (main) $ git lga
* 8594cb9 - (4 seconds ago) Menjar - Joan Puigcerver (origin/main, origin/HEAD)
* 113f1d4 - (14 seconds ago) Commit inicial - Joan Puigcerver (HEAD -> main)

S'observa que la branca origin/main s'ha actualitzat amb el nou canvi, però la branca local main no s'ha modificat.

Incorporació de canvis (git pull)

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

Aquesta ordre realitza dos accions:

  • git fetch: Actualitza la informació de les branques remotes al nostre repositori local.
  • git merge origin/<branca>: Incorpora els canvis de la branca remota a la branca local.

Incorporació de canvis amb git pull

Figura 8. Incorporació de canvis amb git pull

git pull [<options>] [<remot> [<branca>]
  • <options>: Opcions de la comanda.
  • <remot>: Àlies del repositori remot. Per defecte, s'utilitza la configuració de la branca actual.
  • <branca>: Nom de la branca remota. Per defecte, s'utilitza la configuració de la branca actual.

Documentació

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

Advertència

La fusió (merge) implícita de git pull pot ser una Fusió directa o es pot produir una Fusió de branques divergents si la branca local i la branca remota divergeixen.

En aquest últim cas:

  • Poden produir conflictes. Si es produeixen, caldrà resoldre'ls manualment.
  • Executar directament git pull generarà un commit de fusió, que pot ser no és desitjable si es vol mantenir una història lineal.

Consell

Per evitar la fusió de branques divergents en git pull, es pot fer el següent:

  • git pull --ff-only: Incorpora els canvis de la branca remota només si es pot fer una fusió directa (fast-forward).

    Git pot ser configurat perquè només permeta aquest tipus de fusió en la comanda git pull.

    git config --global pull.ff only
    
  • git pull --rebase: Incorpora els canvis de la branca remota mitjançant un rebase, és a dir, aplica els canvis de la branca local després dels canvis de la branca remota.

    Aquest comportament també es pot configurar per defecte en la comanda git pull.

    git config --global pull.rebase true
    
Exemple: Incorporació de canvis fusió directa (pull --ff-only)

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

jpuigcerver@fp:~/git_remots (main) $ git lga
* 8594cb9 - (4 seconds ago) Menjar - Joan Puigcerver (origin/main, origin/HEAD)
* 113f1d4 - (14 seconds ago) Commit inicial - Joan Puigcerver (HEAD -> main)

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

jpuigcerver@fp:~/git_remots (main) $ git pull
Updating 113f1d4..8594cb9
Fast-forward
 menjar.txt | 2 ++
 1 file changed, 2 insertions(+)
 create mode 100644 menjar.txt
jpuigcerver@fp:~/git_remots (main) $ git lga
* 8594cb9 - (6 seconds ago) Menjar - Joan Puigcerver (HEAD -> main, origin/main, origin/HEAD)
* 113f1d4 - (16 seconds ago) Commit inicial - Joan Puigcerver
Preparació: Més canvis en el repositori remot

Realitza els següents canvis en el repositori remot directament a GitHub.

  • Modifica el fitxer menjar.txt amb el següent contingut:

    menjar.txt
    Pa
    Macarrons
    Pomes
    
  • Crea un commit amb el missatge Més menjar.

Exemple: Incorporació de canvis amb fusió de branques divergents (pull --no-ff i pull --rebase)

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

En aquest cas, s'ha realitzat un altre canvi en el repositori remot, que nosaltres no hem incorporat.

No obstant això, anem a fer un canvi a la branca local main, simulant la situació anteriorment descrita.

jpuigcerver@fp:~/git_remots (main) $ echo "Aigua" >> beguda.txt
jpuigcerver@fp:~/git_remots (main) $ git add beguda.txt
jpuigcerver@fp:~/git_remots (main) $ git commit -m "Beguda"
[main 95b8d62] Beguda
 1 file changed, 1 insertion(+)
 create mode 100644 beguda.txt
jpuigcerver@fp:~/git_remots (main) $ git lga # (1)!
* 95b8d62 - (0 seconds ago) Beguda - Joan Puigcerver (HEAD -> main)
* 8594cb9 - (8 seconds ago) Menjar - Joan Puigcerver (origin/main, origin/HEAD)
* 113f1d4 - (18 seconds ago) Commit inicial - Joan Puigcerver
  1. En aquest moment, el nou canvi Més menjar no està reflectit en la branca remota origin/main.

En aquest moment, podríem intentar publicar aquest canvi al repositori remot, però com que el repositori remot té canvis que no estan reflectits en el nostre repositori local, Git ens mostrarà un missatge d'error.

jpuigcerver@fp:~/git_remots (main) $ git push
To github.com:joapuiib/git_remots.git
 ! [rejected]        main -> main (fetch first)
error: failed to push some refs to 'github.com:joapuiib/git_remots.git'
hint: Updates were rejected because the remote contains work that you do not
hint: have locally. This is usually caused by another repository pushing to
hint: the same ref. If you want to integrate the remote changes, use
hint: 'git pull' before pushing again.
hint: See the 'Note about fast-forwards' in 'git push --help' for details.
jpuigcerver@fp:~/git_remots (main) $ git fetch
From github.com:joapuiib/git_remots
   8594cb9..8c604a3  main       -> origin/main
jpuigcerver@fp:~/git_remots (main) $ git lga
* 95b8d62 - (4 seconds ago) Beguda - Joan Puigcerver (HEAD -> main)
| * 8c604a3 - (6 seconds ago) Més menjar - Joan Puigcerver (origin/main, origin/HEAD)
|/  
* 8594cb9 - (12 seconds ago) Menjar - Joan Puigcerver
* 113f1d4 - (22 seconds ago) Commit inicial - Joan Puigcerver

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à una fusió de branques divergents, que crearà un commit de fusió i resultarà en una història no lineal.

Vegem que no podem incorporar els canvis amb una fusió directa git pull --ff-only.

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

En aquest cas, haurem d'incorporar els canvis de dues maneres diferents.

Un commit de fusió: git pull --no-ff.

Aquesta opció crearà un commit de fusió, que no és desitjable si es vol mantenir una història lineal.

jpuigcerver@fp:~/git_remots (main) $ git pull --no-ff --no-edit # (1)!
Merge made by the 'ort' strategy.
 menjar.txt | 1 +
 1 file changed, 1 insertion(+)
jpuigcerver@fp:~/git_remots (main) $ git lga
*   a0b012f - (1 second ago) Merge branch 'main' of github.com:joapuiib/git_remots - Joan Puigcerver (HEAD -> main)
|\  
| * 8c604a3 - (10 seconds ago) Més menjar - Joan Puigcerver (origin/main, origin/HEAD)
* | 95b8d62 - (8 seconds ago) Beguda - Joan Puigcerver
|/  
* 8594cb9 - (16 seconds ago) Menjar - Joan Puigcerver
* 113f1d4 - (26 seconds ago) Commit inicial - Joan Puigcerver
  1. L'opció --no-edit indica que no volem editar el missatge de commit de fusió i deixem el missatge per defecte.

Un canvi de base: git pull --rebase.

Aquesta opció aplica els canvis de la branca local després dels canvis de la branca remota, mantenint una història lineal.

jpuigcerver@fp:~/git_remots (main) $ git pull --rebase
Rebasing (1/1)
Successfully rebased and updated refs/heads/main.
jpuigcerver@fp:~/git_remots (main) $ git lga
* e191e2d - (9 seconds ago) Beguda - Joan Puigcerver (HEAD -> main)
* 8c604a3 - (11 seconds ago) Més menjar - Joan Puigcerver (origin/main, origin/HEAD)
* 8594cb9 - (17 seconds ago) Menjar - Joan Puigcerver
* 113f1d4 - (27 seconds ago) Commit inicial - Joan Puigcerver

Treball amb branques

En aquests apunts, hem treballat les diferents operacions de sincronització entre repositoris sobre la branca principal main. Les mateixes operacions poden ser realitzades sobre altres branques de la mateixa manera.

Crear una branca

git branch <branca>

Canviar de branca

git checkout <branca>

Enllaçar una branca local amb una branca remota

Informació

Aquesta operació es realitzarà sobre la branca actual (HEAD).

git push [-u | --set-upstream] origin <branca>

Publicar canvis d'una branca

Informació

Aquesta operació es realitzarà sobre la branca actual (HEAD).

Prèviament cal haver enllaçat la branca local amb la branca remota.

git push

Incorporar canvis d'una branca remota

Informació

Aquesta operació es realitzarà sobre la branca actual (HEAD).

git pull [--rebase]

Eliminar una branca remota

Per eliminar una branca remota, cal utilitzar git push amb l'opció -d:

git push -d origin <ref>
  • ref: Referència a esborrar, que inclou branques i etiquetes.

Recursos addicionals

Bibliografia

Comentaris