Git és un sistema de control de versions lliure i distribuït dissenyat per gestionar xicotets i grans projectes
amb rapidesa i eficiència. L'objectiu principal de Git és controlar i gestionar els canvis realitzats
en una enorme quantitat de fitxers d'una manera fàcil 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ó de codi font en projectes col·laboratius.
Git està basat en repositoris, que s'inicialitzen en un directori concret i contenen tota la informació
dels canvis realitzats en tot l'arbre de directoris i fitxers a partir d'aquest directori.
Els principals objectius i característiques de Git són:
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ística és essencial per a treballar en equips i per a solucionar problemes o errors.
Distribuït: Cada còpia d'un repositori Git conté tot l'historial de canvis i pot operar de manera independent.
Això facilita el treball fora de línia i la col·laboració en equips distribuïts.
Branca i fusió: Git facilita la creació de branques (branching) per a desenvolupar característiques
o solucionar problemes sense afectar la branca principal.
Després, pots fusionar (merge) les branques de nou en la branca principal quan estiguen a punt.
Gestió de conflictes: Git ofereix eines per a gestionar conflictes en cas que dues o més persones hagen realitzat
canvis en la mateixa part del codi.
Els desenvolupadors poden resoldre aquests conflictes manualment.
Col·laboració: Git facilita la col·laboració en projectes de codi obert o en equips,
ja que permet a múltiples persones treballar en el mateix projecte de manera eficient.
Plataformes com GitHub, GitLab i Bitbucket s'utilitzen comunament per a allotjar repositoris Git en línia i col·laborar en projectes.
Codi obert i gratuït: Git és de codi obert i gratuït, la qual cosa significa que qualsevol pot utilitzar-lo sense cost i contribuir al desenvolupament de l'eina.
En aquests apunts, utilitzarem la terminal per a interactuar amb Git, però això no significa que siga l'única manera de fer-ho.
De fet, pràcticament tots els entorns de desenvolupament moderns tenen integració amb Git, la qual cosa permet realitzar
les mateixes operacions que proporciona la terminal, però de manera més visual i intuïtiva.
No obstant això, és important conéixer com funcionen les comandes de Git en la terminal, per diferents raons:
Portabilitat: La terminal és un entorn comú en tots els sistemes operatius i en qualsevol entorn de desenvolupament.
Flexibilitat: La terminal permet realitzar operacions més avançades i personalitzades que les interfícies gràfiques.
Comprensió: Permet entendre com funcionen les comandes de Git i els processos que realitza en el sistema.
Tingues en compte els següents aspectes importants a l'hora d'inicialitzar un repositori
amb git init:
No has d'inicialitzar el repositori cada vegada que vulgues treballar en ell.
L'estat del repositori s'emmagatzema d'una manera persistent en
el directori ocult .git.
Si inicialitzes un repositori en un directori que ja conté un repositori,
es crearà un nou repositori i el contingut del directori .git es sobreescriurà,
eliminant tota la informació anterior.
Encara que és possible1, no és recomanable inicialitzar un repositori en un directori
contingut dins d'un altre repositori.
Exemple: Inicialització d'un repositori
jpuigcerver@fp:~$mkdirgit_introduccio
jpuigcerver@fp:~$cdgit_introduccio
jpuigcerver@fp:~/git_introduccio$ls-a# (1)!. ..jpuigcerver@fp:~/git_introduccio$gitinit
hint: Using 'master' as the name for the initial branch. This default branch namehint: is subject to change. To configure the initial branch name to use in allhint: of your new repositoris, which will suppress this warning, call:hint:hint: git config --global init.dafaultBranch <name>hint:hint: Names commonly chosen instead of 'master' are 'main', 'trunk' andhint: 'development'. The just-created branch can be renamed via this command:hint:hint: git branch -m <name>Initialized empty Git repository in /home/jpuigcerver/git_introduccio/.git/jpuigcerver@fp:~/git_introduccio(master)$gitbranch-mmain
jpuigcerver@fp:~/git_introduccio(main)$ls-a# (2)!. .. .git/jpuigcerver@fp:~/git_introduccio(main)$gitstatus
On branch mainNo commits yetNothing to commit (create/copy files and use "git add" to track)
L'opció -a mostra tots els fitxers, inclosos els ocults que comencen amb un punt.
S'ha creat el directori ocult .git que conté tota la informació 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.
Note
S'ha canviat el nom de la branca principal de master a main per a seguir les recomanacions de la comunitat de desenvolupament.
Per a eliminar un repositori de Git, simplement cal eliminar el directori ocult .git.
rm-rf.git
-r: Opció per a eliminar de manera recursiva.
-f: Opció per a forçar l'eliminació sense confirmació dels elements protegits contra escriptura.
Perill
Sigues extremadament cautelós amb l'ús de la comanda rm -rf,
ja que elimina tots els fitxers, inclosos aquells protegits contra escriptura.
Exemple: Eliminar un repositori
jpuigcerver@fp:~/git_introduccio(main)$ls-a
. .. .gitjpuigcerver@fp:~/git_introduccio(main)$rm-rf.git
jpuigcerver@fp:~/git_introduccio$gitstatus
fatal: not a git repository (or any of the parent directories): .git
En aquesta introducció, 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éixer 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 Environment,
Aquesta part està present localment en el teu dispositiu on realitzaràs els canvis i desenvolupament del teu projecte.
D'una altra banda, està el Repositori Remot, que normalment s'allotja a un servidor accessible per tots els
desenvolupadors.
Dins de l'Entorn de desenvolupament trobem els següents components:
Directori de treball o Working directory: Directori o carpeta del sistema on s'emmagatzema localment
els continguts del repositori.
Àrea de preparació o Staging Area: Àrea 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í com la informació de les branques i les etiquetes.
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ça en l'estat Untracked, és a dir, no està sotmès a seguiment per Git.
Modificar un fitxer amb seguiment. El fitxer modificat es trobarà en l'estat Modified.
Eliminar un fitxer amb seguiment. El fitxer eliminat es trobarà en l'estat Deleted.
Si executem l'ordre git status, ens mostrarà 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'Àrea de preparació amb la comanda git add,
que canviarà l'estat dels fitxers Staged (mostrat en color verd amb git status).
Per últim, tots els canvis de l'Àrea de preparació 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.
Informació
La comanda git restore es presenta a l'apartat Descartar canvis.
És recomanable crear un fitxer README.md en tots els projectes per a descriure el seu propòsit,
com s'utilitza i qualsevol altra informació rellevant.
Afegim el primer fitxer README.md al nostre repositori amb
el contingut:
# 01 - Introducció a GitEstem aprenent a utilitzar Git!
jpuigcerver@fp:~/git_introduccio(main)$echo"# 01 - Introducció a Git">README.md
jpuigcerver@fp:~/git_introduccio(main)$echo"Estem aprenent a utilitzar Git!">>README.md
jpuigcerver@fp:~/git_introduccio(main)$catREADME.md
# 01 - Introducció a GitEstem aprenent a utilitzar Git!
Crea el fitxer README.md amb el contingut anterior
en el directori git_introduccio.
Una vegada creat el fitxer, comprovem l'estat del nostre repositori amb git status.
Vegem que Git reconeix aquest nou fitxer,que ara mateix resideix en el Directori de treball.
La comanda git status ens mostra que no s'està realitzant cap seguiment del fitxer README.md,
que es troba en l'estat Untracked.
jpuigcerver@fp:~/git_introduccio(main)$gitstatus
On branch mainNo commits yetUntracked files: (use "git add <file>..." to include in what will be committed)README.mdNothing added to commit but untracked files present (use "git add" to track)
Figura 3. Fitxer sense seguiment (untracked).
Per afegir els canvis al nostre repositori, el següent pas és afegir
els canvis a l'Àrea de Preparació amb l'ordre git add.
Aquesta comanda permet especificar quins canvis es desitja afegir.
La sintaxi és la següent:
gitadd[--all]<path>
path: Ruta del fitxer o directori que es vol afegir a l'Àrea de Preparació.
--all: Opcional. Afegix tots els fitxers modificats i eliminats a l'Àrea de Preparació.
jpuigcerver@FP:~/git_introduccio(main)$gitaddREADME.md
jpuigcerver@FP:~/git_introduccio(main)$gitstatus
On branch mainNo commits yetChanges to be committed: (use "git rm --cached <file>..." to unstage)new file: README.md
Vegem com el fitxer README.md ha passat a l'estat Staged i està preparat per a ser confirmat.
Una vegada afegits tots els canvis a l'Àrea de Preparació, ja podem confirmar-los
mitjançant l'ordre git commit.
gitcommit[-a][-m"<message>"]
-a: Opcional. Afegeix tots els fitxers modificats i eliminats a l'Àrea de Preparació (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à l'editor per defecte(1) per a introduir el missatge del commit.
ViM per defecte. Pot ser configurat:
gitconfig--globalcore.editor<editor>
Figura 5. Estat del repositori de Git abans de fer un _commit`.
Aquesta ordre crea un nou commit, que és una instantània de l'estat actual dels fitxers
del repositori i que conté tota la informació relativa als canvis realitzats.
Cadascun dels commit conté la següent informació:
Autor: Persona que ha realitzat el commit.
Correu electrònic: Correu electrònic de l'autor.
Data: Data i hora en què s'ha realitzat el commit.
Missatge: Descripció dels canvis realitzats en el commit.
Identificador o hash: Codi únic generat automàticament 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ó anterior.
Per tant, abans de realitzar un commit, és necessari configurar el nom i el correu electrònic de l'autor.
Amb aquesta informació configurada, ja podem realitzar el nostre primer commit.
jpuigcerver@FP:~/git_introduccio(main)$gitstatus
On branch mainNo commits yetChanges to be committed: (use "git rm --cached <file>..." to unstage)new file: README.mdjpuigcerver@FP:~/git_introduccio(main)$gitcommit-m"Added README.md"[main (root-commit) 8e70293] Added README.md 1 file changed, 2 insertions(+) create mode 100644 README.mdjpuigcerver@FP:~/git_introduccio(main)$gitstatus
On branch mainnothing to commit, working tree clean
Vegem que l'estat del nostre repositori ha canviat i ja no hi ha canvis pendents de confirmar.
A més, s'ha creat el primer commit amb el missatge Added README.md i identificador 8e70293.
Figura 6. Estat del repositori de Git després de fer un commit.
Podem consultar la informació del nou commit amb l'ordre git show.
jpuigcerver@FP:~/git_introduccio(main)$gitshow8e70293
commit 8e702933d5dbec9ee71100a1599ae4491085e1aa(HEAD->main)Author: Joan Puigcerver Ibáñez <j.puigcerveribanez@edu.gva.es>Date: Fri Oct 13 16:06:59 2023 +0200 Added README.mddiff --git a/README.md b/README.mdnew file mode 100644
index 0000000..6d747b3--- /dev/null+++ b/README.md@@ -0,0 +1,2 @@+# 01 - Introducció a Git+Estem aprenent a utilitzar Git!
Una ferramenta molt útil de Git és git diff, que permet comparar les diferències entre els canvis realitzats
en el Directori de treball o l'Àrea de Preparació respecte del Repositori local.
La sintaxi amb les opcions bàsiques es:
gitdiff[--staged][<path>]
--staged: Opcional. Mostra les diferències entre l'Àrea de Preparació i el Repositori local.
Si no s'indica, es compararan les diferències entre el Directori de treball i el Repositori local.
<path>: Opcional. Fitxer o directori sobre el qual es vol comparar les diferències.
Si no s'indica, es compararan totes les diferències.
jpuigcerver@FP:~/git_introduccio(main)$gitdiff
diff --git a/README.md b/README.mdindex 6d747b3..f3b3b3e 100644--- a/README.md+++ b/README.md@@ -1,2 +1,3 @@# 01 - Introducció a Git
Estem aprenent a utilitzar Git!
+Aquesta és una línia nova
El format d'un diff és el següent:
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ó de les línies modificades.
-1,2: Els canvis comencen a la línia 1 i afecten 2 línies en el fitxer original.
+1,3: Els canvis comencen a la línia 1 i afecten 3 línies en el fitxer modificat.
Després, es mostren les línies modificades:
-: Línia eliminada.
+: Línia afegida.
En aquest cas, s'ha afegit la línia Aquesta és una línia nova al fitxer README.md.
Exemple: Diferències entre el Directori de treball i el Repositori local
Observem les diferències entre el fitxer README.md del Directori de treball i el Repositori local.
jpuigcerver@FP:~/git_introduccio(main)$echo"Aquesta és una línia nova">>README.md
jpuigcerver@FP:~/git_introduccio(main)$gitstatus
On branch mainChanges not staged for commit: (use "git add <file>..." to update what will be committed) (use "git restore <file>..." to discard changes in working directory)modified: README.mdno changes added to commit (use "git add" and/or "git commit -a")jpuigcerver@FP:~/git_introduccio(main)$gitdiff
diff --git a/README.md b/README.mdindex 6d747b3..f3b3b3e 100644--- a/README.md+++ b/README.md@@ -1,2 +1,3 @@# 01 - Introducció a Git
Estem aprenent a utilitzar Git!
+Aquesta és una línia nova
Exemple: Diferències entre l'Àrea de Preparació i el Repositori local
Observem les diferències entre el fitxer README.md de l'Àrea de Preparació i el Repositori local.
jpuigcerver@FP:~/git_introduccio(main)$gitaddREADME.md
jpuigcerver@FP:~/git_introduccio(main)$gitstatus
On branch mainChanges to be committed: (use "git restore --staged <file>..." to unstage)modified: README.mdjpuigcerver@FP:~/git_introduccio(main)$gitdiff--staged
diff --git a/README.md b/README.mdindex 6d747b3..f3b3b3e 100644--- a/README.md+++ b/README.md@@ -1,2 +1,3 @@# 01 - Introducció a Git
Estem aprenent a utilitzar Git!
+Aquesta és una línia nova
Una altra ferramenta útil de Git és git restore, que permet descartar els canvis realitzats en els fitxers
del Directori de treball o l'Àrea de Preparació.
La sintaxi amb les opcions bàsiques és:
gitrestore[--staged]<path>
--staged: Opcional. Descarta els canvis realitzats en l'Àrea de Preparació.
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.
La comanda git restore descarta els canvis realitzats en els fitxers sense possibilitat de recuperar-los.
Exemple: Descartar canvis en l'Àrea de Preparació
Continuant amb l'exemple anterior, descartem els canvis realitzats en el fitxer README.md de l'Àrea de Preparació.
jpuigcerver@FP:~/git_introduccio(main)$gitstatus
On branch mainChanges to be committed: (use "git restore --staged <file>..." to unstage)modified: README.mdjpuigcerver@FP:~/git_introduccio(main)$gitdiff--staged
diff --git a/README.md b/README.mdindex 6d747b3..f3b3b3e 100644--- a/README.md+++ b/README.md@@ -1,2 +1,3 @@# 01 - Introducció a Git
Estem aprenent a utilitzar Git!
+Aquesta és una línia novajpuigcerver@FP:~/git_introduccio(main)$gitrestore--stagedREADME.md
jpuigcerver@FP:~/git_introduccio(main)$gitstatus
On branch mainChanges not staged for commit: (use "git add <file>..." to update what will be committed) (use "git restore <file>..." to discard changes in working directory)modified: README.md
Exemple: Descartar canvis en el Directori de treball
Descartem els canvis realitzats en el fitxer README.md del Directori de treball.
Danger
Aquesta comanda descartarà els canvis realitzats en el fitxer README.md sense possibilitat de recuperar-los.
jpuigcerver@FP:~/git_introduccio(main)$gitstatus
On branch mainChanges not staged for commit: (use "git add <file>..." to update what will be committed) (use "git restore <file>..." to discard changes in working directory)modified: README.mdno changes added to commit (use "git add" and/or "git commit -a")jpuigcerver@FP:~/git_introduccio(main)$gitdiff
diff --git a/README.md b/README.mdindex 6d747b3..f3b3b3e 100644--- a/README.md+++ b/README.md@@ -1,2 +1,3 @@# 01 - Introducció a Git
Estem aprenent a utilitzar Git!
+Aquesta és una línia novajpuigcerver@FP:~/git_introduccio(main)$gitrestoreREADME.md
jpuigcerver@FP:~/git_introduccio(main)$gitstatus
On branch mainnothing to commit, working tree clean
Modifiquem novament el fitxer README.md i realitzem un nou commit.
jpuigcerver@FP:~/git_introduccio(main)$echo"Aquesta és una altra línia">>README.md
jpuigcerver@FP:~/git_introduccio(main)$gitcommit-a-m"Added another line to README.md"# (1)![main c9fc6c8] Added another line to README.md 1 file changed, 1 insertions(+)
Amb -a afegim tots els canvis realitzats al fitxer README.md a l'Àrea de Preparació sense necessitat de git add.
Consultem l'històric de canvis amb git log.
jpuigcerver@FP:~/git_introduccio(main)$gitlog
commit c9fc6c856c2d52744b85a6f8d92feac496e60bd6(HEAD->main)Author: Joan Puigcerver <j.puigcerveribanez@edu.gva.es>Date: Mon Oct 16 11:43:20 2023 +0200 Added another line to README.mdcommit 8e702933d5dbec9ee71100a1599ae4491085e1aaAuthor: Joan Puigcerver <j.puigcerveribanez@edu.gva.es>Date: Fri Oct 13 16:06:59 2023 +0200 Added Readme.md
S'observa tota la informació 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ó.
Una possible combinació d'opcions per visualitzar l'històric de canvis de manera més compacta i intuïtiva és:
Després de configurar l'àlies git lg per a l'ordre anterior, podem cridar-lo de la següent manera:
jpuigcerver@FP:~/git_introduccio(main)$gitlg
*c9fc6c8-(2 minutes ago)Added another line to README.md-Joan Puigcerver(HEAD -> main)*8e70293-(3 days ago)Added README.md-Joan Puigcerver
Git permet configurar diferents paràmetres per a personalitzar
el seu comportament mitjançant l'ordre git config.
La configuració de Git es pot realitzar a tres nivells, on els paràmetres d'un nivell
superior poden ser sobreescrits per un nivell inferior:
Sistema --system: Configuració de Git per a tots els usuaris del sistema.
La configuració es realitza en un fitxer gitconfig situat a:
/etc/gitconfig
Carpeta de la instal·lació de Git:
C:\Program Files\Git\gitconfig
Usuari --global: Configuració de Git per a un usuari concret.
La configuració es realitza en un fitxer gitconfig situat a
la carpeta personal de l'usuari:
/home/<username>/.gitconfig
C:\Users\<username>\.gitconfig
Repositori --local: Configuració de Git per a un repositori concret.
La configuració es realitza en un fitxer config situat a la carpeta .git del repositori.
--local, --global, --system: Opcional. Indica el nivell de configuració.
Si no s'indica, per defecte és --local.
<key>: Clau de configuració que es vol establir o consultar.
<value>: Opcional. Valor de la configuració.
Si no s'indica, es mostrarà el valor actual de la clau de configuració.
Fixa't
Fixeu-vos que ja hem utilitzat aquesta comanda per configurar els següents aspectes:
El nom (user.name) i el correu electrònic (user.email) de l'autor dels commit
L'editor per defecte (core.editor).
Exemple: Consultar el nom i correu electrònic configurats
jpuigcerver@FP:~/git_introduccio(main)$gitconfig--globaluser.name
Joan Puigcerver Ibáñezjpuigcerver@FP:~/git_introduccio(main)$gitconfig--globaluser.email
j.puigcerveribanez@edu.gva.es
Per a modificar el fitxer de configuració de l'usuari, podem utilitzar l'ordre git config --edit,
que obrirà l'editor de text per defecte per a editar el fitxer de configuració del nivell triat.
gitconfig[--local|--global|--system]--edit
--local, --global, --system: Opcional. Indica el nivell de configuració.
Si no s'indica, per defecte és --local.
Exemple: Fitxer de configuració de l'usuari (--global)
[core]editor=code --wait# Editor per defecte[init]defaultBranch=main# Nom de la branca principal per defecte[user]name=Joan Puigcerver Ibáñezemail=j.puigcerveribanez@edu.gva.es[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)'lga=lg --all
En un projecte, hi ha fitxers que no volem incloure en el repositori, com arxius temporals, binaris o fitxers de configuració.
Git permet ignorar aquests fitxers mitjançant el fitxer .gitignore, que conté una llista de patrons de fitxers els
quals Git no tindrà en compte.
Aquest fitxer pot estar situat en qualsevol directori del repositori i Git ignorarà per a tots els fitxers i subdirectoris d'aquest
que complisquen algun dels patrons especificats.
# ignore ALL .log files
*.log
# ignore ALL files in ANY directory named temp
temp/
jpuigcerver@FP:~/git_introduccio(main)$mkdirtemp
jpuigcerver@FP:~/git_introduccio(main)$touchtemp/file.txt
jpuigcerver@FP:~/git_introduccio(main)$gitstatus
On branch mainUntracked files: (use "git add <file>..." to include in what will be committed)temp/file.txtnothing added to commit but untracked files present (use "git add" to track)jpuigcerver@FP:~/git_introduccio(main)$echo"temp/">.gitignore
jpuigcerver@FP:~/git_introduccio(main)$gitstatus# (1)!On branch mainUntracked files: (use "git add <file>..." to include in what will be committed).gitignorenothing added to commit but untracked files present (use "git add" to track)
El fitxer temp/file.txt no apareix en l'estat del repositori després de crear el fitxer .gitignore.