divendres, 5 d’agost de 2016

Working with Git Locally

Introducció:

L'objectiu d'aquest tutorial és definir les bases per a l'ús local del sistema de control de versions Git. Els sistemes de control de versions són una eïna fonamental per a tenir control i traçavilitat sobre els canvis.

Jugant amb Git:

Durant aquesta secció anirem probant diferents comandes sobre un repositori Git per entendre les diferents funcionalitats útils quan treballem sobre un repositori local. Per començar a utilitzar Git el primer que haurem de configurar són dos paràmetres bàsics per poder realitzar i traçar els diferents canvis. Aquestos seràn el nom, l'email i l'editor.
git config --global user.name "Roberto Nebot" 
git config --global user.email "rnegoz [ad] mymail.com"
git config --global core.editor "vim" 
Per comprobar que hem configurat correctament el nom, l'email i l'editor de text utilitzàrem la següent comanda:
git config --list
user.name=Roberto Nebot
user.email=rnegoz (ad) mymail.com
core.editor=vim
Una volta configurada la informació de l'usuari generarem el nostre primer respositori i començarem a treballar amb ell
git init test
La primera tasca que realitzàrem serà generar un fitxer README i escriure el nostre primer commit afegint aquest fitxer al registre de canvis.
cd test
touch README
git add README 
git commit -m "Added an empty README file"
[master (root-commit) 6c9545e] Added an empty README file
 1 file changed, 1 insertion(+)
 create mode 100644 README
Existeix la possibilitat també d'utilitzar un repositori extern d'Internet, ja siga perquè volem contribuïr al projecte o treballar fer proves en local, etc. Per clonar un repositori remot utilitzarem la següent comanda:
git clone https://github.com/major/securekickstarts
Una volta tinguem un repositori creat o clonat des d'una font remota ja podem començar a treballar. El primer que provarem serà veure l'estat dels fitxers del projecte myfirstproject que hem creat abans. Per veure l'estat dels fitxers teclejarem:
git status
En la rama master
nothing to commit, working directory clean
Si editem el fitxer README i li afegim algunes dades quan tornem a realitzar un status, ens indica que el fitxer ha sigut modificat:
vi README
git status
En la rama master
Cambios no preparados para el commit:
  (use «git add ...» para actualizar lo que se confirmará)
  (use «git checkout -- ...» para descartar cambios en el directorio de 
   trabajo)

 modificado:    README

no hay cambios agregados al commit (use «git add» o «git commit -a»)

Com el fitxer ha sigut modificat i els canvis no han sigut inclosos, el marquem per a que s'afegisquen quan realitzem el següent commit:
git add README 
Si tornem a realitzar un status del directori de treball ens indica que el fitxer serà afegit en el proper commit.
git status
En la rama master
Cambios para hacer commit:
  (use «git reset HEAD ...» para sacar del stage)

 modificado:    README


Realitzem el commit.
git commit -m "This is my first change on README file."
[master e2985e1] This is my first change on this file.
 1 file changed, 1 insertion(+)


Ara crearem un fitxer .gitignore per a que Git ometa determinats fitxers del directori de treball. Podem utilitzar expresions regulars en la definició del fitxer.
vim .gitignore
cat .gitignore 
*.log
Es possible també obtenir una informació més resumida del estatus del fitxer amb la següent comanda, per obtenir-la afegim més dades al README:
vim README
git status -s
 M README
?? .gitignore
Seguidament utilitzarem la comanda diff per veure les diferències entre el fitxer del directori de treball i el que tenim guardat a l'últim commit.
diff --git a/README b/README
index 3d6526c..7d81acf 100644
--- a/README
+++ b/README
@@ -1 +1,2 @@
 This is my first change on this file.
+Some minor modifications on the file.
Si afegim el fitxer .gitignore a l'àrea de staging i realitzem el diff amb l'opció --staged veiem els canvis de staged respecte a l'últim commit.
git add .gitignore
git diff --staged
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..397b4a7
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1 @@
+*.log
Per a esborrar un fitxer en Git hem de esborrar-lo de l'àrea d'staging per evitar que Git continue realitzant el control de versions. Això ho aconteseguim amb la següent comanda. Com es pot veure, com hi han canvis respecte a l'últim commit no ens deixa esborrar el fitxer a menys que específicament utilitzem l'opció -f.
git rm README 
error: the following file has local modifications:
    README
(use --cached to keep the file, or -f to force removal)
Realitzem el commit.
git add README 
git status
En la rama master
Cambios para hacer commit:
  (use «git reset HEAD ...» para sacar del stage)

 nuevo archivo: .gitignore
 modificado:    README


git commit -m "Adding .gitignore and some additions on README"
[master b2bdb6e] Adding .gitignore and some additions on README
 2 files changed, 2 insertions(+)
 create mode 100644 .gitignore
Si intentem esborrar el fitxer README ara ja ens deixarà.
git rm README 
rm 'README'
git status
En la rama master
Cambios para hacer commit:
  (use «git reset HEAD ...» para sacar del stage)

 borrado:       README


Un error amb el que ens podem trobar és la necessitat d'esborrar un fitxer afegit a staging per error, per exemple, un log que no hem afegit al .gitignore. Per esborrar elements de l'àrea d'staging utilitzàrem rm --cached. Al següent example ho podem veure:
touch file1
git add file1
git status
En la rama master
Cambios para hacer commit:
  (use «git reset HEAD ...» para sacar del stage)

 borrado:       README
 nuevo archivo: file1

git rm --cached file1
rm 'file1'

git status
En la rama master
Cambios para hacer commit:
  (use «git reset HEAD ...» para sacar del stage)

 borrado:       README

Archivos sin seguimiento:
  (use «git add ...» para incluir en lo que se ha de confirmar)

 file1

A més a més d'esborrar, ens pot aparèixer la necessitat de moure un fitxer o renombrar-lo. Git disposa de la comanda mv. En el següent exemple veurem el seu ús.
touch README
git add README 
git status
En la rama master
Cambios para hacer commit:
  (use «git reset HEAD ...» para sacar del stage)

 modificado:    README

Archivos sin seguimiento:
  (use «git add ...» para incluir en lo que se ha de confirmar)

 file1


git mv README README.md
git status
En la rama master
Cambios para hacer commit:
  (use «git reset HEAD ...» para sacar del stage)

 borrado:       README
 nuevo archivo: README.md

Archivos sin seguimiento:
  (use «git add ...» para incluir en lo que se ha de confirmar)

 file1

Arribats fins aquest punt, revisarem l'historial de commits del projecte. Per poder-ho fer hi ha que teclejar la següent comanda:
git log
commit b2bdb6e16581c5be9f66176145ba340f87eddfff
Author: Roberto Nebot 
Date:   Fri Aug 5 09:49:10 2016 +0200

    Adding .gitignore and some additions on README

commit 3e4b22e07cb6e5f1a4d01a9bccfcb09e251c74bf
Author: Roberto Nebot 
Date:   Thu Aug 4 18:28:41 2016 +0200

    This is my first change on README file.

commit 53d903731e17709feed4121b0c10215a4ff8da78
Author: Roberto Nebot 
Date:   Thu Aug 4 18:20:04 2016 +0200

    Added an empty README file

En aquest moment afegirem un commit amb els últims canvis. Introduïrem un error en un commit per a modificar-lo després. Per modificar un commit utilitzarem --amend. Aquesta comanda llançarà un editor de text amb l'editor definit a la variable core.editor de la configuració global de Git, per defecte es nano.
git commit -m "This commit will be amended"
[master b148abf] This commit will be amended
 2 files changed, 2 deletions(-)
 delete mode 100644 README
 create mode 100644 README.md
git commit --amend
git log
commit f21c572eef8c9164a280928f7f12fc91bccf19fd
Author: Roberto Nebot 
Date:   Fri Aug 5 10:17:46 2016 +0200

    An empty README.md file has been added

commit b2bdb6e16581c5be9f66176145ba340f87eddfff
Author: Roberto Nebot 
Date:   Fri Aug 5 09:49:10 2016 +0200

    Adding .gitignore and some additions on README

commit 3e4b22e07cb6e5f1a4d01a9bccfcb09e251c74bf
Author: Roberto Nebot 
Date:   Thu Aug 4 18:28:41 2016 +0200

    This is my first change on README file.

commit 53d903731e17709feed4121b0c10215a4ff8da78
Author: Roberto Nebot 
Date:   Thu Aug 4 18:20:04 2016 +0200

    Added an empty README file

Si necessitem de moure fitxer de l'àrea d'stagging a l'àrea de treball, per evitar incloure el fitxer al commit podem utilitzar la comanda git reset HEAD <file>.
git status
En la rama master
Archivos sin seguimiento:
  (use «git add ...» para incluir en lo que se ha de confirmar)

 file1

no se ha agregado nada al commit pero existen archivos sin seguimiento 
   (use «git add» para darle seguimiento)
git add file1 
git status
En la rama master
Cambios para hacer commit:
  (use «git reset HEAD ...» para sacar del stage)

 nuevo archivo: file1

git reset HEAD file1
git status
En la rama master
Archivos sin seguimiento:
  (use «git add ...» para incluir en lo que se ha de confirmar)

 file1

no se ha agregado nada al commit pero existen archivos sin seguimiento 
   (use «git add» para darle seguimiento)
A continuació, revertirem un fitxer que ha sigut modificat a l'estat del seu últim commit. El fitxer no ha d'estar en l'àrea d'staging, ha d'estar en el directori de treball.
git add file1
git commit -m "This is an empty file1"
[master 3158758] This is an empty file1
 1 file changed, 0 insertions(+), 0 deletions(-)
 create mode 100644 file1
git status
En la rama master
nothing to commit, working directory clean
vi file1 
git status
En la rama master
Cambios no preparados para el commit:
  (use «git add ...» para actualizar lo que se confirmará)
  (use «git checkout -- ...» para descartar 
        cambios en el directorio de trabajo)

 modificado:    file1

no hay cambios agregados al commit (use «git add» o «git commit -a»)
cat file1 
This is my first line in this file.
git checkout -- file1
cat file1
Per últim la següent comanda mostra els fitxers que tenim a Git.
git ls-tree -r master 
100644 blob 397b4a7624e35fa60563a9c03b1213d93f7b6546 .gitignore
100644 blob e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 README.md
100644 blob ca944af541d42052824a268ed72e97e3b8537b3c file1
100644 blob e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 file2

Enllaços:

http://wildlyinaccurate.com/a-hackers-guide-to-git
http://askubuntu.com/questions/206449/git-config-global-file-remove-settings
https://try.github.io/levels/1/challenges/1