Github pràctic: control de versions

De wikijoan
Salta a la navegació Salta a la cerca

Introducció[modifica]

La manera com hem fet servir Github 1000 vegades és descarregar un projecte públic:

$ git clone [url]
Clone (download) a repository that already exists on
GitHub, including all of the files, branches, and commits

Però el que volem és estudiar el flux de treball i el versionat de projectes, amb comandes de la consola, i sincronitzar-ho tot a Github.com.

El primer que necessitem evidentment és un compte a Github.com:

(joanillo/jq********)

Referències[modifica]

Github Cheat Sheet:

Github pràctic[modifica]

Farem un cas pràctic del cicle de vida d'un projecte de Github.

Dels diferents documents que he seguit, em baso principalment amb:

  1. Farem un projecte de prova, i crearem un repositori de prova a github.com. Un possible flux de treball seria:
  2. Estic treballant en un projecte, en local
  3. Des de la línia de comandes, crear el git local per versionar el projecte.
  4. Des de la línia de comandes, o des de github.com, crear el projecte i repositori a github.com
  5. Treballem en el projecte amb la branca master, i pugem els canvis a la branca master.
  6. Creem una nova branca.
  7. Sincronitzem aquesta branca a github.com
  8. Treballem en la nova branca
  9. Comparar les dues branques en local
  10. Fem un merge en local
  11. etc

Treballarem en el projecte git_test. Segueixo la part del tutorial que diu: Below is a quick exercise so you can familiarise yourself with these command line tools.

git commit -m "first commit"

$ mkdir git_test
cd git_test

I ja podem crear un repositori Git sobre aquest directori:

$ git init

El primer que farem és crear un fitxer (README.md) i veure com poder controlar les seves versions:

$ joe README.md (editem el fitxer)
$ git add README.md

Acabem d'afegir aquest fitxer a la staging area, però encara no n'hem fet un commit al repositori. Per fer el commit:

$ git commit
millor
git commit -m "first commit"

Ara al remot Github.com haurem de crear el repositori git_test. Ho fem directament a

I ara ja podem definir un origen remot amb el qual ens sincronitzarem:

$ git remote add origin https://github.com/joanillo/git_test.git

I ara ja podem fer un push per sincronitzar el nostre directori local amb el remot. De moment, l'únic que tenim és el fitxer README.me. Ens demana el login i password, com és lògic.

$ git push -u origin master

Podem comprovar en el remot github.com/joanillo/git_test que tenim aquest fitxer.

Continuem fent més edicions, i les sincronitzem amb el remot:

$ joe fitxer1
$ joe fitxer2

$ git add . -> posem tots els fitxers del local en el staged area
$ git commit -m "canvi 2" -> fem un commit de tots els fitxers, a punt per sincronitzar
$ git push -u origin master -> sincronitzem

Ara faig un canvi en el fitxer2 de github.com, i el gravo. És a dir, faig un canvi en el remot. Si vull tenir els canvis en local, he de fer git pull:

$ git pull
$ joe fitxer2 -> veig en local el canvi que he fet en remot.

En un projecte col·laboratiu, abans de fer un commit s'ha de fer un pull, doncs podria ser que mentre hem estat treballant també hi hagi gent que ha retocat els fitxers del remot.

Fins ara he treballat en una sola branca. Ara vull crear una nova branca, en local. Per crear la branca i automàticament canviar a aquesta branca:

$ git checkout -b [name_of_your_new_branch]https://ourcodingclub.github.io/tutorials/git/
$ git checkout -b branca_nova

(l'opció -b és per crear. Si només vull canviar només s'ha de fer git checkout <branca>. Per saber totes les opcions:

$ git checkout --help

I ara fem el push d'aquesta branca a github.com:

$ git push origin [name_of_your_new_branch]
$ git push origin branca_nova

i efectivament, al remot tenim la nova branca

Per saber les branques que tinc: (amb * surt la branca actual)

$ git branch -a
* branca_nova -> local (branca actual)
  master -> local
  remotes/origin/branca_nova -> remot Github.com
  remotes/origin/master -> remot Github.com

Fem canvis a fitxer2:

$ git commit -a
$ git commit -a -m "commit sense fer add ni stagina area"
$ git push origin branca_nova

Fem els canvis amb l'opició -a. Compte perquè l'opció -a només serveix per fer el stage dels canvis que s'han modificat i esborrat, però no dels fitxers nous. La idea de la -a és add changes, però no pas afegir fitxers nous.

$ git commit --help

I ara ja puc veure com el fitxer2 té versions diferents en la branca master i en la branca_nova.

Per veure les diferències entre les dues branques:

$ git diff master branca_nova

I ara vull incorporar a la branca master els canvis que he fet en la branca_nova.

Primer canvio a la branca master:

$ git checkout master

(comprovar fent joe fitxer2)

Faig el merge de la branca_nova a la branca master (la branca actual)

$ git merge branca_nova

(comprovar fent joe fitxer2)

I ara ja puc actualitzar la branca master del remot:

$ git commit -a -m "he fet el merge de branca_nova"
$ git push origin master

És a dir, el merge el faig en local. Tant en local com en remot tinc el control de versions (tot i que no es visualitza en carpetes).

Per tant, quan creo una nova versió d'un projecte, no s'ha de crear una carpeta, sinó que n'hi ha prou en crear una branca.

Ara continuo desenvolupant. Puc crear una nova branca, o continuar treballant amb la branca_nova, que considero de desenvolupament. És a dir, la branca master es considera que és la branca de producció, i la branca_nova de desenvolupament.

$ git checkout branca_nova

creo dos fitxers

$ joe fitxer3
$ joe fitxer.pdf

Els fitxers pdf vull que siguin ignorats, així com el fitxer ocult .pwd i els fitxers temporals que acaben amb ~.

The .gitgnore file:

Sometimes it may be a good idea to exclude files from being
tracked with Git. This is typically done in a special file named
 .gitignore . You can find helpful templates for .gitignore
files at github.com/github/gitignore

.gitignore es crea en la carpeta principal:

$ joe .gitignore

# Prevent users to commit password
.pwd
# Temporary files
*~
#pdf files
*.pdf

I sincronitzem els canvis al remot:

$ git add .
$ git commit -m "provo gitignore"
$ git push origin branca_nova

I ara efectivament a Github.com ja tinc el fitxer3, però el pdf no s'ha pujat.

Explicació de la staging area:

Imagine a box. You can put stuff into the box. You can take stuff out of the box. This box is the staging area of Git. You can craft commits here. Committing is like sealing that box and sticking a label on it. The contents of that box are your changes. So, why not have the label mean something? You wouldn’t label a moving box with kitchen items as simply stuff.

Diferència entre treballar amb la staging area o fer-ho directament:

$ git add .
$ git commit -m "provo gitignore"

Poso els fitxers del working Dir a la staging area. Faig el commit en el git local, segello els canvis (abans de sincronitzar amb github.com, o no)

$ git commit -a -m "provo gitignore"

Poso els fitxers del working Dir directament al commit local (però compte, només els fitxers canviats i esborrats, no pas els nous).

Resum pràctic[modifica]

1. crear el repositori a github.com (amb el mateix nom que la carpeta de treball en local)

2. en local:

git init
joe README.md
joe .gitignore

Per ex:

# Temporary files
*~
#Ignore folders
python/previ1
python/previ2
python/previ3

3. Vincular el remot

git remote add origin https://github.com/joanillo/fusionar_geojson.git

4. Afegir fitxers al stage area i fem el commit:

git add .
git commit -m "commit1"

5. Vull pujar al remot (he tingut un problema, perquè en el remote hi ha el fitxer de LICENCE, i per tant s'ha de fer un pull, però em diu no sé què de unrelated-histories). Ho soluciono fent:

git pull --allow-unrelated-histories origin master

6. Pujo al remot:

git push -u origin master

Ara si més no tinc una còpia de seguretat del projecte, amb una sola branca.

A partir d'aquí podem tenir una branca de desenvolupament i una branca de producció.


creat per Joan Quintana Compte, abril 2020