<div class="page">
<div class="cover text-center">
<img class="mx-auto" src=/itb/images/logo_mislata.png alt="logo">
# Introducció a Git
<div class="text-end fit-content ms-auto my-3 mt-auto pt-3">
<p><strong>Autor:</strong> Joan Puigcerver Ibáñez</p>
<p><strong>Correu electrònic:</strong> j.puigcerveribanez@edu.gva.es</p>
<p><strong>Curs:</strong> 2024/2025</p>
</div>
<div>
<p class="fw-bold mb-0">Llicència: BY-NC-SA</p>
<p class="d-none d-md-block">(Reconeixement - No Comercial - Compartir Igual)</p>
<a href="https://creativecommons.org/licenses/by-nc-sa/4.0/deed.ca" target="_blank">
<img class="mx-auto" src="/itb/images/license.png" alt="Licence"/>
</a>
</div><!--license-->
</div><!--cover-->
</div><!--page-->
{:toc}
## Què és Git?
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 Linux Torvalds, creador del kernel del sistema operatiu Linux, i des d'aleshores,
s'ha convertit en una eina fonamental i inprescindible 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 comúment 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.
## Instal·lació
Git pot ser descarregat des de la seua pàgina web: https://git-scm.com/.
No obstant això, pots ser instal·lat fàcilment en Ubuntu o distribucions basades en Debian mitjançant:
```bash
sudo apt update
sudo apt install git
```
A Windows, una vegada instal·lat tindràs accés a l'eina __Git Bash__, que és una terminal basada l'intèrpret de Linux Bash,
que et permetrà realitzar les comandes de Git en la consola.
Per defecte, Git utilitza l'editor `ViM`, un editor de text per terminal molt potent però difícil i gens intuïtiu per treballar.
Durant la instal·lació de Git, podeu canviar-ho i establir un altre editor amb el qual esteu familiaritzats.
Si desitgeu canviar l'editor a posteriori, podeu executar l'ordre:
```
git config --global core.editor <editor>
```
A Windows, l'editor més senzill d'utilitzar és `notepad`.
```shell
joapuiib@FP:~ $ git config --global core.editor notepad
```
## Estructura d'un repositori de 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.
#3.1[Components d'un repositori de Git](/itb/DAM-ED/UD2/img/git_material/components.png)
En la figura anterior podem observar el que es coneix com __Entorn de desenvolupament__ o __*Development Enviorment*__.
Aquesta part és la part __local__, present en el teu dispositiu on et disposaràs a desenvolupar la teua aplicació.
D'una altra banda, està el __Repositori Remot__, normalment allotjat en 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.
En aquest material ens centrarem a veure com es treballa en Git localment.
## Inicialització d'un repositori de Git
::: info
Aquest material descriu la utilització de les comandes de Git
des de la __terminal__.
En sistemes _Windows_, podeu realitzar-ho amb l'eina __Git Bash__.
:::
Abans de començar, he creat un directori anomenat __git_tutorial__ en la meua carpeta d'usuari
mitjançant l'eina `mkdir`. Després, m'he situat a dins d'aquesta carpeta amb l'ordre `cd`
i he consultat el contingut amb l'ordre `ls`. En aquesta última ordre he inclòs l'opció `-a` o `--all`,
que permet mostrar els fitxers o directoris ocults.
```shell
joapuiib@FP:~ $ mkdir git_tutorial
joapuiib@FP:~ $ cd git_tutorial
joapuiib@FP:~/git_tutorial $ ls -a
. ..
```
::: note
A la terminal, podeu observar que cada línia comença amb una informació,
just abans del cursor, on pots escriure text.
Aquestà informació s'anomena __prompt__ i inclou informació de l'usuari actual,
la màquina a la qual està connectada i la carpeta actual.
En aquest cas, té el format `<user>@<host>:<dir> (<branch>) $`.
- `user` fa referència a l'usuari actual.
- `host` fa referència al nom de la màquina o dispositiu.
- `dir` fa referència al directori on ens trobem. El símbol `~` representa la teua carpeta d'usuari.
- Pots executar la comanda `echo ~` per veure a quin directori es correspon.
(Normalment `/home/<user>` a sistemes Linux i `C:/Users/<user>` en sistemes Windows.)
- `(branch)`. En Git Bash, a més, es mostra la branca actual en la qual estem situats en el repositori de Git.
- `$` fa referència al final del prompt. A partir d'ací, l'usuari pot escriure l'ordre que vol executar.
:::
Aquesta carpeta creada no és més que un directori normal i corrent que de moment no té cap contingut.
En aquest moment encara no hi ha cap repositori de Git.
L'ordre `git status` permet veure l'estat actual d'un repositori de Git. Podem comprovar com de moment, encara no n'existeix cap.
```shell
joapuiib@FP:~/git_tutorial $ git status
fatal: not a git repository (or any of the parent directories): .git
```
Per tant, el primer que farem és inicialitzar un nou repositori de Git.
Aquesta tasca es realitza mitjançant l'ordre `git init`:
```shell
joapuiib@FP:~/git_tutorial $ git init
.yellow{hint: Using 'master' as the name for the initial branch. This default branch name
hint: is subject to change. To configure the initial branch name to use in all
hint: 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' and
hint: 'development'. The just-created branch can be renamed via this command:
hint:
hint: git branch -m <name>}
Initialized empty Git repository in /home/joapuiib/git_tutorial/.git/
joapuiib@FP:~/git_tutorial (master) $ git branch -m main
joapuiib@FP:~/git_tutorial (main) $ git status
On branch main
No commits yet
Nothing to commit (create/copy files and use "git add" to track)
joapuiib@FP:~/git_tutorial (main) $ ls -a
. .. .git/
```
Podeu observar que en el moment de la inicialització, l'eina Git crea
una branca principal anomenada `master`, però ens indica com podem configurar
l'eina perquè de manera predeterminada utilitze un altre nom i també
ens indica com li podem canviar el nom a la branca ja creada.
Sempre s'ha utilitzat la nomenclatura `master`, però per evitar
la nomenclatura __master/slave__, que té connotacions racistes,
últimament s'ha decidit utilitzar el nom `main`. En aquest cas,
s'ha reanomenat la branca principal a `main` mitjançant `git branch -m main`.
Una vegada creat el repositori, podem veure amb `git status`
l'estat d'aquest. En aquest cas, està buit: "_No commits yet_".
Finalment, s'ha executat altra vegada l'ordre `ls -a` per veure els continguts del directori
actual. Es pot observar que s'ha creat el directori `.git/`, directori ocult
que conté el __Repositori local__.
## Afegir noves coses
Afegirem el primer fitxer al nostre repositori. El fitxer l'anomenarem __README.md__ i afegirem el següent contingut:
```md
# Tutorial de Git
Estem aprenent a utilitzar Git!
```
::: note
El fitxer __README.md__ és un fitxer que qualsevol repositori de Git hauria de tindre.
El nom _README_ que es pot traduir com _Llig-me_, és un fitxer utilitzat per donar informació
sobre el contingut del repositori i la seua utilització.
Aquest fitxer normalment està escrit en format _Markdown_, un llenguatge de marques
que permet escriure en un format de text pla, que després serà traduït a HTML.
Live editor de _Markdown_: https://markdown-it.github.io/
:::
::: tip
Per editar un fitxer, podeu utilitzar qualsevol editor de text o fins i tot,
realitzar-ho mitjançant comandes a la terminal.
__Editors de text__:
- A _Windows_:
- Notepad o bloc de notas. Ve instal·lat per defecte.
- [Notepad++.](https://notepad-plus-plus.org/)
- A _Linux_:
- Cada distribució utilitza un editor de text diferent.
- A _Ubuntu_ està Gedit. Pot llançar-se des de la terminal mitjançant `gedit <file>`.
- _Multiplataforma_:
- [Visual Estudio Code](https://code.visualstudio.com/)
__Editors en la terminal__:
- `nano`. Ús bàsic.
- `vim`. Ús avançat (`:w` per guardar i `:q` per eixir)
__Des de la terminal__: Mitjançant redireccions es poden modificar els fitxers.
- `>`: Crea o sobreescriu un fitxer amb l'__eixida estàndard__ d'una comanda.
- `>>`: Crea i afegeix al final d'un fitxer l'__eixida estàndard__ d'una comanda.
```bash
echo "# Tutorial de Git" > README.md
echo "Estem aprenent a utilitzar Git!" >> README.md
```
:::
Jo he optat per l'opció de la terminal per crear i afegir el text al fitxer __README.md__.
Podem consultar el contingut del fitxer amb la comanda `cat`.
```shell
joapuiib@FP:~/git_tutorial (main) $ ls
joapuiib@FP:~/git_tutorial (main) $ echo "# Tutorial de Git" > README.md
joapuiib@FP:~/git_tutorial (main) $ echo "Estem aprenent a utilitzar Git!" >> README.md
joapuiib@FP:~/git_tutorial (main) $ ls
README.md
joapuiib@FP:~/git_tutorial (main) $ cat README.md
# Tutorial de Git
Estem aprenent a utilitzar Git!
```
Aquest fitxer que hem creat s'ha afegit al _Directori de Treball_.
Anem a veure l'estat del repositori amb `git status`.
```shell
joapuiib@FP:~/git_tutorial (main) $ git status
On branch main
No commits yet
Untracked files:
(use "git add <file>..." to include in what will be committed)
.red{README.md}
nothing added to commit but untracked files present (use "git add" to track)
```
Si llegim la informació que ens dona aquesta comanda,
podem observar que Git reconeix que s'ha creat aquest fitxer,
però que encara no el té en compte en el nostre repositori.
Està en l'estat __untracked__.
#5.1[Estat del repositori de Git després d'afegir el README.md](/itb/DAM-ED/UD2/img/git_material/untracked_readme.png)
El següent pas per afegir els canvis al nostre repositori és afegir
els canvis a l'_Àrea de Preparació_ mitjançant l'ordre `git add`.
Aquesta comanda permet especificar quins canvis es desitja afegir.
```shell
joapuiib@FP:~/git_tutorial (main) $ git add README.md
joapuiib@FP:~/git_tutorial (main) $ git status
On branch main
No commits yet
Changes to be committed:
(use "git rm --cached <file>..." to unstage)
.green{new file: README.md}
```
#5.2[Estat del repositori de Git després d'afegir el README.md al Staging Area](/itb/DAM-ED/UD2/img/git_material/staged_readme.png)
L'_Àrea de Preparació_ serveix per a recopilar tots els canvis que volem fer
efectius en el repositori de Git. En el nostre cas, sols volem afegir
el fitxer README.md que hem creat.
Una vegada afegits tots els canvis ja podem __confirmar__ tots els canvis,
mitjançant l'ordre `git commit`.
#5.3[Estat del repositori de Git abans de fer un `commit`](/itb/DAM-ED/UD2/img/git_material/before_commit_readme.png)
::: info
Veurem més endavant quina informació es guarda en un `commit`,
però de moment, heu de saber que tots els `commits` han de contindre un missatge.
Si executes directament la comanda `git commit`, s'obrirà l'editor de text
que hageu configurat en la instal·lació de Git. En l'editor permet escriure un missatge.
Després de guardar i tancar l'editor, s'haurà creat el nou `commit`.
Una manera més fàcil d'especificar el missatge d'un `commit` és mitjançant
l'opció `-m`, que permet especificar el missatge directament en la terminal.
```bash
git commit -m "<message>"
```
:::
::: warning
Configureu prèviament l'editor de Git (vegeu l'apartat [Instal·lació](#instal%C2%B7laci%C3%B3)), ja que
l'editor configurat per defecte és __ViM__, un editor potent però complicat d'utilitzar.
Si per casualitat heu entrat en aquest editor, podeu utilitzar les següents combinacions per eixir:
- `:wq`: Per guardar i eixir.
- `:q!`: Per eixir sense guardar.
:::
```shell
joapuiib@FP:~/git_tutorial (main) $ git commit -m "Added README.md"
*** Please tell me who you are.
Run
git config --global user.email "you@example.com"
git config --global user.name "Your Name"
to set your account's default identity.
Omit --global to set the identity only in this repository.
```
La primera vegada que feu un `commit` segurament vos trobeu amb l'error anterior.
Git necessita saber qui és la persona que ha realitzat un `commit`, per tant,
heu d'indicar-ho prèviament mitjançant la comanda `git config`.
Aquesta configuració es pot aplicar globalment en mitjançant l'opció `--global`,
o a nivell de repositori, sense aquesta opció.
Mitjançant aquestes ordres, podem configurar el nostre nom i el correu electrònic,
que serà públic i s'emmagatzemarà en cada `commit` que fem.
```bash
git config --global user.email "you@example.com"
git config --global user.name "Your Name"
```
```shell
joapuiib@FP:~/git_tutorial (main) $ git config --global user.email "j.puigcerveribanez@edu.gva.es"
joapuiib@FP:~/git_tutorial (main) $ git config --global user.name "Joan Puigcerver"
```
Una vegada realitzada aquesta configuració, ja podem realitzar el nostre primer `commit`.
```shell
joapuiib@FP:~/git_tutorial (main) $ git commit -m "Added README.md"
[main (root-commit) 8e70293] Added Readme.md
1 file changed, 2 insertions(+)
create mode 100644 README.md
joapuiib@FP:~/git_tutorial (main) $ git status
On branch main
nothing to commit, working tree clean
```
Podem observar que, després d'haver confirmat els canvis mitjançant `git commit`,
la comanda `git status` ens indica que no hi ha cap canvi que no estiga registrat en el nostre repositori.
Per tant, els canvis realitzats en el fitxer __README.md__ ja formen part del repositori.
#5.4[Estat del repositori de Git després de fer un `commit`](/itb/DAM-ED/UD2/img/git_material/after_commit_readme.png)
Podem consultar el nostre recentment creat `commit` amb l'ordre `git log`.
```shell
joapuiib@FP:~/git_tutorial (main) $ git log
.yellow{commit 8e702933d5dbec9ee71100a1599ae4491085e1aa} (.lightblue{HEAD ->} .green{main})
Author: Joan Puigcerver <j.puigcerveribanez@edu.gva.es>
Date: Fri Oct 13 16:06:59 2023 +0200
Added Readme.md
```
Es pot observar el `commit`, que inclou l'autor (nom i correu electrònic), la data en la qual s'ha fet, el missatge especificat
i un identificador, que és un `hash` dels canvis realitzats ([Més informació](https://stackoverflow.com/questions/35430584/how-is-the-git-hash-calculated)).
::: abstract
Fins aquest moment, hem vist les següents comandes de __Git__:
- `git init`: Inicialitza el repositori de Git.
- `git status`: Mostra l'estat actual del repositori de Git.
- `git add <file>`: Afegeix el/s fitxer/s especificats al _Staging Area_.
- `git commit -m <message>`: Confirma els canvis de l'_Staging Area_ i crea un nou `commit`.
- `git log`: Mostra els `commits` del repositori.
:::
## Més canvis
Repetim el procés anterior per afegir nous canvis al fitxer __README.md__. Modifiquem el fitxer perquè el contingut siga el següent:
```md
# Tutorial de Git
Estem aprenent a utilitzar Git!
Hem modificat un fitxer existent.
```
```shell
joapuiib@FP:~/git_tutorial (main) $ cat README.md
# Tutorial de Git
Estem aprenent a utilitzar Git!
joapuiib@FP:~/git_tutorial (main) $ echo >> README.md
joapuiib@FP:~/git_tutorial (main) $ echo "Hem modificat un fitxer existent." >> README.md
joapuiib@FP:~/git_tutorial (main) $ cat README.md
# Tutorial de Git
Estem aprenent a utilitzar Git!
Hem modificat un fitxer existent.
joapuiib@FP:~/git_tutorial (main) $ git status
On branch main
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git restore <file>..." to discard changes in working directory)
.red{modified: README.md}
no changes added to commit (use "git add" and/or "git commit -a")
```
Si veiem l'estat del repositori amb `git status`, podem observar que __Git__ ens
indica que el fitxer __README.md__ ha segut modificat i com poder afegir els canvis
al repositori o descartar-los.
Si volem observar els canvis realitzats, disposem de l'ordre `git diff <file>`. Aquesta ordre
mostra els canvis del _Directori de Treball_ del fitxer especificat. Si no s'especifica el fitxer,
es mostren tots els canvis.
```shell
joapuiib@FP:~/git_tutorial (main) $ git diff
diff --git a/README.md b/README.md
index 6d747b3..ff524e4 100644
--- a/README.md
+++ b/README.md
@@ -1,2 +1,4 @@
# Tutorial de Git
Estem aprenent a utilitzar Git!
+
+Hem modificat un fitxer existent.
```
Aquesta eina mostra un `diff`, una diferència entre l'estat anterior del fitxer
i els canvis realitzats. En aquest cas ens indica que s'han afegit dues línies al
final de fitxer.
Provem a descartar els canvis del _Directori de Treball_ amb l'eina `git restore`.
```shell
joapuiib@FP:~/git_tutorial (main) $ cat README.md
# Tutorial de Git
Estem aprenent a utilitzar Git!
Hem modificat un fitxer existent.
joapuiib@FP:~/git_tutorial (main) $ git restore README.md
joapuiib@FP:~/git_tutorial (main) $ cat README.md
# Tutorial de Git
Estem aprenent a utilitzar Git!
joapuiib@FP:~/git_tutorial (main) $ git diff
joapuiib@FP:~/git_tutorial (main) $ git status
On branch main
nothing to commit, working tree clean
```
Observem que després de descartar els canvis, el fitxer __README.md__ està en l'últim estat conegut per Git
i els canvis que hem fet han desaparegut.
::: danger
Els canvis del _Directori de Treball_ que han segut descartats mitjançant `git restore`
no poden ser recuperats!
:::
Tornem a incloure els canvis al fitxer __README.md__, i en aquest cas,
anem a afegir-los al _Staging Area_.
```shell
joapuiib@FP:~/git_tutorial (main) $ echo >> README.md
joapuiib@FP:~/git_tutorial (main) $ echo "Hem modificat un fitxer existent." >> README.md
joapuiib@FP:~/git_tutorial (main) $ git status
On branch main
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git restore <file>..." to discard changes in working directory)
.red{modified: README.md}
no changes added to commit (use "git add" and/or "git commit -a")
joapuiib@FP:~/git_tutorial (main) $ git add README.md
joapuiib@FP:~/git_tutorial (main) $ git diff
joapuiib@FP:~/git_tutorial (main) $ git status
On branch main
Changes to be committed:
(use "git restore --staged <file>..." to unstage)
.green{modified: README.md}
```
Mitjançant `git add` hem afegit els canvis al _Staging Area_ i després de fer-ho, podem
observar que la comanda `git diff` no mostra res. Això és perquè `git diff` mostra
els canvis del _Directori de Treball_. Si volem veure els canvis del _Staging Area_,
hem d'afegir l'opció `--staged`.
```shell
joapuiib@FP:~/git_tutorial (main) $ git status
On branch main
Changes to be committed:
(use "git restore --staged <file>..." to unstage)
.green{modified: README.md}
joapuiib@FP:~/git_tutorial (main) $ git diff
joapuiib@FP:~/git_tutorial (main) $ git diff --staged
diff --git a/README.md b/README.md
index 6d747b3..ff524e4 100644
--- a/README.md
+++ b/README.md
@@ -1,2 +1,4 @@
# Tutorial de Git
Estem aprenent a utilitzar Git!
+
+Hem modificat un fitxer existent.
```
Si llegiu la informació de `git status`, podeu observar que ens indica que
podem llevar canvis del _Staging Area_ amb l'ordre `git restore --staged`.
Si fem aquesta comanda, els canvis encara continuen presents en el _Working Directory_.
```shell
joapuiib@FP:~/git_tutorial (main) $ git status
On branch main
Changes to be committed:
(use "git restore --staged <file>..." to unstage)
.green{modified: README.md}
joapuiib@FP:~/git_tutorial (main) $ git restore --staged README.md
joapuiib@FP:~/git_tutorial (main) $ git status
On branch main
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git restore <file>..." to discard changes in working directory)
.red{modified: README.md}
no changes added to commit (use "git add" and/or "git commit -a")
```
Finalment, tornem a afegir els canvis i crear un nou `commit` amb aquests canvis.
```shell
joapuiib@FP:~/git_tutorial (main) $ git add REDME.md
joapuiib@FP:~/git_tutorial (main) $ git status
On branch main
Changes to be committed:
(use "git restore --staged <file>..." to unstage)
.green{modified: README.md}
joapuiib@FP:~/git_tutorial (main) $ git commit -m "Changed README.md"
[main c9fc6c8] Changed README.md
1 file changed, 2 insertions(+)
joapuiib@FP:~/git_tutorial (main) $ git status
On branch main
nothing to commit, working tree clean
```
#6.1[Resum de les operacions de Git](/itb/DAM-ED/UD2/img/git_material/resum.png)
Podem consultar el nostre recentment creat `commit` amb l'ordre `git log`.
```shell
joapuiib@FP:~/git_tutorial (main) $ git log
.yellow{commit c9fc6c856c2d52744b85a6f8d92feac496e60bd6} (.lightblue{HEAD ->} .green{main})
Author: Joan Puigcerver <j.puigcerveribanez@edu.gva.es>
Date: Mon Oct 16 11:43:20 2023 +0200
Changed README.md
.yellow{commit 8e702933d5dbec9ee71100a1599ae4491085e1aa}
Author: Joan Puigcerver <j.puigcerveribanez@edu.gva.es>
Date: Fri Oct 13 16:06:59 2023 +0200
Added Readme.md
```
A més, podem utilitzar l'eina `git show` per mostrar la informació i els canvis (`diff`) de cada `commit`.
```shell
joapuiib@FP:~/git_tutorial (main) $ git show 8e70293
.yellow{commit 8e702933d5dbec9ee71100a1599ae4491085e1aa}
Author: Joan Puigcerver <j.puigcerveribanez@edu.gva.es>
Date: Fri Oct 13 16:06:59 2023 +0200
Added Readme.md
diff --git a/README.md b/README.md
new file mode 100644
index 0000000..6d747b3
--- /dev/null
+++ b/README.md
@@ -0,0 +1,2 @@
+# Tutorial de Git
+Estem aprenent a utilitzar Git!
joapuiib@FP:~/git_tutorial (main) $ git show c9fc6c8
.yellow{commit c9fc6c856c2d52744b85a6f8d92feac496e60bd6} (.lightblue{HEAD ->} .green{main})
Author: Joan Puigcerver <j.puigcerveribanez@edu.gva.es>
Date: Mon Oct 16 11:43:20 2023 +0200
Changed README.md
diff --git a/README.md b/README.md
index 6d747b3..ff524e4 100644
--- a/README.md
+++ b/README.md
@@ -1,2 +1,4 @@
# Tutorial de Git
Estem aprenent a utilitzar Git!
+
+Hem modificat un fitxer existent.
```
#6.2[Resum de les ordres `diff`](/itb/DAM-ED/UD2/img/git_material/resum_diff.png)
## Commit
Un `commit` en Git és un punt fixe en la història d'un repositori,
que representa un conjunt de canvis en els fitxers del teu projecte.
Cada `commit` emmagatzema la següent informació:
- __Un identificador (hash)__: Identificador únic (una cadena hexadecimal) que el diferencia de
tots els altres commits en el repositori.
- __Autor i correu electrònic__: Informació de qui va fer el commit,
que sol ser el nom i el correu electrònic de l'autor.
Aquesta informació es configura mitjançant `git config`.
- __Data i hora__: La data i l'hora en què es va crear el commit.
- __Missatge__: Un missatge que proporciona una descripció significativa
dels canvis realitzats en aquest commit.
- __Referència al commit anterior__: Cada commit fa referència al commit anterior en l'historial,
creant una línia de temps o història dels canvis del projecte.
- __Canvis als arxius__: Els canvis específics als arxius del projecte que es van realitzar en aquest commit.
Tota aquesta informació es pot consultar amb la comanda `git show`
```shell
joapuiib@FP:~/git_tutorial (main) $ git show 8e70293
.yellow{commit 8e702933d5dbec9ee71100a1599ae4491085e1aa}
Author: Joan Puigcerver <j.puigcerveribanez@edu.gva.es>
Date: Fri Oct 13 16:06:59 2023 +0200
Added Readme.md
diff --git a/README.md b/README.md
new file mode 100644
index 0000000..6d747b3
--- /dev/null
+++ b/README.md
@@ -0,0 +1,2 @@
+# Tutorial de Git
+Estem aprenent a utilitzar Git!
joapuiib@FP:~/git_tutorial (main) $ git show c9fc6c8
.yellow{commit c9fc6c856c2d52744b85a6f8d92feac496e60bd6} (.lightblue{HEAD ->} .green{main})
Author: Joan Puigcerver <j.puigcerveribanez@edu.gva.es>
Date: Mon Oct 16 11:43:20 2023 +0200
Changed README.md
diff --git a/README.md b/README.md
index 6d747b3..ff524e4 100644
--- a/README.md
+++ b/README.md
@@ -1,2 +1,4 @@
# Tutorial de Git
Estem aprenent a utilitzar Git!
+
+Hem modificat un fitxer existent.
```
La història del repositori es pot consultar amb l'ordre `git log`.
Si consulteu les execucions anteriors d'aquesta comanda, veureu que es proporciona molta informació
i és difícil veure una visió general de la història a simple vista.
Per vore d'una manera més visual la història, ens podem definir un format personalitzat a aquesta comanda.
Per no haver d'especificar-ho cada vegada, ens podem crear els següents __àlies__.
```ini
[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)'
lg2 = log --graph --abbrev-commit --decorate --format=format:'%C(bold blue)%h%C(reset) - %C(bold cyan)%aD%C(reset) %C(bold green)(%ar)%C(reset)%C(bold yellow)%d%C(reset)%n'' %C(white)%s%C(reset) %C(dim white)- %an%C(reset)'
lga = !"git lg --all"
```
Els __àlies__ es configuren en el fitxer __~/.gitconfig__, situat en la carpeta d'usuari.
::: note
La carpeta d'usuari és la carpeta que emmagatzema tota la informació respecte de l'usuari, com els documents o l'escriptori.
- En sistemes __Linux__ està en `/home/<user>`.
- En sistemes __Windows__ està en `C:\Users\<user>`.
:::
El fitxer __.gitconfig__, a més, emmagatzema totes les configuracions que realitzem a Git
mitjançant `git config --global`. Podreu observar que el nom i el correu especificats anteriorment
estan emmagatzemats en el fitxer:
```ini
[user]
name = Joan Puigcerver
email = j.puigcerveribanez@edu.gva.es
[core]
editor = notepad
[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)'
lg2 = log --graph --abbrev-commit --decorate --format=format:'%C(bold blue)%h%C(reset) - %C(bold cyan)%aD%C(reset) %C(bold green)(%ar)%C(reset)%C(bold yellow)%d%C(reset)%n'' %C(white)%s%C(reset) %C(dim white)- %an%C(reset)'
lga = !"git lg --all"
```
Una vegada configurats els àlies, podem utilitzar la comanda `git lg`, que executarà `git log` amb el format especificat.
En aquest format podem veure com un commit es crea a partir d'un altre commit.
```shell
joapuiib@FP:~/git_tutorial (main) $ git lg
* c9fc6c8 - (1 day ago) Changed README.md - Joan Puigcerver (HEAD -> main)
* 8e70293 - (4 days ago) Added Readme.md - Joan Puigcerver
```
## Estats d'un fitxer en Git
Els fitxers d'un repositori de Git poden estar en diferents estats.
Podem consultar l'estat de cada fitxer amb la comanda `git status`.
- __Untracked__: Estat inicial d'un fitxer que encara no ha segut afegit al repositori. Git no coneix la seua existència.
```shell
joapuiib@FP:~/git_tutorial (main) $ touch new_file.txt
joapuiib@FP:~/git_tutorial (main) $ git status
On branch main
Untracked files:
(use "git add <file>..." to include in what will be committed)
.red{new_file.txt}
nothing added to commit but untracked files present (use "git add" to track)
```
- __Modified__: Quan un fitxer que és conegut per Git ha segut modificat, és a dir, ha canviat respecte a l'últim commit.
```shell
joapuiib@FP:~/git_tutorial (main) $ echo "Modified" >> README.md
joapuiib@FP:~/git_tutorial (main) $ git status
On branch main
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git restore <file>..." to discard changes in working directory)
.red{modified: README.md}
no changes added to commit (use "git add" and/or "git commit -a")
```
- __Staged__: Abans de fer un `commit` has d'afegir els canvis a l'_Àrea de Preparació (Staging Area)_.
Quan afegeixes un fitxer, amb la comanda `git add`, passa a aquest estat.
```shell
joapuiib@FP:~/git_tutorial (main) $ git add new_file.txt
joapuiib@FP:~/git_tutorial (main) $ git status
On branch main
Changes to be committed:
(use "git restore --staged <file>..." to unstage)
.green{modified: new_file.txt}
```
- __Commited__: El fitxer existeix en el repositori de Git i no ha segut canviat.
```shell
joapuiib@FP:~/git_tutorial (main) $ git restore README.md # Esborrem les modificacions
joapuiib@FP:~/git_tutorial (main) $ git status
On branch main
nothing to commit, working tree clean
```
- __Ignored__: Git pot ser configurat perquè ignore certs fitxers del _Directori de Treball_. Els fitxers ignorats s'especifiquen
en el fitxer __.gitignore__.
```shell
joapuiib@FP:~/git_tutorial (main) $ touch new_file.txt
joapuiib@FP:~/git_tutorial (main) $ git status
On branch main
Untracked files:
(use "git add <file>..." to include in what will be committed)
.red{new_file.txt}
nothing added to commit but untracked files present (use "git add" to track)
joapuiib@FP:~/git_tutorial (main) $ echo new_file.txt >> .gitignore
joapuiib@FP:~/git_tutorial (main) $ cat .gitignore
new_file.txt
joapuiib@FP:~/git_tutorial (main) $ git status
On branch main
Untracked files:
(use "git add <file>..." to include in what will be committed)
.red{.gitignore}
```
## Recursos addicionals
- Curs de Git des de zero per MoureDev: https://www.youtube.com/watch?v=3GymExBkKjE&ab_channel=MoureDevbyBraisMoure
- https://github.com/UnseenWizzard/git_training
## Bibliografia
- 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