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 @@ + + +
merge --squash
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
.
@TODO: Figura branques de publicació
+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:
+main
.develop
i a la branca principal main
.@TODO: Figura branques de correcció
feature/author
<
-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
.
Anna és l'encarregada de preparar la publicació de la versió 1.0.0.
Els passos que ha de seguir són:
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
+
-
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'
+
-
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)
+
-
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)
+
-
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)
+
-
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
+
-
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":" - Con\u00e9ixer els conceptes de control de versions mitjan\u00e7ant Git i el seu \u00fas en el context del desenvolupament de programari.
- Aprendre a utilitzar Git per a gestionar projectes de desenvolupament de programari.
- Con\u00e9ixer i aplicar estrat\u00e8gies de ramificaci\u00f3 en projectes de desenvolupament de programari col\u00b7laboratiu.
- Con\u00e9ixer i utilitzar plataformes d'allotjament de repositoris en l\u00ednia com GitHub.
- Con\u00e9ixer i utilitzar eines de gesti\u00f3 de projectes proporcionades per GitHub.
- Promoure la utilitzaci\u00f3 de Git i GitHub a l\u2019aula com a eina de treball col\u00b7laboratiu.
- Proporcionar estrat\u00e8gies als docents per incorporar la utilitzaci\u00f3 de Git i GitHub a l'aula.
"},{"location":"#continguts","title":"Continguts","text":" - Bloc 1: Introducci\u00f3 a Git
- Instal\u00b7laci\u00f3.
- Configuraci\u00f3.
- Estructura d'un repositori.
- Flux de treball.
- Inicialitzaci\u00f3 d'un repositori.
- Realitzaci\u00f3 de canvis:
add
i commit
.
- Bloc 2: Branques
- Creaci\u00f3 de branques.
- Navegar entre branques.
- Sincronitzaci\u00f3 de branques.
- Fusi\u00f3 de branques:
merge
. - Canvi de base:
rebase
. - Resoluci\u00f3 de conflictes.
- Bloc 3: Remots
- Creaci\u00f3 d'un repositori remot a GitHub.
- Configurar un repositori remot.
- M\u00e8todes d'autenticaci\u00f3.
- Associaci\u00f3 entre branques locals i remotes.
- Publicaci\u00f3 i incorporaci\u00f3 de canvis.
- Clonaci\u00f3 d'un repositori remot.
- Bloc 4: Git avan\u00e7at
- Eliminaci\u00f3 de canvis:
reset
i revert
. - Etiquetes:
tags
. - Reserva de canvis:
stash
. - C\u00f2pia de canvis:
cherry-pick
. - Fusi\u00f3 de canvis en un sol commit:
squash
.
- Bloc 5: Estrat\u00e8gies de ramificaci\u00f3
- Branques de prop\u00f2sit \u00fanic.
- M\u00e8todes d'integraci\u00f3 de branques de funcionalitat.
- Bloc 6: Gesti\u00f3 de projectes
- Forks i Pull Requests.
- Incid\u00e8ncies (issues).
- Debats (discussions).
- GitHub Projects.
- CI/CD amb GitHub Actions.
- GitHub Pages.
- Bloc 7: GitHub com a plataforma educativa
- Organitzacions a GitHub.
- GitHub Classroom.
- Estrat\u00e8gies per a l'\u00fas de Git i GitHub a l'aula.
"},{"location":"#dirigit-a","title":"Dirigit a","text":" - Professorat de la fam\u00edlia d'Inform\u00e0tica i Comunicacions.
"},{"location":"apunts/","title":"Apunts","text":" - Bloc 1: Introducci\u00f3 a Git
- Bloc 2: Branques
- Bloc 3: Remots
- Bloc 4: Git avan\u00e7at
- Bloc 5: Estrat\u00e8gies de ramificaci\u00f3
- Bloc 6: Gesti\u00f3 de projectes
"},{"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:
- Control de versions: Git realitza un seguiment de les modificacions als arxius al llarg del temps, la qual cosa permet als desenvolupadors vore i recuperar versions anteriors del seu codi. Aquesta caracter\u00edstica \u00e9s essencial per a treballar en equips i per a solucionar problemes o errors.
- Distribu\u00eft: Cada c\u00f2pia d'un repositori Git cont\u00e9 tot l'historial de canvis i pot operar de manera independent. Aix\u00f2 facilita el treball fora de l\u00ednia i la col\u00b7laboraci\u00f3 en equips distribu\u00efts.
- Branca i fusi\u00f3: Git facilita la creaci\u00f3 de branques (branching) per a desenvolupar caracter\u00edstiques o solucionar problemes sense afectar la branca principal. Despr\u00e9s, pots fusionar (merge) les branques de nou en la branca principal quan estiguen a punt.
- Gesti\u00f3 de conflictes: Git ofereix eines per a gestionar conflictes en cas que dues o m\u00e9s persones hagen realitzat canvis en la mateixa part del codi. Els desenvolupadors poden resoldre aquests conflictes manualment.
- Col\u00b7laboraci\u00f3: Git facilita la col\u00b7laboraci\u00f3 en projectes de codi obert o en equips, ja que permet a m\u00faltiples persones treballar en el mateix projecte de manera eficient. Plataformes com GitHub, GitLab i Bitbucket s'utilitzen comunment per a allotjar repositoris Git en l\u00ednia i col\u00b7laborar en projectes.
- Codi obert i gratu\u00eft: Git \u00e9s de codi obert i gratu\u00eft, la qual cosa significa que qualsevol pot utilitzar-lo sense cost i contribuir al desenvolupament de l'eina.
","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 notepad
. Ve instal\u00b7lat per defecte. - Notepad++.
gedit
. Ve instal\u00b7lat per defecte en Ubuntu. nano
. Editor de text b\u00e0sic per terminal. vim
. Editor de text avan\u00e7at per terminal. :w
per guardar. :q
per eixir.
- Visual Estudio Code
","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:
- Portabilitat: La terminal \u00e9s un entorn com\u00fa en tots els sistemes operatius i en qualsevol entorn de desenvolupament.
- Flexibilitat: La terminal permet realitzar operacions m\u00e9s avan\u00e7ades i personalitzades que les interf\u00edcies gr\u00e0fiques.
- Comprensi\u00f3: Permet entendre com funcionen les comandes de Git i els processos que realitza en el sistema.
","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
directory
: Directori on es vol inicialitzar el repositori. Si no s'especifica, s'utilitza el directori actual.
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
- L'opci\u00f3
-a
mostra tots els fitxers, inclosos els ocults que comencen amb un punt. - 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
-r
: Opci\u00f3 per a eliminar de manera recursiva. -f
: Opci\u00f3 per a for\u00e7ar l'eliminaci\u00f3 sense confirmaci\u00f3 dels elements protegits contra escriptura.
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:
- Directori de treball o Working directory: Directori o carpeta del sistema on s'emmagatzema localment els continguts del repositori.
- \u00c0rea de preparaci\u00f3 o Staging Area: \u00c0rea que s'utilitza per indicar quins canvis volen ser confirmats.
- Repositori local o Local repository: Repositori emmagatzemat localment on es queden registrats totes les versions i canvis realitzats en els fitxers del repositori, aix\u00ed com la informaci\u00f3 de les branques i les etiquetes.
","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:
- Crear un nou fitxer. El nou fitxer comen\u00e7a en l'estat Untracked, \u00e9s a dir, no est\u00e0 sotm\u00e8s a seguiment per Git.
- Modificar un fitxer amb seguiment. El fitxer modificat es trobar\u00e0 en l'estat Modified.
- Eliminar un fitxer amb seguiment. El fitxer eliminat es trobar\u00e0 en l'estat Deleted.
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:
git status
: https://git-scm.com/docs/git-status git add
: https://git-scm.com/docs/git-add git commit
: https://git-scm.com/docs/git-commit
","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
path
: Ruta del fitxer o directori que es vol afegir a l'\u00c0rea de Preparaci\u00f3.
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
-a
: Opcional. Afegeix tots els fitxers modificats i eliminats a l'\u00c0rea de Preparaci\u00f3 (sense necessitat de git add
). -m \"<message>\"
: Opcional. Missatge que descriu el canvi realitzat en el commit
.
Warning
Si no s'especifica el missatge amb -m
, s'obrir\u00e0 l'editor per defecte(1) per a introduir el missatge del commit
.
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:
- Autor: Persona que ha realitzat el
commit
. - Correu electr\u00f2nic: Correu electr\u00f2nic de l'autor.
- Data: Data i hora en qu\u00e8 s'ha realitzat el
commit
. - Missatge: Descripci\u00f3 dels canvis realitzats en el
commit
. - Identificador o
hash
: Codi \u00fanic generat autom\u00e0ticament que identifica el commit
. - Canvis: Llista de fitxers modificats, afegits o eliminats en el
commit
i els canvis realitzats en ells respecte de la versi\u00f3 anterior.
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
--staged
: Opcional. Mostra les difer\u00e8ncies entre l'\u00c0rea de Preparaci\u00f3 i el Repositori local. Si no s'indica, es compararan les difer\u00e8ncies entre el Directori de treball i el Repositori local. <path>
: Opcional. Fitxer o directori sobre el qual es vol comparar les difer\u00e8ncies. Si no s'indica, es compararan totes les difer\u00e8ncies.
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:
diff --git a/README.md b/README.md
: Mostra els fitxers comparats. a/README.md
: Fitxer original. b/README.md
: Fitxer modificat.
index 6d747b3..f3b3b3e 100644
: Mostra el hash dels fitxers comparats i els permisos. --- a/README.md
: Mostra la ruta del fitxer original. +++ b/README.md
: Mostra la ruta del fitxer modificat. @@ -1,2 +1,3 @@
: Mostra la posici\u00f3 de les l\u00ednies modificades. -1,2
: Els canvis comen\u00e7en a la l\u00ednia 1 i afecten 2 l\u00ednies en el fitxer original. +1,3
: Els canvis comen\u00e7en a la l\u00ednia 1 i afecten 3 l\u00ednies en el fitxer modificat.
Despr\u00e9s, es mostren les l\u00ednies modificades:
-
: L\u00ednia eliminada. +
: L\u00ednia afegida.
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
--staged
: Opcional. Descarta els canvis realitzats en l'\u00c0rea de Preparaci\u00f3. Si no s'indica, es descartaran els canvis realitzats en el Directori de treball. <path>
: Opcional. Fitxer o directori sobre el qual es vol descartar els canvis.
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
- 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
--global
: Opcional. Configura el par\u00e0metre de manera global per a tots els repositoris. Si no s'indica, la configuraci\u00f3 es realitzar\u00e0 \u00fanicament per al repositori actual.
Fixa't
Fixeu-vos que ja hem utilitzat aquesta comanda per configurar els seg\u00fcents aspectes:
- El nom (
user.name
) i el correu electr\u00f2nic (user.email
) de l'autor dels commit
- L'editor per defecte (
core.editor
).
","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:
- https://git-scm.com/docs/gitignore#_pattern_format
- https://www.w3schools.com/git/git_ignore.asp?remote=github
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
- 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":" - Curs de Git des de zero per MoureDev
- https://github.com/UnseenWizzard/git_training
","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":" - https://git-scm.com/book/en/v2
- https://github.com/UnseenWizzard/git_training
- https://www.theserverside.com/feature/Why-GitHub-renamed-its-master-branch-to-main
- https://stackoverflow.com/questions/35430584/how-is-the-git-hash-calculated
- https://en.wikipedia.org/wiki/Diff
","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
- 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: - No s'utilitza cap opci\u00f3.
- S'utilitza l'opci\u00f3
--list
.
M\u00e9s opcions:
[-a | --all]
: Opcional. Mostra totes les branques, incloent les remotes (es veur\u00e0 en el Bloc 3: Remots). [-v | --verbose]
: Opcional. Mostra m\u00e9s informaci\u00f3 de cada branca.
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
[-f | --force]
: Opcional. For\u00e7a la creaci\u00f3 de la branca. <nom>
: Nom de la nova branca.
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
- Documentaci\u00f3 de la ordre
git checkout
: https://git-scm.com/docs/git-checkout - Documentaci\u00f3 de la ordre
git switch
: https://git-scm.com/docs/git-switch
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
[-m | --move]
: Opcional. Reanomena la branca actual (on es troba el HEAD
). <nou_nom>
: Nou nom de la branca.
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
[-d | --delete]
: Opcional. Elimina la branca. [-f | --force]
: Opcional. For\u00e7a l'eliminaci\u00f3 de la branca. [-D]
: Opcional. Abreviatura de --delete --force
.
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
<branca>
: Branca que es vol fusionar amb la branca actual.
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
- 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 - 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
- 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
- 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
- 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:
- Editar el fitxer i resoldre manualment el conflicte.
- 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 - 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
- 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
- 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 - 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
- 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
- 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 - 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
- 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
- Hem eliminat les marques de conflicte i hem combinat els dos textos.
- Hem marcat el fitxer
README.md
com a resolt. - 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":" - Curs de Git des de zero per MoureDev
- https://github.com/UnseenWizzard/git_training
","tags":["conflictes","fast-forward","git branch","git checkout","git merge","git rebase","git switch","HEAD"]},{"location":"apunts/02_branques/#bibliografia","title":"Bibliografia","text":" - https://git-scm.com/book/en/v2
- https://github.com/UnseenWizzard/git_training
","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
- 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:
- Col\u00b7laboraci\u00f3: Permeten que diversos desenvolupadors treballen junts en un mateix projecte. Cada desenvolupador pot treballar en la seua c\u00f2pia local del repositori remot i, una vegada fetes les seues modificacions, pot pujar els canvis al repositori remot perqu\u00e8 altres membres de l'equip puguen veure i incorporar aquestes modificacions.
- C\u00f2pia de seguretat: Un repositori remot pot servir com a c\u00f2pia de seguretat del teu projecte. Si el teu sistema local es danya o es perd, encara tindr\u00e0s acc\u00e9s a la teua hist\u00f2ria completa i als fitxers del projecte mitjan\u00e7ant el repositori remot.
- Distribuci\u00f3: Els repositoris remots permeten distribuir el teu codi a altres llocs. Aix\u00f2 pot ser \u00fatil per compartir el teu codi amb altres persones o per desplegar el teu projecte en un servidor en l\u00ednia.
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:
-
GitHub: Servei d'allotjament de repositoris creat en 2008 i adquirit per Microsoft en 2018. \u00c9s el servei d'allotjament de repositoris de Git m\u00e9s utilitzat.
Ofereix una opci\u00f3 gratu\u00efta, que permet crear projectes p\u00fablics i privats, per\u00f2 amb algunes restriccions. Tamb\u00e9 ofereix plans de pagament per projectes empresarials.
-
GitLab: Servei d'allotjament de repositoris. GitLab \u00e9s 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.
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.
- Crea un compte a GitHub si no en tens un.
- Inicia la sessi\u00f3 amb el teu compte.
- Fes clic a l'opci\u00f3 \"New\" per crear un nou repositori.
- 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:
- Nom:
git_remots
- Descripci\u00f3: Repositori del Bloc: Remots del curs \"Introducci\u00f3 a Git i la seua aplicaci\u00f3 a l\u2019aula\"
- Visibilitat: P\u00fablic
- README: No
- .gitignore: No
- Llic\u00e8ncia: No
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.
-
Protocol HTTPS: Utilitza el protocol HTTPS per autenticar-se amb el servidor de GitHub.
Per utilitzar aquest m\u00e8tode, has de configurar les teues credencials d'acc\u00e9s a GitHub en el teu sistema local.
Aquesta autenticaci\u00f3 es pot realitzar mitjan\u00e7ant:
- Nom d'usuari i contrasenya: Des del 2021-08-13, aquest m\u00e8tode est\u00e0 deshabilitat a GitHub.
- Token d'acc\u00e9s personal (Personal Access Token o PAT): GitHub permet crear un token d'acc\u00e9s personal per autenticar-se amb el servidor de GitHub.
- Extensions de l'IDE: Algunes extensions de l'IDE que utilitzes poden gestionar l'autenticaci\u00f3 amb GitHub directament.
-
Protocol SSH: Utilitza el protocol SSH per autenticar-se amb el servidor de GitHub.
Per utilitzar aquest m\u00e8tode, has de configurar una clau SSH en el teu sistema local i afegir-la al teu compte de 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/#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
- GitHub: Managing your personal access tokens
- Stackoverflow: Message \"Support for password authentication was removed.\"
Per crear un token d'acc\u00e9s personal, segueix els seg\u00fcents passos:
- Inicia la sessi\u00f3 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\u00e9s personal:
- Access token (classic): Permet especificar els permisos que vols donar al token, que s\u00f3n globals per a tot el teu compte.
- Fine-grained token: Permet especificar els permisos que vols donar al token, que s\u00f3n espec\u00edfics per a un repositori o organitzaci\u00f3.
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:
- Mitjan\u00e7ant la URL: Pots afegir el teu token d'acc\u00e9s personal a la URL del repositori per autenticar-te amb el servidor de GitHub.
git clone https://<token>@github.com/<usuari>/<repositori>\n
-
Mitjan\u00e7ant la contrasenya: Pots utilitzar el teu token d'acc\u00e9s personal com a contrasenya per autenticar-te amb el servidor de GitHub.
jpuigcerver@fp:~ $ git clone https://github.com/<usuari>/<repositori>\nCloning into '<repositori>'...\nUsername for 'https://github.com': <usuari>\nPassword for 'https://<username>@github.com': <token>\n
Note
Per seguretat, no es mostrar\u00e0 res en el camp de la contrasenya.
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
- https://docs.github.com/en/github/authenticating-to-github/connecting-to-github-with-ssh
Per generar una clau SSH, segueix els seg\u00fcents passos.
TerminalInterf\u00edcie gr\u00e0fica -
Crea una clau SSH al teu sistema local mitjan\u00e7ant la comanda ssh-keygen
.
jpuigcerver@fp:~ $ ssh-keygen -t rsa -b 4096\nGenerating public/private rsa key pair.\nEnter file in which to save the key (/home/jpuigcerver/.ssh/id_rsa):\nEnter passphrase (empty for no passphrase):\nEnter same passphrase again:\nYour identification has been saved in /home/jpuigcerver/.ssh/id_rsa\n
-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\u00f2pia el contingut de la clau p\u00fablica (id_rsa.pub
) al portaretalls.
jpuigcerver@fp:~ $ cat ~/.ssh/id_rsa.pub\nssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAQC7GqFnEFQZK4+l3zvXF07hN/cMk5ZtJmMkHWAJyTYQ+pDwMXp9eQs\n+VASLlz9z+0Q3vnnXN4vBO/+2u29fKJ4YlrecDYtCDpEhMXCkaCv9/ggkru09j2rELFuAqER55lgEtRKTfLKAVFa3Ws\n2VV7zlTSAH2y8nVddzlJRE9Y1BAfH0+1hjpCe+vgGObBLyIGGsXwlmm3mwI7NKHuKCIVskIEX3F0jw668dBex+6VUtG\n...\n
- Obri el programa Git GUI.
-
Obri el di\u00e0leg a Help > Show SSH Key.
Figura 4: Men\u00fa di\u00e0leg 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\u00fablica al portaretalls.
Figura 5: Clau SSH generada amb Git GUI
Despr\u00e9s, configura la clau SSH al teu compte de GitHub seguint els seg\u00fcents passos:
- Inicia la sessi\u00f3 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\u00edtol per a la clau SSH.
- Enganxa el contingut de la clau p\u00fablica al camp Key.
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:
- 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\u00f3 detallada d'un repositori remot.
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
<nom>
: Nom o \u00e0lies 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.
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
- 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
- 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
<antic>
: Nom actual del repositori remot. <nou>
: Nou nom 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/#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
<nom>
: Nom del repositori remot a eliminar.
","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
-u|--set-upstream
: Configura la branca local perqu\u00e8 s'associe amb la branca remota. <remot>
: \u00c0lies del repositori remot (configurat amb git remote add
). <branca>
: Nom de la branca remota.
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
<url>
: URL del repositori remot. Pot ser una URL HTTPS o SSH. <directori>
: Opcional. Nom del directori on es copiar\u00e0 el repositori. Per defecte, es crea un directori amb el nom del repositori remot.
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
<options>
: Opcions de la comanda. <remot>
: \u00c0lies del repositori remot. Per defecte, s'utilitza origin
.
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:
git fetch
: Actualitza la informaci\u00f3 de les branques remotes al nostre repositori local. git merge origin/<branca>
: Incorpora els canvis de la branca remota a la branca local.
Figura 11: Incorporaci\u00f3 de canvis git pull [<options>] [<remot> [<branca>]]\n
<options>
: Opcions de la comanda. <remot>
: \u00c0lies del repositori remot. Per defecte, s'utilitza la configuraci\u00f3 de la branca actual. <branca>
: Nom de la branca remota. Per defecte, s'utilitza la configuraci\u00f3 de la branca actual.
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:
- Poden produ\u00efr conflictes. Si es produeixen, caldr\u00e0 resoldre'ls manualment.
- Executar directament
git pull
generar\u00e0 un commit de fusi\u00f3, que pot ser no \u00e9s desitjable si es vol mantenir una hist\u00f2ria lineal.
Consell
Per evitar la fusi\u00f3 de branques divergents en git pull
, es pot fer el seg\u00fcent:
-
git pull --ff-only
: Incorpora els canvis de la branca remota nom\u00e9s si es pot fer una fusi\u00f3 directa (fast-forward).
Git pot ser configurat perqu\u00e8 nom\u00e9s permeta aquest tipus de fusi\u00f3 en la comanda git pull
.
git config --global pull.ff only\n
-
git pull --rebase
: Incorpora els canvis de la branca remota mitjan\u00e7ant un rebase, \u00e9s a dir, aplica els canvis de la branca local despr\u00e9s dels canvis de la branca remota.
Aquest comportament tamb\u00e9 es pot configurar per defecte en la comanda git pull
.
git config --global pull.rebase true\n
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
- 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":" - Curs de Git des de zero per MoureDev
- https://github.com/UnseenWizzard/git_training
","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":" - https://git-scm.com/book/en/v2
- https://github.com/UnseenWizzard/git_training
","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:
- Creaci\u00f3 de branques de funcionalitat
feature/*
: Es crea una branca independent per desenvolupar cada funcionalitat. - Branca de desenvolupament
develop
: Estat del projecte on s'incorporen les funcionalitats acabades, per\u00f2 que encara no han segut publicades. - Branca principal
main
: Branca on es troba la versi\u00f3 estable del projecte. - Branca de publicaci\u00f3
release/*
: Branca on es prepara la versi\u00f3 final del projecte abans de publicar-la. - Branca de correcci\u00f3
hotfix/*
: Branca per corregir errors en la versi\u00f3 estable del projecte.
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:
- Branca principal (
main
): Branca on es troba la versi\u00f3 publicada i estable del projecte. - Branca de desenvolupament (
develop
): Branca on es troba l'estat actual del projecte, on s'incorporen les funcionalitats acabades. -
Branques de funcionalitats (feature/*
): Per cada nova funcionalitat es crea una branca independent, on es codifica i es prova la nova funcionalitat.
- Es creen a partir de la branca
develop
. - S'integren a la branca
develop
una vegada acabades. - Es poden eliminar despr\u00e9s de ser integrades.
Info
Dep\u00e9n de l'estrat\u00e8gia triada, el proc\u00e9s d'integraci\u00f3 es realitzar\u00e0 de diferents maneres.
-
Branques de publicaci\u00f3 (release/*
): Branca on es preparen els canvis per poder publicar una nova versi\u00f3 del projecte.
- Es creen a partir de la branca
develop
. - Es fusionen amb les branques
develop
i main
una vegada acabades. - Es poden eliminar una vegada fusionades.
- Normalment, es crea una etiqueta amb la versi\u00f3 publicada.
-
Branques de correcci\u00f3 (hotfix/*
): Branca per corregir errors cr\u00edtics en la versi\u00f3 publicada del projecte.
- Es creen a partir de la branca
main
. - Es fusionen amb les branques
develop
i main
una vegada acabades.
Danger
Aquestes branques sols han de ser utilitzades per corregir errors cr\u00edtics que afecten la versi\u00f3 publicada del projecte i han de corregir-se inmediatament.
Aquestes branques poden dificultar el flux de treball, sobretot si es tracta de mantindra una hist\u00f2ria lineal del projecte.
","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:
- Proporciona un flux de treball clar i coherent per gestionar els canvis de codi.
- Permet el desenvolupament paral\u00b7lel i la prova de diferents funcions i correccions d'errors.
- Ajuda a mantenir un codi estable i preparat per posat en producci\u00f3.
- Facilita la col\u00b7laboraci\u00f3 entre els membres de l'equip.
- Mant\u00e9 un ordre coherent en la hist\u00f2ria del projecte.
El principal desavantatge \u00e9s:
- Pot suposar una sobrec\u00e0rrega en projectes xicotets o amb pocs membres.
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:
-
Utilitzar noms de branques descriptius i coherents, que indiquen clarament el seu prop\u00f2sit i contingut. Una bona manera de fer-ho \u00e9s utilitzar un prefix com\u00fa per cada tipus de branca.
Tip
Pots organitzar les branques en \"directoris\" utilitzant el mateix prefixe en el nom de la branca, separat per una barra /
.
feature/frontend/landing-page
o feature/backend/user-authentication
, com exemple de branques de funcionalitats. release/v1.0.0
o release/v1.1.0
, com exemple de branques de publicaci\u00f3. hotfix/bug-123
, com exemple de branques de correcci\u00f3.
-
Incorporeu els canvis de develop
a les branques feature/*
de forma regular, per mantindre-les actualitzades amb els canvis del projecte i evitar resolucions de conflictes inmenses en el futur.
","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.
- Sincronitzar l'estat del repositori local amb el remot amb
git fetch
. -
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
-
Actualitzar la branca feature/*
amb els nous canvis de develop
.
- Incorporar els canvis de la branca
feature/*
amb la branca develop
amb la t\u00e8cnica triada. -
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
.
-
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:
- Mant\u00e9 tot l'hist\u00f2ric de canvis.
- Permet revertir una funcionalitat f\u00e0cilment, ja que sols cal revertir un \u00fanic commit.
El principal desavantatge \u00e9s:
- No mant\u00e9 una hist\u00f2ria lineal.
- En projectes amb moltes funcionalitats, la hist\u00f2ria pot ser dif\u00edcil de seguir.
","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:
- Mant\u00e9 la hist\u00f2ria lineal.
- Permet resoldre els conflictes f\u00e0cilment en el proc\u00e9s de
rebase
.
El principal desavantatge \u00e9s:
- Revertir una funcionalitat \u00e9s complicat, ja que cal revertir m\u00faltiples commits.
","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:
- Mant\u00e9 la hist\u00f2ria neta i semi-lineal, on les funcionalitats s'integren una despr\u00e9s de l'altra.
- Permet revertir una funcionalitat f\u00e0cilment, ja que sols cal revertir un \u00fanic commit.
","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:
- Mant\u00e9 la hist\u00f2ria lineal.
- Permet revertir una funcionalitat f\u00e0cilment, ja que sols cal revertir un \u00fanic commit.
- Facilita la revisi\u00f3 de codi, ja que tots els canvis es troben en un \u00fanic commit.
- Evita la sobrec\u00e0rrega de commits en la branca de desenvolupament
develop
. - Els desenvolupador poden despreocupar-se de com queda la hist\u00f2ria de la branca de funcionalitat, on es poden permetre escriure microcommits, ja que aquests desapareixeran una vegada s'hagen integrat es canvis.
El principal desavantatge \u00e9s:
- No mant\u00e9 tot l'hist\u00f2ric de canvis.
- Dificulta la revisi\u00f3 de canvis individuals.
","tags":["gitflow","develop","feature","release","hotfix"]},{"location":"apunts/050_estrategies_ramificacio/#bibliografia","title":"Bibliografia","text":" - Apunts de Desplegament d'Aplicacions Web de Lorenzo Gonz\u00e1lez Gasc\u00f3n
- War of the Git Flows
- Gitflow: A successful Git branching model
- OneFlow
- Trunk Based Development
","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
- 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.
- Anna treballar\u00e0 en la funcionalitat
feature/readme
, que consistir\u00e0 a afegir una descripci\u00f3 del projecte al README. - Pau treballar\u00e0 en la funcionalitat
feature/license
, que consistir\u00e0 a afegir una llic\u00e8ncia al projecte. - Mar treballar\u00e0 en la funcionalitat
feature/author
, que consistir\u00e0 a afegir el nom de l'autors del projecte al README.
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:
- Crear la branca
feature/readme
a partir de develop
. - Realitzar els canvis pertinents.
- Publicar la branca
feature/readme
al repositori remot.
"},{"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:
- Crear la branca
feature/license
a partir de develop
. - Realitzar els canvis pertinents.
- Publicar la branca
feature/license
al repositori remot.
"},{"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:
- Crear la branca
feature/author
a partir de develop
. - Realitzar els canvis pertinents.
- Publicar la branca
feature/author
al repositori remot.
"},{"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:
-
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
-
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
-
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
- L'opci\u00f3
--no-edit
evita obrir l'editor de text i deixa el missatge de commit per defecte.
-
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
-
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
-
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:
-
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
-
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
-
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
- L'opci\u00f3
--no-edit
evita obrir l'editor de text i deixa el missatge de commit per defecte.
-
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
-
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
-
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:
-
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
-
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
-
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
- L'opci\u00f3
--no-edit
evita obrir l'editor de text i deixa el missatge de commit per defecte. - S'han esborrat les marques de conflicte manualment.
-
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
-
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
-
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:
- Actualitzar la versi\u00f3 del projecte.
- Realitzar proves de validaci\u00f3.
- Corregir errors que han pogut passar desapercebuts.
- Preparar par\u00e0metres de configuraci\u00f3 espec\u00edfics per a la publicaci\u00f3.
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:
-
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
-
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
-
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
-
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
-
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
-
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
-
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":" - Exercici Bloc 1: Introducci\u00f3 a Git
- Exercici Bloc 2: Branques
- Exercici Bloc 3: Remots
"},{"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:
- Con\u00e9ixer com crear i inicialitzar un repositori de Git localment.
- Con\u00e9ixer com afegir fitxers al repositori local.
- Con\u00e9ixer com realitzar canvis en el repositori local.
- Con\u00e9ixer com consultar l'estat del repositori local.
- Con\u00e9ixer com consultar la hist\u00f2ria de canvis del repositori local.
- Con\u00e9ixer les configuracions b\u00e0siques de Git.
"},{"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.
- Crea un directori anomenat
bloc1_exercici
en la teua carpeta de treball. - Inicialitza un repositori de Git en aquest directori.
- Crea un fitxer anomenat
llibres.txt
i afegeix tres llibres que t'agraden. - Fes un primer commit. Tria un missatge significatiu.
- Afegeix un altre llibre a
llibres.txt
. - Fes un segon commit.
- Crea un fitxer anomenat
musica.txt
i afegeix tres can\u00e7ons que t'agraden. - Crea un fitxer anomenat
pelicules.txt
i afegeix tres pel\u00b7l\u00edcules que t'agraden. - Fes un tercer commit que sols incloga el fitxer
musica.txt
. - Crea un fitxer anomenat
series.txt
i afegeix tres s\u00e8ries que t'agraden. - Fes un quart commit que incloga els fitxers
pelicules.txt
i series.txt
. - Modifica el fitxer
llibres.txt
per a eliminar un dels llibres. - Fes un cinqu\u00e9 commit.
- Modifica el fitxer
pelicules.txt
per a afegir una pel\u00b7l\u00edcula. - Desf\u00e9s aquest canvi.
- Afegeix el fitxer
{data}.log
amb qualsevol contingut. {data}
\u00e9s la data actual en format YYYYMMDD
.
- Configura el repositori perqu\u00e8 ignore els fitxers amb extensi\u00f3
.log
. - Fes un commit amb aquesta configuraci\u00f3.
- Crea la carpeta
tmp
i c\u00f2pia tots els fitxers de text a aquesta carpeta. - Configura el repositori perqu\u00e8 ignore la carpeta
tmp
. - Fes un commit amb aquesta configuraci\u00f3.
- Comprova la hist\u00f2ria de canvis del repositori.
"},{"location":"exercicis/01_introduccio/#bibliografia","title":"Bibliografia","text":" - Basat en l'exercici de la sessi\u00f3 1 del curs Gesti\u00f3 de la tasca docent con GitHub de Pedro Prieto.
"},{"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:
- Con\u00e9ixer com crear i eliminar branques.
- Con\u00e9ixer com realitzar canvis en una branca.
- Con\u00e9ixer com canviar de branca.
- Con\u00e9ixer com fusionar branques.
- Con\u00e9ixer com canviar la base d'una branca.
- Con\u00e9ixer com resoldre conflictes en la fusi\u00f3 de branques.
- Con\u00e9ixer com resoldre conflictes en el canvi de base d'una branca.
"},{"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.
- Revisa Hist\u00f2ric de canvis (git log) per veure la configuraci\u00f3 de l'\u00e0lies
git lga
.
- Crea un directori anomenat
bloc2_exercici
en la teua carpeta de treball. - Inicialitza un repositori de Git en aquest directori.
- Crea un fitxer anomenat
llibres.txt
i afegeix tres llibres que t'agraden. - Fes un primer commit. Tria un missatge significatiu.
- Reanomena la branca principal a
main
.
"},{"location":"exercicis/02_branques/#fusio-directa","title":"Fusi\u00f3 directa","text":" - Crea una branca anomenada
musica
i situa't en aquesta branca. - Crea un fitxer anomenat
musica.txt
i afegeix tres can\u00e7ons que t'agraden. - Fes un commit en aquesta branca.
- Fusiona la branca
musica
amb la branca main
.
"},{"location":"exercicis/02_branques/#fusio-de-branques-divergents","title":"Fusi\u00f3 de branques divergents","text":" - Des de la branca
main
, crea les branques mes-llibres
i mes-musica
. - Des de la branca
mes-llibres
: - Afegeix un llibre a
llibres.txt
. - Fes un commit.
-
Des de la branca mes-musica
:
- Afegeix una can\u00e7\u00f3 a
musica.txt
. - Fes un commit.
-
Fusiona la branca mes-llibres
amb la branca main
.
- 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":" - Des de la branca
main
, crea les branques llibres-ciencia-ficcio
i llibres-fantasia
. - Des de la branca
llibres-ciencia-ficcio
: - Afegeix un llibre de ci\u00e8ncia-ficci\u00f3 a
llibres.txt
. - Fes un commit.
- Des de la branca
llibres-fantasia
: - Afegeix un llibre de fantasia a
llibres.txt
. - Fes un commit.
- Fusiona la branca
llibres-ciencia-ficcio
amb la branca main
. - Fusiona la branca
llibres-fantasia
amb la branca main
.
"},{"location":"exercicis/02_branques/#eliminacio-duna-branca","title":"Eliminaci\u00f3 d'una branca","text":" - Des de la branca
main
, crea una branca anomenada series
. - Des de la branca
main
, crea una branca anomenada pelicules
. - Des de la branca
series
: - Afegeix una s\u00e8rie a
series.txt
. - Fes un commit.
- Elimina la branca
pelicules
. - 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":" - Des de la branca
main
, crea una branca anomenada series
. - Des de la branca
main
, crea una branca anomenada pelicules
. - Des de la branca
series
: - Afegeix una s\u00e8rie a
series.txt
. - Fes un commit.
- Des de la branca
pelicules
: - Afegeix una pel\u00b7l\u00edcula a
pelicules.txt
. - Fes un commit.
- Fusiona la branca
pelicules
amb la branca main
. - Canvia la base de la branca
series
a la branca main
. - 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":" - Des de la branca
main
, crea una branca anomenada series-accio
i series-drama
. - Des de la branca
series-accio
: - Afegeix una s\u00e8rie d'acci\u00f3 a
series.txt
. - Fes un commit.
- Des de la branca
series-drama
: - Afegeix una s\u00e8rie de drama a
series.txt
. - Fes un commit.
- Fusiona la branca
series-accio
amb la branca main
. - Canvia la base de la branca
series-drama
a la branca main
. - 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:
- Con\u00e9ixer com crear un repositori remot a GitHub.
- Con\u00e9ixer com configurar un repositori remot.
- Con\u00e9ixer com associar una branca local a una branca remota.
- Con\u00e9ixer com publicar els canvis d'una branca al repositori remot.
- Con\u00e9ixer com sincronitzar l'estat dels repositoris local i remot.
- Con\u00e9ixer com incorporar canvis d'una branca remota a una branca local.
- Con\u00e9ixer com clonar un repositori remot.
- Con\u00e9ixer com eliminar una branca remota.
"},{"location":"exercicis/03_remots/#exercici","title":"Exercici","text":""},{"location":"exercicis/03_remots/#creacio-repositori-remot","title":"Creaci\u00f3 repositori remot","text":" - Crea un compte a GitHub si no en tens un.
- Crea un repositori remot anomenat
bloc3_exercici
completament buit: - No afegisques cap fitxer (README.md, LICENCE, .gitignore, etc.).
"},{"location":"exercicis/03_remots/#creacio-repositori-local","title":"Creaci\u00f3 repositori local","text":" - Crea un directori anomenat
bloc3_exercici
en la teua carpeta de treball. - Inicialitza un repositori de Git en aquest directori.
- Crea un fitxer anomenat
llibres.txt
i afegeix tres llibres que t'agraden. - Fes un primer commit.
- Reanomena la branca principal a
main
.
"},{"location":"exercicis/03_remots/#enllac-amb-repositori-remot","title":"Enlla\u00e7 amb repositori remot","text":" - Configura el repositori local per afegir el repositori remot creat anteriorment com a
origin
. - 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":" - Clona el repositori remot a un directori anomenat
bloc3_exercici_clone
en la teua carpeta de treball. - Comprova que el directori
bloc3_exercici_clone
cont\u00e9 el fitxer llibres.txt
. - 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
:
- Afegeix la pel\u00b7l\u00edcula La vida de Brian al fitxer
pelicules.txt
. - Realitza un commit.
- 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
:
- Sincronitza el repositori local amb el repositori remot amb
git fetch
. - Observa el
log
de canvis. - 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
:
- Afegeix una pel\u00b7l\u00edcula a
pelicules.txt
. - Realitza un commit.
- Publica la branca
main
al repositori remot.
Des del repositori bloc3_exercici_clone
:
- Afegeix la pel\u00b7l\u00edcula Monty Python and the Holy Grail al fitxer
pelicules.txt
. - Realitza un commit.
-
Tracta de publicar la branca main
al repositori remot.
Question
Per qu\u00e8 no pots publicar la branca main
al repositori remot?
-
Incorpora els canvis de la branca origin/main
a la branca main
local.
- Resol els conflictes que puguen apar\u00e9ixer.
- 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
:
- Incorpora els canvis de la branca
origin/main
a la branca main
local. - Afegeix una altra pel\u00b7l\u00edcula a
pelicules.txt
. - Realitza un commit.
- Publica la branca
main
al repositori remot.
Des del repositori bloc3_exercici_clone
:
- Sinconitza el repositori local amb el repositori remot (
git fetch
). - Afegeix la pel\u00b7l\u00edcula El sentido de la vida al fitxer
pelicules.txt
. - Realitza un commit.
- Incorpora els canvis de la branca
origin/main
a la branca main
local amb un canvi de base. - Resol els conflictes que puguen apar\u00e9ixer.
- Publica la branca
main
al repositori remot.
"},{"location":"exercicis/03_remots/#branques-i-remots","title":"Branques i remots","text":"Des del repositori bloc3_exercici
:
- Incorpora els canvis de la branca
origin/main
a la branca main
local. - Crea una branca anomenada
musica
. - Afegeix una can\u00e7\u00f3 a
musica.txt
. - Realitza un commit.
- Publica la branca
musica
al repositori remot. - Comprova que la branca
musica
est\u00e0 publicada al repositori remot. - Elimina la branca local
musica
. - 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:
- Con\u00e9ixer les diferents estrat\u00e8gies de ramificaci\u00f3.
- Con\u00e9ixer com aplicar les diferents estrat\u00e8gies de ramificaci\u00f3.
- Identificar els principals avantatges i desavantatges de cada estrat\u00e8gia de ramificaci\u00f3.
- Identificar i saber solucionar els problemes associats a cada estrat\u00e8gia de ramificaci\u00f3.
"},{"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":" - Bloc 1: Introducci\u00f3 a Git
- Bloc 2: Branques
- Bloc 3.1: M\u00e8todes d'autenticaci\u00f3 a GitHub
- Bloc 3.2: Remots
- [[bloc4-slides]]
- [[bloc5-slides]]
- [[bloc6-slides]]
"},{"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/
- Control de versions
- Facilita la col\u00b7laboraci\u00f3
- Ramificaci\u00f3 i gesti\u00f3 de conflictes
"},{"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":" - Nom d'usuari i contrasenya (2021)
- (HTTPS) Personal Access Token (PAT)
- (SSH) Clau SSH
"},{"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
- Classic
- Fine-grained
git config --global credential.helper store\n
"},{"location":"videos/031_remots_auth_slides/#clau-ssh","title":"Clau SSH","text":" - Generar clau SSH localment
- Afegir clau a GitHub
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
- (HTTPS) Personal Access Token (PAT)
- (SSH) Clau SSH
"},{"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":" - Con\u00e9ixer els conceptes de control de versions mitjan\u00e7ant Git i el seu \u00fas en el context del desenvolupament de programari.
- Aprendre a utilitzar Git per a gestionar projectes de desenvolupament de programari.
- Con\u00e9ixer i aplicar estrat\u00e8gies de ramificaci\u00f3 en projectes de desenvolupament de programari col\u00b7laboratiu.
- Con\u00e9ixer i utilitzar plataformes d'allotjament de repositoris en l\u00ednia com GitHub.
- Con\u00e9ixer i utilitzar eines de gesti\u00f3 de projectes proporcionades per GitHub.
- Promoure la utilitzaci\u00f3 de Git i GitHub a l\u2019aula com a eina de treball col\u00b7laboratiu.
- Proporcionar estrat\u00e8gies als docents per incorporar la utilitzaci\u00f3 de Git i GitHub a l'aula.
"},{"location":"#continguts","title":"Continguts","text":" - Bloc 1: Introducci\u00f3 a Git
- Instal\u00b7laci\u00f3.
- Configuraci\u00f3.
- Estructura d'un repositori.
- Flux de treball.
- Inicialitzaci\u00f3 d'un repositori.
- Realitzaci\u00f3 de canvis:
add
i commit
.
- Bloc 2: Branques
- Creaci\u00f3 de branques.
- Navegar entre branques.
- Sincronitzaci\u00f3 de branques.
- Fusi\u00f3 de branques:
merge
. - Canvi de base:
rebase
. - Resoluci\u00f3 de conflictes.
- Bloc 3: Remots
- Creaci\u00f3 d'un repositori remot a GitHub.
- Configurar un repositori remot.
- M\u00e8todes d'autenticaci\u00f3.
- Associaci\u00f3 entre branques locals i remotes.
- Publicaci\u00f3 i incorporaci\u00f3 de canvis.
- Clonaci\u00f3 d'un repositori remot.
- Bloc 4: Git avan\u00e7at
- Eliminaci\u00f3 de canvis:
reset
i revert
. - Etiquetes:
tags
. - Reserva de canvis:
stash
. - C\u00f2pia de canvis:
cherry-pick
. - Fusi\u00f3 de canvis en un sol commit:
squash
.
- Bloc 5: Estrat\u00e8gies de ramificaci\u00f3
- Branques de prop\u00f2sit \u00fanic.
- M\u00e8todes d'integraci\u00f3 de branques de funcionalitat.
- Bloc 6: Gesti\u00f3 de projectes
- Forks i Pull Requests.
- Incid\u00e8ncies (issues).
- Debats (discussions).
- GitHub Projects.
- CI/CD amb GitHub Actions.
- GitHub Pages.
- Bloc 7: GitHub com a plataforma educativa
- Organitzacions a GitHub.
- GitHub Classroom.
- Estrat\u00e8gies per a l'\u00fas de Git i GitHub a l'aula.
"},{"location":"#dirigit-a","title":"Dirigit a","text":" - Professorat de la fam\u00edlia d'Inform\u00e0tica i Comunicacions.
"},{"location":"apunts/","title":"Apunts","text":" - Bloc 1: Introducci\u00f3 a Git
- Bloc 2: Branques
- Bloc 3: Remots
- Bloc 4: Git avan\u00e7at
- Bloc 5: Estrat\u00e8gies de ramificaci\u00f3
- Bloc 6: Gesti\u00f3 de projectes
"},{"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:
- Control de versions: Git realitza un seguiment de les modificacions als arxius al llarg del temps, la qual cosa permet als desenvolupadors vore i recuperar versions anteriors del seu codi. Aquesta caracter\u00edstica \u00e9s essencial per a treballar en equips i per a solucionar problemes o errors.
- Distribu\u00eft: Cada c\u00f2pia d'un repositori Git cont\u00e9 tot l'historial de canvis i pot operar de manera independent. Aix\u00f2 facilita el treball fora de l\u00ednia i la col\u00b7laboraci\u00f3 en equips distribu\u00efts.
- Branca i fusi\u00f3: Git facilita la creaci\u00f3 de branques (branching) per a desenvolupar caracter\u00edstiques o solucionar problemes sense afectar la branca principal. Despr\u00e9s, pots fusionar (merge) les branques de nou en la branca principal quan estiguen a punt.
- Gesti\u00f3 de conflictes: Git ofereix eines per a gestionar conflictes en cas que dues o m\u00e9s persones hagen realitzat canvis en la mateixa part del codi. Els desenvolupadors poden resoldre aquests conflictes manualment.
- Col\u00b7laboraci\u00f3: Git facilita la col\u00b7laboraci\u00f3 en projectes de codi obert o en equips, ja que permet a m\u00faltiples persones treballar en el mateix projecte de manera eficient. Plataformes com GitHub, GitLab i Bitbucket s'utilitzen comunment per a allotjar repositoris Git en l\u00ednia i col\u00b7laborar en projectes.
- Codi obert i gratu\u00eft: Git \u00e9s de codi obert i gratu\u00eft, la qual cosa significa que qualsevol pot utilitzar-lo sense cost i contribuir al desenvolupament de l'eina.
","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 notepad
. Ve instal\u00b7lat per defecte. - Notepad++.
gedit
. Ve instal\u00b7lat per defecte en Ubuntu. nano
. Editor de text b\u00e0sic per terminal. vim
. Editor de text avan\u00e7at per terminal. :w
per guardar. :q
per eixir.
- Visual Estudio Code
","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:
- Portabilitat: La terminal \u00e9s un entorn com\u00fa en tots els sistemes operatius i en qualsevol entorn de desenvolupament.
- Flexibilitat: La terminal permet realitzar operacions m\u00e9s avan\u00e7ades i personalitzades que les interf\u00edcies gr\u00e0fiques.
- Comprensi\u00f3: Permet entendre com funcionen les comandes de Git i els processos que realitza en el sistema.
","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
directory
: Directori on es vol inicialitzar el repositori. Si no s'especifica, s'utilitza el directori actual.
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
- L'opci\u00f3
-a
mostra tots els fitxers, inclosos els ocults que comencen amb un punt. - 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
-r
: Opci\u00f3 per a eliminar de manera recursiva. -f
: Opci\u00f3 per a for\u00e7ar l'eliminaci\u00f3 sense confirmaci\u00f3 dels elements protegits contra escriptura.
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:
- Directori de treball o Working directory: Directori o carpeta del sistema on s'emmagatzema localment els continguts del repositori.
- \u00c0rea de preparaci\u00f3 o Staging Area: \u00c0rea que s'utilitza per indicar quins canvis volen ser confirmats.
- Repositori local o Local repository: Repositori emmagatzemat localment on es queden registrats totes les versions i canvis realitzats en els fitxers del repositori, aix\u00ed com la informaci\u00f3 de les branques i les etiquetes.
","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:
- Crear un nou fitxer. El nou fitxer comen\u00e7a en l'estat Untracked, \u00e9s a dir, no est\u00e0 sotm\u00e8s a seguiment per Git.
- Modificar un fitxer amb seguiment. El fitxer modificat es trobar\u00e0 en l'estat Modified.
- Eliminar un fitxer amb seguiment. El fitxer eliminat es trobar\u00e0 en l'estat Deleted.
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:
git status
: https://git-scm.com/docs/git-status git add
: https://git-scm.com/docs/git-add git commit
: https://git-scm.com/docs/git-commit
","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
path
: Ruta del fitxer o directori que es vol afegir a l'\u00c0rea de Preparaci\u00f3.
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
-a
: Opcional. Afegeix tots els fitxers modificats i eliminats a l'\u00c0rea de Preparaci\u00f3 (sense necessitat de git add
). -m \"<message>\"
: Opcional. Missatge que descriu el canvi realitzat en el commit
.
Warning
Si no s'especifica el missatge amb -m
, s'obrir\u00e0 l'editor per defecte(1) per a introduir el missatge del commit
.
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:
- Autor: Persona que ha realitzat el
commit
. - Correu electr\u00f2nic: Correu electr\u00f2nic de l'autor.
- Data: Data i hora en qu\u00e8 s'ha realitzat el
commit
. - Missatge: Descripci\u00f3 dels canvis realitzats en el
commit
. - Identificador o
hash
: Codi \u00fanic generat autom\u00e0ticament que identifica el commit
. - Canvis: Llista de fitxers modificats, afegits o eliminats en el
commit
i els canvis realitzats en ells respecte de la versi\u00f3 anterior.
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
--staged
: Opcional. Mostra les difer\u00e8ncies entre l'\u00c0rea de Preparaci\u00f3 i el Repositori local. Si no s'indica, es compararan les difer\u00e8ncies entre el Directori de treball i el Repositori local. <path>
: Opcional. Fitxer o directori sobre el qual es vol comparar les difer\u00e8ncies. Si no s'indica, es compararan totes les difer\u00e8ncies.
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:
diff --git a/README.md b/README.md
: Mostra els fitxers comparats. a/README.md
: Fitxer original. b/README.md
: Fitxer modificat.
index 6d747b3..f3b3b3e 100644
: Mostra el hash dels fitxers comparats i els permisos. --- a/README.md
: Mostra la ruta del fitxer original. +++ b/README.md
: Mostra la ruta del fitxer modificat. @@ -1,2 +1,3 @@
: Mostra la posici\u00f3 de les l\u00ednies modificades. -1,2
: Els canvis comen\u00e7en a la l\u00ednia 1 i afecten 2 l\u00ednies en el fitxer original. +1,3
: Els canvis comen\u00e7en a la l\u00ednia 1 i afecten 3 l\u00ednies en el fitxer modificat.
Despr\u00e9s, es mostren les l\u00ednies modificades:
-
: L\u00ednia eliminada. +
: L\u00ednia afegida.
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
--staged
: Opcional. Descarta els canvis realitzats en l'\u00c0rea de Preparaci\u00f3. Si no s'indica, es descartaran els canvis realitzats en el Directori de treball. <path>
: Opcional. Fitxer o directori sobre el qual es vol descartar els canvis.
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
- 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
--global
: Opcional. Configura el par\u00e0metre de manera global per a tots els repositoris. Si no s'indica, la configuraci\u00f3 es realitzar\u00e0 \u00fanicament per al repositori actual.
Fixa't
Fixeu-vos que ja hem utilitzat aquesta comanda per configurar els seg\u00fcents aspectes:
- El nom (
user.name
) i el correu electr\u00f2nic (user.email
) de l'autor dels commit
- L'editor per defecte (
core.editor
).
","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:
- https://git-scm.com/docs/gitignore#_pattern_format
- https://www.w3schools.com/git/git_ignore.asp?remote=github
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
- 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":" - Curs de Git des de zero per MoureDev
- https://github.com/UnseenWizzard/git_training
","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":" - https://git-scm.com/book/en/v2
- https://github.com/UnseenWizzard/git_training
- https://www.theserverside.com/feature/Why-GitHub-renamed-its-master-branch-to-main
- https://stackoverflow.com/questions/35430584/how-is-the-git-hash-calculated
- https://en.wikipedia.org/wiki/Diff
","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
- 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: - No s'utilitza cap opci\u00f3.
- S'utilitza l'opci\u00f3
--list
.
M\u00e9s opcions:
[-a | --all]
: Opcional. Mostra totes les branques, incloent les remotes (es veur\u00e0 en el Bloc 3: Remots). [-v | --verbose]
: Opcional. Mostra m\u00e9s informaci\u00f3 de cada branca.
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
[-f | --force]
: Opcional. For\u00e7a la creaci\u00f3 de la branca. <nom>
: Nom de la nova branca.
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
- Documentaci\u00f3 de la ordre
git checkout
: https://git-scm.com/docs/git-checkout - Documentaci\u00f3 de la ordre
git switch
: https://git-scm.com/docs/git-switch
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
[-m | --move]
: Opcional. Reanomena la branca actual (on es troba el HEAD
). <nou_nom>
: Nou nom de la branca.
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
[-d | --delete]
: Opcional. Elimina la branca. [-f | --force]
: Opcional. For\u00e7a l'eliminaci\u00f3 de la branca. [-D]
: Opcional. Abreviatura de --delete --force
.
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
<branca>
: Branca que es vol fusionar amb la branca actual.
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
- 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 - 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
- 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
- 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
- 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:
- Editar el fitxer i resoldre manualment el conflicte.
- 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 - 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
- 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
- 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 - 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
- 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
- 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 - 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
- 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
- Hem eliminat les marques de conflicte i hem combinat els dos textos.
- Hem marcat el fitxer
README.md
com a resolt. - 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":" - Curs de Git des de zero per MoureDev
- https://github.com/UnseenWizzard/git_training
","tags":["conflictes","fast-forward","git branch","git checkout","git merge","git rebase","git switch","HEAD"]},{"location":"apunts/02_branques/#bibliografia","title":"Bibliografia","text":" - https://git-scm.com/book/en/v2
- https://github.com/UnseenWizzard/git_training
","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
- 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:
- Col\u00b7laboraci\u00f3: Permeten que diversos desenvolupadors treballen junts en un mateix projecte. Cada desenvolupador pot treballar en la seua c\u00f2pia local del repositori remot i, una vegada fetes les seues modificacions, pot pujar els canvis al repositori remot perqu\u00e8 altres membres de l'equip puguen veure i incorporar aquestes modificacions.
- C\u00f2pia de seguretat: Un repositori remot pot servir com a c\u00f2pia de seguretat del teu projecte. Si el teu sistema local es danya o es perd, encara tindr\u00e0s acc\u00e9s a la teua hist\u00f2ria completa i als fitxers del projecte mitjan\u00e7ant el repositori remot.
- Distribuci\u00f3: Els repositoris remots permeten distribuir el teu codi a altres llocs. Aix\u00f2 pot ser \u00fatil per compartir el teu codi amb altres persones o per desplegar el teu projecte en un servidor en l\u00ednia.
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:
-
GitHub: Servei d'allotjament de repositoris creat en 2008 i adquirit per Microsoft en 2018. \u00c9s el servei d'allotjament de repositoris de Git m\u00e9s utilitzat.
Ofereix una opci\u00f3 gratu\u00efta, que permet crear projectes p\u00fablics i privats, per\u00f2 amb algunes restriccions. Tamb\u00e9 ofereix plans de pagament per projectes empresarials.
-
GitLab: Servei d'allotjament de repositoris. GitLab \u00e9s 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.
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.
- Crea un compte a GitHub si no en tens un.
- Inicia la sessi\u00f3 amb el teu compte.
- Fes clic a l'opci\u00f3 \"New\" per crear un nou repositori.
- 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:
- Nom:
git_remots
- Descripci\u00f3: Repositori del Bloc: Remots del curs \"Introducci\u00f3 a Git i la seua aplicaci\u00f3 a l\u2019aula\"
- Visibilitat: P\u00fablic
- README: No
- .gitignore: No
- Llic\u00e8ncia: No
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.
-
Protocol HTTPS: Utilitza el protocol HTTPS per autenticar-se amb el servidor de GitHub.
Per utilitzar aquest m\u00e8tode, has de configurar les teues credencials d'acc\u00e9s a GitHub en el teu sistema local.
Aquesta autenticaci\u00f3 es pot realitzar mitjan\u00e7ant:
- Nom d'usuari i contrasenya: Des del 2021-08-13, aquest m\u00e8tode est\u00e0 deshabilitat a GitHub.
- Token d'acc\u00e9s personal (Personal Access Token o PAT): GitHub permet crear un token d'acc\u00e9s personal per autenticar-se amb el servidor de GitHub.
- Extensions de l'IDE: Algunes extensions de l'IDE que utilitzes poden gestionar l'autenticaci\u00f3 amb GitHub directament.
-
Protocol SSH: Utilitza el protocol SSH per autenticar-se amb el servidor de GitHub.
Per utilitzar aquest m\u00e8tode, has de configurar una clau SSH en el teu sistema local i afegir-la al teu compte de 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/#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
- GitHub: Managing your personal access tokens
- Stackoverflow: Message \"Support for password authentication was removed.\"
Per crear un token d'acc\u00e9s personal, segueix els seg\u00fcents passos:
- Inicia la sessi\u00f3 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\u00e9s personal:
- Access token (classic): Permet especificar els permisos que vols donar al token, que s\u00f3n globals per a tot el teu compte.
- Fine-grained token: Permet especificar els permisos que vols donar al token, que s\u00f3n espec\u00edfics per a un repositori o organitzaci\u00f3.
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:
- Mitjan\u00e7ant la URL: Pots afegir el teu token d'acc\u00e9s personal a la URL del repositori per autenticar-te amb el servidor de GitHub.
git clone https://<token>@github.com/<usuari>/<repositori>\n
-
Mitjan\u00e7ant la contrasenya: Pots utilitzar el teu token d'acc\u00e9s personal com a contrasenya per autenticar-te amb el servidor de GitHub.
jpuigcerver@fp:~ $ git clone https://github.com/<usuari>/<repositori>\nCloning into '<repositori>'...\nUsername for 'https://github.com': <usuari>\nPassword for 'https://<username>@github.com': <token>\n
Note
Per seguretat, no es mostrar\u00e0 res en el camp de la contrasenya.
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
- https://docs.github.com/en/github/authenticating-to-github/connecting-to-github-with-ssh
Per generar una clau SSH, segueix els seg\u00fcents passos.
TerminalInterf\u00edcie gr\u00e0fica -
Crea una clau SSH al teu sistema local mitjan\u00e7ant la comanda ssh-keygen
.
jpuigcerver@fp:~ $ ssh-keygen -t rsa -b 4096\nGenerating public/private rsa key pair.\nEnter file in which to save the key (/home/jpuigcerver/.ssh/id_rsa):\nEnter passphrase (empty for no passphrase):\nEnter same passphrase again:\nYour identification has been saved in /home/jpuigcerver/.ssh/id_rsa\n
-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\u00f2pia el contingut de la clau p\u00fablica (id_rsa.pub
) al portaretalls.
jpuigcerver@fp:~ $ cat ~/.ssh/id_rsa.pub\nssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAQC7GqFnEFQZK4+l3zvXF07hN/cMk5ZtJmMkHWAJyTYQ+pDwMXp9eQs\n+VASLlz9z+0Q3vnnXN4vBO/+2u29fKJ4YlrecDYtCDpEhMXCkaCv9/ggkru09j2rELFuAqER55lgEtRKTfLKAVFa3Ws\n2VV7zlTSAH2y8nVddzlJRE9Y1BAfH0+1hjpCe+vgGObBLyIGGsXwlmm3mwI7NKHuKCIVskIEX3F0jw668dBex+6VUtG\n...\n
- Obri el programa Git GUI.
-
Obri el di\u00e0leg a Help > Show SSH Key.
Figura 4: Men\u00fa di\u00e0leg 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\u00fablica al portaretalls.
Figura 5: Clau SSH generada amb Git GUI
Despr\u00e9s, configura la clau SSH al teu compte de GitHub seguint els seg\u00fcents passos:
- Inicia la sessi\u00f3 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\u00edtol per a la clau SSH.
- Enganxa el contingut de la clau p\u00fablica al camp Key.
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:
- 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\u00f3 detallada d'un repositori remot.
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
<nom>
: Nom o \u00e0lies 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.
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
- 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
- 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
<antic>
: Nom actual del repositori remot. <nou>
: Nou nom 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/#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
<nom>
: Nom del repositori remot a eliminar.
","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
-u|--set-upstream
: Configura la branca local perqu\u00e8 s'associe amb la branca remota. <remot>
: \u00c0lies del repositori remot (configurat amb git remote add
). <branca>
: Nom de la branca remota.
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
<url>
: URL del repositori remot. Pot ser una URL HTTPS o SSH. <directori>
: Opcional. Nom del directori on es copiar\u00e0 el repositori. Per defecte, es crea un directori amb el nom del repositori remot.
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
<options>
: Opcions de la comanda. <remot>
: \u00c0lies del repositori remot. Per defecte, s'utilitza origin
.
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:
git fetch
: Actualitza la informaci\u00f3 de les branques remotes al nostre repositori local. git merge origin/<branca>
: Incorpora els canvis de la branca remota a la branca local.
Figura 11: Incorporaci\u00f3 de canvis git pull [<options>] [<remot> [<branca>]]\n
<options>
: Opcions de la comanda. <remot>
: \u00c0lies del repositori remot. Per defecte, s'utilitza la configuraci\u00f3 de la branca actual. <branca>
: Nom de la branca remota. Per defecte, s'utilitza la configuraci\u00f3 de la branca actual.
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:
- Poden produ\u00efr conflictes. Si es produeixen, caldr\u00e0 resoldre'ls manualment.
- Executar directament
git pull
generar\u00e0 un commit de fusi\u00f3, que pot ser no \u00e9s desitjable si es vol mantenir una hist\u00f2ria lineal.
Consell
Per evitar la fusi\u00f3 de branques divergents en git pull
, es pot fer el seg\u00fcent:
-
git pull --ff-only
: Incorpora els canvis de la branca remota nom\u00e9s si es pot fer una fusi\u00f3 directa (fast-forward).
Git pot ser configurat perqu\u00e8 nom\u00e9s permeta aquest tipus de fusi\u00f3 en la comanda git pull
.
git config --global pull.ff only\n
-
git pull --rebase
: Incorpora els canvis de la branca remota mitjan\u00e7ant un rebase, \u00e9s a dir, aplica els canvis de la branca local despr\u00e9s dels canvis de la branca remota.
Aquest comportament tamb\u00e9 es pot configurar per defecte en la comanda git pull
.
git config --global pull.rebase true\n
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
- 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":" - Curs de Git des de zero per MoureDev
- https://github.com/UnseenWizzard/git_training
","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":" - https://git-scm.com/book/en/v2
- https://github.com/UnseenWizzard/git_training
","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:
- Creaci\u00f3 de branques de funcionalitat
feature/*
: Es crea una branca independent per desenvolupar cada funcionalitat. - Branca de desenvolupament
develop
: Estat del projecte on s'incorporen les funcionalitats acabades, per\u00f2 que encara no han segut publicades. - Branca principal
main
: Branca on es troba la versi\u00f3 estable del projecte. - Branca de publicaci\u00f3
release/*
: Branca on es prepara la versi\u00f3 final del projecte abans de publicar-la. - Branca de correcci\u00f3
hotfix/*
: Branca per corregir errors en la versi\u00f3 estable del projecte.
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:
- Branca principal (
main
): Branca on es troba la versi\u00f3 publicada i estable del projecte. - Branca de desenvolupament (
develop
): Branca on es troba l'estat actual del projecte, on s'incorporen les funcionalitats acabades. -
Branques de funcionalitats (feature/*
): Per cada nova funcionalitat es crea una branca independent, on es codifica i es prova la nova funcionalitat.
- Es creen a partir de la branca
develop
. - S'integren a la branca
develop
una vegada acabades. - Es poden eliminar despr\u00e9s de ser integrades.
Info
Dep\u00e9n de l'estrat\u00e8gia triada, el proc\u00e9s d'integraci\u00f3 es realitzar\u00e0 de diferents maneres.
-
Branques de publicaci\u00f3 (release/*
): Branca on es preparen els canvis per poder publicar una nova versi\u00f3 del projecte.
- Es creen a partir de la branca
develop
. - Es fusionen amb les branques
develop
i main
una vegada acabades. - Es poden eliminar una vegada fusionades.
- Normalment, es crea una etiqueta amb la versi\u00f3 publicada.
-
Branques de correcci\u00f3 (hotfix/*
): Branca per corregir errors cr\u00edtics en la versi\u00f3 publicada del projecte.
- Es creen a partir de la branca
main
. - Es fusionen amb les branques
develop
i main
una vegada acabades.
Danger
Aquestes branques sols han de ser utilitzades per corregir errors cr\u00edtics que afecten la versi\u00f3 publicada del projecte i han de corregir-se inmediatament.
Aquestes branques poden dificultar el flux de treball, sobretot si es tracta de mantindra una hist\u00f2ria lineal del projecte.
","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:
- Proporciona un flux de treball clar i coherent per gestionar els canvis de codi.
- Permet el desenvolupament paral\u00b7lel i la prova de diferents funcions i correccions d'errors.
- Ajuda a mantenir un codi estable i preparat per posat en producci\u00f3.
- Facilita la col\u00b7laboraci\u00f3 entre els membres de l'equip.
- Mant\u00e9 un ordre coherent en la hist\u00f2ria del projecte.
El principal desavantatge \u00e9s:
- Pot suposar una sobrec\u00e0rrega en projectes xicotets o amb pocs membres.
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:
-
Utilitzar noms de branques descriptius i coherents, que indiquen clarament el seu prop\u00f2sit i contingut. Una bona manera de fer-ho \u00e9s utilitzar un prefix com\u00fa per cada tipus de branca.
Tip
Pots organitzar les branques en \"directoris\" utilitzant el mateix prefixe en el nom de la branca, separat per una barra /
.
feature/frontend/landing-page
o feature/backend/user-authentication
, com exemple de branques de funcionalitats. release/v1.0.0
o release/v1.1.0
, com exemple de branques de publicaci\u00f3. hotfix/bug-123
, com exemple de branques de correcci\u00f3.
-
Incorporeu els canvis de develop
a les branques feature/*
de forma regular, per mantindre-les actualitzades amb els canvis del projecte i evitar resolucions de conflictes inmenses en el futur.
","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.
- Sincronitzar l'estat del repositori local amb el remot amb
git fetch
. -
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
-
Actualitzar la branca feature/*
amb els nous canvis de develop
.
- Incorporar els canvis de la branca
feature/*
amb la branca develop
amb la t\u00e8cnica triada. -
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
.
-
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:
- Mant\u00e9 tot l'hist\u00f2ric de canvis.
- Permet revertir una funcionalitat f\u00e0cilment, ja que sols cal revertir un \u00fanic commit.
El principal desavantatge \u00e9s:
- No mant\u00e9 una hist\u00f2ria lineal.
- En projectes amb moltes funcionalitats, la hist\u00f2ria pot ser dif\u00edcil de seguir.
","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:
- Mant\u00e9 la hist\u00f2ria lineal.
- Permet resoldre els conflictes f\u00e0cilment en el proc\u00e9s de
rebase
.
El principal desavantatge \u00e9s:
- Revertir una funcionalitat \u00e9s complicat, ja que cal revertir m\u00faltiples commits.
","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:
- Mant\u00e9 la hist\u00f2ria neta i semi-lineal, on les funcionalitats s'integren una despr\u00e9s de l'altra.
- Permet revertir una funcionalitat f\u00e0cilment, ja que sols cal revertir un \u00fanic commit.
","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:
- Mant\u00e9 la hist\u00f2ria lineal.
- Permet revertir una funcionalitat f\u00e0cilment, ja que sols cal revertir un \u00fanic commit.
- Facilita la revisi\u00f3 de codi, ja que tots els canvis es troben en un \u00fanic commit.
- Evita la sobrec\u00e0rrega de commits en la branca de desenvolupament
develop
. - Els desenvolupador poden despreocupar-se de com queda la hist\u00f2ria de la branca de funcionalitat, on es poden permetre escriure microcommits, ja que aquests desapareixeran una vegada s'hagen integrat es canvis.
El principal desavantatge \u00e9s:
- No mant\u00e9 tot l'hist\u00f2ric de canvis.
- Dificulta la revisi\u00f3 de canvis individuals.
","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:
- Actualitzar la versi\u00f3 del projecte.
- Realitzar proves de validaci\u00f3.
- Corregir errors que han pogut passar desapercebuts.
- Preparar par\u00e0metres de configuraci\u00f3 espec\u00edfics per a la publicaci\u00f3.
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:
- Es creen a partir de la branca principal
main
. - Es realitzen les correccions necess\u00e0ries.
- Els canvis d'integren a la branca de desenvolupament
develop
i a la branca principal main
.
@TODO: Figura branques de correcci\u00f3
","tags":["gitflow","develop","feature","release","hotfix"]},{"location":"apunts/050_estrategies_ramificacio/#bibliografia","title":"Bibliografia","text":" - Apunts de Desplegament d'Aplicacions Web de Lorenzo Gonz\u00e1lez Gasc\u00f3n
- War of the Git Flows
- Gitflow: A successful Git branching model
- OneFlow
- Trunk Based Development
","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
- 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.
- Anna treballar\u00e0 en la funcionalitat
feature/readme
, que consistir\u00e0 a afegir una descripci\u00f3 del projecte al README. - Pau treballar\u00e0 en la funcionalitat
feature/license
, que consistir\u00e0 a afegir una llic\u00e8ncia al projecte. - Mar treballar\u00e0 en la funcionalitat
feature/author
, que consistir\u00e0 a afegir el nom de l'autors del projecte al README.
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:
- Crear la branca
feature/readme
a partir de develop
. - Realitzar els canvis pertinents.
- Publicar la branca
feature/readme
al repositori remot.
"},{"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:
- Crear la branca
feature/license
a partir de develop
. - Realitzar els canvis pertinents.
- Publicar la branca
feature/license
al repositori remot.
"},{"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:
- Crear la branca
feature/author
a partir de develop
. - Realitzar els canvis pertinents.
- Publicar la branca
feature/author
al repositori remot.
"},{"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:
-
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
-
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
-
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
- L'opci\u00f3
--no-edit
evita obrir l'editor de text i deixa el missatge de commit per defecte.
-
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
-
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
-
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:
-
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
-
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
-
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
- L'opci\u00f3
--no-edit
evita obrir l'editor de text i deixa el missatge de commit per defecte.
-
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
-
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
-
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:
-
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
-
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
-
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
- L'opci\u00f3
--no-edit
evita obrir l'editor de text i deixa el missatge de commit per defecte. - S'han esborrat les marques de conflicte manualment.
-
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
-
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
-
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:
-
Actualitzar la branca develop
amb els canvis del remot.
\n
-
Crear la branca de publicaci\u00f3 release/v1.0.0
a partir de la branca develop
.
\n
-
Realitzar les tasques necess\u00e0ries per a preparar la publicaci\u00f3 de la versi\u00f3 1.0.0.
\n
-
Crear i publicar una etiqueta amb la versi\u00f3 1.0.0.
\n
-
Integrar aquesta branca a la branca de desenvolupament develop
i publicar-la.
\n
-
Integrar aquesta branca a la branca principal main
i publicar els canvis.
\n
-
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":" - Exercici Bloc 1: Introducci\u00f3 a Git
- Exercici Bloc 2: Branques
- Exercici Bloc 3: Remots
"},{"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:
- Con\u00e9ixer com crear i inicialitzar un repositori de Git localment.
- Con\u00e9ixer com afegir fitxers al repositori local.
- Con\u00e9ixer com realitzar canvis en el repositori local.
- Con\u00e9ixer com consultar l'estat del repositori local.
- Con\u00e9ixer com consultar la hist\u00f2ria de canvis del repositori local.
- Con\u00e9ixer les configuracions b\u00e0siques de Git.
"},{"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.
- Crea un directori anomenat
bloc1_exercici
en la teua carpeta de treball. - Inicialitza un repositori de Git en aquest directori.
- Crea un fitxer anomenat
llibres.txt
i afegeix tres llibres que t'agraden. - Fes un primer commit. Tria un missatge significatiu.
- Afegeix un altre llibre a
llibres.txt
. - Fes un segon commit.
- Crea un fitxer anomenat
musica.txt
i afegeix tres can\u00e7ons que t'agraden. - Crea un fitxer anomenat
pelicules.txt
i afegeix tres pel\u00b7l\u00edcules que t'agraden. - Fes un tercer commit que sols incloga el fitxer
musica.txt
. - Crea un fitxer anomenat
series.txt
i afegeix tres s\u00e8ries que t'agraden. - Fes un quart commit que incloga els fitxers
pelicules.txt
i series.txt
. - Modifica el fitxer
llibres.txt
per a eliminar un dels llibres. - Fes un cinqu\u00e9 commit.
- Modifica el fitxer
pelicules.txt
per a afegir una pel\u00b7l\u00edcula. - Desf\u00e9s aquest canvi.
- Afegeix el fitxer
{data}.log
amb qualsevol contingut. {data}
\u00e9s la data actual en format YYYYMMDD
.
- Configura el repositori perqu\u00e8 ignore els fitxers amb extensi\u00f3
.log
. - Fes un commit amb aquesta configuraci\u00f3.
- Crea la carpeta
tmp
i c\u00f2pia tots els fitxers de text a aquesta carpeta. - Configura el repositori perqu\u00e8 ignore la carpeta
tmp
. - Fes un commit amb aquesta configuraci\u00f3.
- Comprova la hist\u00f2ria de canvis del repositori.
"},{"location":"exercicis/01_introduccio/#bibliografia","title":"Bibliografia","text":" - Basat en l'exercici de la sessi\u00f3 1 del curs Gesti\u00f3 de la tasca docent con GitHub de Pedro Prieto.
"},{"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:
- Con\u00e9ixer com crear i eliminar branques.
- Con\u00e9ixer com realitzar canvis en una branca.
- Con\u00e9ixer com canviar de branca.
- Con\u00e9ixer com fusionar branques.
- Con\u00e9ixer com canviar la base d'una branca.
- Con\u00e9ixer com resoldre conflictes en la fusi\u00f3 de branques.
- Con\u00e9ixer com resoldre conflictes en el canvi de base d'una branca.
"},{"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.
- Revisa Hist\u00f2ric de canvis (git log) per veure la configuraci\u00f3 de l'\u00e0lies
git lga
.
- Crea un directori anomenat
bloc2_exercici
en la teua carpeta de treball. - Inicialitza un repositori de Git en aquest directori.
- Crea un fitxer anomenat
llibres.txt
i afegeix tres llibres que t'agraden. - Fes un primer commit. Tria un missatge significatiu.
- Reanomena la branca principal a
main
.
"},{"location":"exercicis/02_branques/#fusio-directa","title":"Fusi\u00f3 directa","text":" - Crea una branca anomenada
musica
i situa't en aquesta branca. - Crea un fitxer anomenat
musica.txt
i afegeix tres can\u00e7ons que t'agraden. - Fes un commit en aquesta branca.
- Fusiona la branca
musica
amb la branca main
.
"},{"location":"exercicis/02_branques/#fusio-de-branques-divergents","title":"Fusi\u00f3 de branques divergents","text":" - Des de la branca
main
, crea les branques mes-llibres
i mes-musica
. - Des de la branca
mes-llibres
: - Afegeix un llibre a
llibres.txt
. - Fes un commit.
-
Des de la branca mes-musica
:
- Afegeix una can\u00e7\u00f3 a
musica.txt
. - Fes un commit.
-
Fusiona la branca mes-llibres
amb la branca main
.
- 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":" - Des de la branca
main
, crea les branques llibres-ciencia-ficcio
i llibres-fantasia
. - Des de la branca
llibres-ciencia-ficcio
: - Afegeix un llibre de ci\u00e8ncia-ficci\u00f3 a
llibres.txt
. - Fes un commit.
- Des de la branca
llibres-fantasia
: - Afegeix un llibre de fantasia a
llibres.txt
. - Fes un commit.
- Fusiona la branca
llibres-ciencia-ficcio
amb la branca main
. - Fusiona la branca
llibres-fantasia
amb la branca main
.
"},{"location":"exercicis/02_branques/#eliminacio-duna-branca","title":"Eliminaci\u00f3 d'una branca","text":" - Des de la branca
main
, crea una branca anomenada series
. - Des de la branca
main
, crea una branca anomenada pelicules
. - Des de la branca
series
: - Afegeix una s\u00e8rie a
series.txt
. - Fes un commit.
- Elimina la branca
pelicules
. - 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":" - Des de la branca
main
, crea una branca anomenada series
. - Des de la branca
main
, crea una branca anomenada pelicules
. - Des de la branca
series
: - Afegeix una s\u00e8rie a
series.txt
. - Fes un commit.
- Des de la branca
pelicules
: - Afegeix una pel\u00b7l\u00edcula a
pelicules.txt
. - Fes un commit.
- Fusiona la branca
pelicules
amb la branca main
. - Canvia la base de la branca
series
a la branca main
. - 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":" - Des de la branca
main
, crea una branca anomenada series-accio
i series-drama
. - Des de la branca
series-accio
: - Afegeix una s\u00e8rie d'acci\u00f3 a
series.txt
. - Fes un commit.
- Des de la branca
series-drama
: - Afegeix una s\u00e8rie de drama a
series.txt
. - Fes un commit.
- Fusiona la branca
series-accio
amb la branca main
. - Canvia la base de la branca
series-drama
a la branca main
. - 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:
- Con\u00e9ixer com crear un repositori remot a GitHub.
- Con\u00e9ixer com configurar un repositori remot.
- Con\u00e9ixer com associar una branca local a una branca remota.
- Con\u00e9ixer com publicar els canvis d'una branca al repositori remot.
- Con\u00e9ixer com sincronitzar l'estat dels repositoris local i remot.
- Con\u00e9ixer com incorporar canvis d'una branca remota a una branca local.
- Con\u00e9ixer com clonar un repositori remot.
- Con\u00e9ixer com eliminar una branca remota.
"},{"location":"exercicis/03_remots/#exercici","title":"Exercici","text":""},{"location":"exercicis/03_remots/#creacio-repositori-remot","title":"Creaci\u00f3 repositori remot","text":" - Crea un compte a GitHub si no en tens un.
- Crea un repositori remot anomenat
bloc3_exercici
completament buit: - No afegisques cap fitxer (README.md, LICENCE, .gitignore, etc.).
"},{"location":"exercicis/03_remots/#creacio-repositori-local","title":"Creaci\u00f3 repositori local","text":" - Crea un directori anomenat
bloc3_exercici
en la teua carpeta de treball. - Inicialitza un repositori de Git en aquest directori.
- Crea un fitxer anomenat
llibres.txt
i afegeix tres llibres que t'agraden. - Fes un primer commit.
- Reanomena la branca principal a
main
.
"},{"location":"exercicis/03_remots/#enllac-amb-repositori-remot","title":"Enlla\u00e7 amb repositori remot","text":" - Configura el repositori local per afegir el repositori remot creat anteriorment com a
origin
. - 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":" - Clona el repositori remot a un directori anomenat
bloc3_exercici_clone
en la teua carpeta de treball. - Comprova que el directori
bloc3_exercici_clone
cont\u00e9 el fitxer llibres.txt
. - 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
:
- Afegeix la pel\u00b7l\u00edcula La vida de Brian al fitxer
pelicules.txt
. - Realitza un commit.
- 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
:
- Sincronitza el repositori local amb el repositori remot amb
git fetch
. - Observa el
log
de canvis. - 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
:
- Afegeix una pel\u00b7l\u00edcula a
pelicules.txt
. - Realitza un commit.
- Publica la branca
main
al repositori remot.
Des del repositori bloc3_exercici_clone
:
- Afegeix la pel\u00b7l\u00edcula Monty Python and the Holy Grail al fitxer
pelicules.txt
. - Realitza un commit.
-
Tracta de publicar la branca main
al repositori remot.
Question
Per qu\u00e8 no pots publicar la branca main
al repositori remot?
-
Incorpora els canvis de la branca origin/main
a la branca main
local.
- Resol els conflictes que puguen apar\u00e9ixer.
- 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
:
- Incorpora els canvis de la branca
origin/main
a la branca main
local. - Afegeix una altra pel\u00b7l\u00edcula a
pelicules.txt
. - Realitza un commit.
- Publica la branca
main
al repositori remot.
Des del repositori bloc3_exercici_clone
:
- Sinconitza el repositori local amb el repositori remot (
git fetch
). - Afegeix la pel\u00b7l\u00edcula El sentido de la vida al fitxer
pelicules.txt
. - Realitza un commit.
- Incorpora els canvis de la branca
origin/main
a la branca main
local amb un canvi de base. - Resol els conflictes que puguen apar\u00e9ixer.
- Publica la branca
main
al repositori remot.
"},{"location":"exercicis/03_remots/#branques-i-remots","title":"Branques i remots","text":"Des del repositori bloc3_exercici
:
- Incorpora els canvis de la branca
origin/main
a la branca main
local. - Crea una branca anomenada
musica
. - Afegeix una can\u00e7\u00f3 a
musica.txt
. - Realitza un commit.
- Publica la branca
musica
al repositori remot. - Comprova que la branca
musica
est\u00e0 publicada al repositori remot. - Elimina la branca local
musica
. - 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:
- Con\u00e9ixer les diferents estrat\u00e8gies de ramificaci\u00f3.
- Con\u00e9ixer com aplicar les diferents estrat\u00e8gies de ramificaci\u00f3.
- Identificar els principals avantatges i desavantatges de cada estrat\u00e8gia de ramificaci\u00f3.
- Identificar i saber solucionar els problemes associats a cada estrat\u00e8gia de ramificaci\u00f3.
"},{"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":" - Bloc 1: Introducci\u00f3 a Git
- Bloc 2: Branques
- Bloc 3.1: M\u00e8todes d'autenticaci\u00f3 a GitHub
- Bloc 3.2: Remots
- [[bloc4-slides]]
- [[bloc5-slides]]
- [[bloc6-slides]]
"},{"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/
- Control de versions
- Facilita la col\u00b7laboraci\u00f3
- Ramificaci\u00f3 i gesti\u00f3 de conflictes
"},{"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":" - Nom d'usuari i contrasenya (2021)
- (HTTPS) Personal Access Token (PAT)
- (SSH) Clau SSH
"},{"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
- Classic
- Fine-grained
git config --global credential.helper store\n
"},{"location":"videos/031_remots_auth_slides/#clau-ssh","title":"Clau SSH","text":" - Generar clau SSH localment
- Afegir clau a GitHub
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
- (HTTPS) Personal Access Token (PAT)
- (SSH) Clau SSH
"},{"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