--- title: 01. Sistemes de controls de versions [GIT] tags: daw, GIT, Control Versions, M8, SOC --- <div style="width: 30%; margin-left: auto;"> ![](https://hackmd.io/_uploads/HJiR4eGJT.png) ![image](https://hackmd.io/_uploads/By3ai4Bolx.png) </div> <a rel="license" href="http://creativecommons.org/licenses/by-sa/4.0/"><img alt="Llicència de Creative Commons" style="border-width:0" src="https://i.creativecommons.org/l/by-sa/4.0/88x31.png" /></a><br />Aquesta obra està subjecta a una llicència de <a rel="license" href="http://creativecommons.org/licenses/by-sa/4.0/">Reconeixement-CompartirIgual 4.0 Internacional de Creative Commons</a> # 01. Sistemes de controls de versions [GIT] ![](https://hackmd.io/_uploads/H1_wniXS3.png) ## Què és un sistema de control de versions. Un sistema de control de versions és un programari o un conjunt de programaris que permenten gestionar l'historial de canvis d'un conjunt de fitxers al llarg del temps. Entre d'altres funcionalitats, ens permet recuperar estats anteriors d'un conjunt de fitxers o d'un sol fitxer en particular. Una altra funcionalitat força atractiva és que ens permet que diversos dessenvolupadors editin un mateix fitxer localment i es puguin fusionar tots els canvis de manera segura. Altres funcionalitats: * Veure tots els canvis realitzats a un projecte, qui els va fer i quan. * Afegir un missatge a cada conjunt de canvis realitzat. * Crear branques d'un projecte, cadascuna amb els seus conjunts de canvis de forma que no interfereixin les modificacions fetes a una branca a les altres branques i si s'escau fusionar-les novament. * Etiquetar estats temporals dels projectes. Per exemple, releases. ![Imatge de control de versions](https://hackmd.io/_uploads/SJYrGCqsgg.jpg) ## Què és GIT? GIT és el sistema de control de versions hegemònic actualment. És un control de versions distribuit de programari lliure. GIT administra la història del nostre projecte a un fitxer ocult anomenat .git que es situa al nivell superior de l'estructura de directoris que volem gestionar. A aquest directori que conté tota l'història de canvis del nostre projecte li diem __repositori__. ![Sense títol](https://hackmd.io/_uploads/H1jTGAcjee.jpg) ## Per què GIT? Com hem comentat al paràgref anterior, GIT eś el sistema de control de versions **hegemònic** avui i desde ja fa força anys, el seu percentatge d'ús és abrumador. ## Nomenclatura utilitzada a GIT. * Arbre de treball: Conjunt de directoris i fitxers que conté el nostre projecte. La nostra àrea de treball en l'estat actual. * Repositori: Arxiu ocult gestionat per GIT que conté tota la història de canvis del nostre projecte. Conté tota la informació històrica del nostre projecte. * Hash: És un nombre que identifica qualsevol tipus d'objecte dins de GIT de manera unívoca. Els objectes de GIT inclouen moltes coses, entre elles els commits. * Commit: Conjunt de canvis que es desen a l'historial de GIT. Tenen associats un comentari i un Hash. * Branca: Línia independent de commits vinculats, permeten als desenvolupadors treballar de forma paralel·la i eventualment fusionar els canvis en una branca comuna. * Remot: No és més que una referència a un altre repositori git amb un nom associat. **Important**: El remot pot ser un repositori al núvol, GitHub, GitLab o equivalents, però també pot ser un repositori a un servidor local o inclús un repositori a una altra carpeta del nostre propi sistema de fitxers local. ## Instal·lació i configuració inicial. A Ubuntu-Linux, podem instal·lar GIT amb la comanda: > $ sudo apt install git Verificarem la correcta instal·lació demanant-li la versió: > $ git --version Configuració mínima inicial: ```bash= $ git config --global user.name «my_name» $ git config --global user.email «my_email» $ git config --global core.editor [vim|nano|gedit|others] ``` ![Sense títol](https://hackmd.io/_uploads/rJblQC9jgl.png) ### Fitxers de configuració: GIT utilitza un sistema de configuració en _cascada_. Hi ha tres nivells diferents de configuració, cadascú en un fitxer diferent que s'apliquen de forma ordenada i els nivells més concrets sobrescriuen les configuracions del nivell superior. * Nivell superior: aplica a tots els usuaris del sistema. Es configura al fitxer: /etc/gitconfig * Nivell d'usuari: Sobrescriu les configuracions aplicades al nivell superior, aplica a tots els repositoris del mateix usuari. Es configura al fitxer: ~/.gitconfig o ~/.config/git/config depenent de la distro de Linux utilitzada. * Nivell inferior: Sobrescriu les configuracions aplicades al nivell d'usuari, aplica només a un projecte. Es configura dins del mateix projecte al fitxer: .git/config ### Creació d'un nou repositori. ![Sense títol](https://hackmd.io/_uploads/H1g4QC5seg.jpg) Per a convertir qualsevol directori del nostre sistema de fitxers en un arbre de treball de GIT només hem d'executar la comanda > $ git init i es generarà el directori ocult .git que conforma el nou repositori. També podem importar un repositori preexistent amb la comanda: > git clone <ruta_repositori_existent> ### Generant commits (còpia de seguretat de l'estat actual) ![Sense títol](https://hackmd.io/_uploads/ByBb5A9sex.jpg) Un cop que tenim el nostre repositori generat (amb la comanda __git init__ explicada abans), i hem començat a treballar, podem realitzar una _'còpia de seguretat'_ en qualsevol moment. Amb GIT no fem una còpia de tot l'arbre de treball de manera indiscriminada, només d'aquells fitxers i/o directoris que considerem adients. Per a indicar de quins fitxers hem de realitzar la còpia de seguretat els hem d'afegir a un àrea especial anomedada '_staging area_' o _'index'_. Per afegir fitxers a l'staging area utilitzem la comanda `git add <nom_fitxer>`. Si volem consultar quins fitxers tenim en estat '_staged_' podem utilitzar la comanda: `git status`. Per treure un fitxer de l'staging area i que no formi part del proper commit, utilitzem la comanda: `git restore --staged <ruta_fitxer>` ### Practiquem una mica. ![images](https://hackmd.io/_uploads/Hy88qR9iex.jpg) [Pràctica 01 -GIT-. Inicialització d'un repositori GIT](/G0bN4IXwQtOYiFTnocgtIw) ### Més informació. [02. Git com a llista de commits ordenats en el temps.](/aLlqarGrSDeBWPrkliswgw)