~~REVEAL~~ ====== VCS: Sistema de control de versions ====== Un sistema de control de versions (VCS: Version Control System) ens permet portar un seguiment exhaustiu dels canvis que es van produint al codi que desenvolupem. Ens ha de facilitar recuperar versions antigues dels arxius que elaborem, en cas de pèrdua o introducció d'errors durant el desenvolupament. [[Git|A l'article Git]] trobaràs xuleta i exercicis concrets per l'utilització pràctica d'aquest sistema de versionat hegemònic. Referències: * [[Git|Git a bytes.cat]] : amb exercicis i xuleta. * [[https://git-scm.com/|Doc oficial Git]] * [[https://www.atlassian.com/es/git/tutorials/what-is-version-control|Tutorial Git Atlassian]] * [[https://cacauet.org/wiki/index.php/Git:_comandes|Resum de comandes Git]] {{tag> #Daw #DawMp08 #DawMp08Uf4 #DawMp08Uf04 #DawMp05 #DawMp05Uf2 #DawMp05Uf02 #Dam #DamMp05 #DamMp05Uf2 #DamMp05Uf02 #Ciber #CiberMp03 #Ceti #CetiMp03 git cvs vcs versions subversion svn DevOps }} ===== Introducció ===== Els magatzems de codi els anomenem **repositoris**. Cada cop que fem un canvi en el repositori el consolidem fent un **//commit//**. Això ens resultarà en una "foto instantània" dels arxius del repositori i solen marcar-se amb un //hash// que permet fer-hi referència i comprovar la seva integritat. {{ commits.png }} També ens permetrà tenir un **historial** de tots els canvis efectuats al repositori, consultable i recuperable en qualsevol moment. ==== Videotutorial ==== Videotutorial per iniciar-se amb Git i Apache: {{youtube>YpSaqTe9M2E}} \\ ===== Branques ===== Una de les missions importants d'un VCS és la de facilitar el treball en equip. Això s'aconsegueix mitjançant la creació de **branques** o //**branches**//. Aquestes permeten treballar i evolucionar una versió del codi sense afectar a la resta del repositori de codi. {{ branch-scrum.gif?direct }} Exemple1: Branques d'un repositori orientades a desenvolupament amb metodologia Scrum. ===== Branques orientades a desplegament ===== Habitualment tindrem, com a mínim, 3 branques: dev, pre i pro {{ branches6.png?direct }} Originem una branca a partir d'un punt de versió concret o //commit//. A partir d'aquell moment podem fer canvis a la branca sense afectar les altres. ===== Merge: fusió de branques ===== Quan volem incorporar els canvis fets d'una branca a una altra realitzem un **//merge//**. **Aquesta operació és delicada i implica refer tots els tests necessaris per assegurar-nos que el codi fusionat continua funcionant**. {{ vcs-merge.png?direct }} \\ ===== Centralitzat vs Distribuït ===== Inicialment es van fer servir **sistemes de control de versions centralitzats** ja que facilitaven la implementació del software VCS, però aquests no eren prou eficients en la gestió del treball en equip: quan un usuari prenia el control d'un arxiu, els altres no el podien modificar. A mes, estaves obligat a treballar en xarxa contínuament i la gestió de branques era poc flexible i complexa. Exemples d'aquest sistema son CVS, Subversion o Razor. {{ vcs-centralitzat.png }} Per exemeple, quan un desenvolupador havia d'editar un arxiu, el bloquejava i els altres usuaris no el podien escriure, només llegir-ho. ===== VCS distribuït ===== {{ vcs-distribuit.png }} En canvi, un **sistema de control de versions distribuït** permet treballar amb la filosofia //peer to peer//, és a dir, que puc descarregar els canvis de qualsevol altre usuari en qualsevol moment, sense tenir un repositori central com al cas anterior. Exemples de sistemes de control de versions: * Centralitzat: CVS, Subversion (SVN) * Distribuït: Mercurial (Hg), Git \\ ===== Git ===== **Git és l'actual sistema de control de versions hegemònic** de forma incontestable. El va crear Linus Torvalds el 2007 per al desenvolupament del nucli Linux. Tota la resta de productes han quedat totalment sobrepassats per Git. Això es deu a: * Codi lliure. * Pensat per a projectes grans. * Arquitectura distribuïda. * Rapidesa de manipulació (merges de menys d'1 segon). * Optimització d'ús i d'ocupació de recursos d'emmagatzemament. Git controla contingut, no arxius. Per tant, és molt fàcil esborrar, reanomenar sense avisar a Git, i l'historial es manté :) \\ ===== Git (2) ===== Algunes dades de referència (del 2009): * Linux Kernel constava de 22.000 arxius. * Mostrar les diferències de tot el Linux kernel (74.000 commits) comportava 7 segons (cold cache) o 2.3 segons (warm cache). * El repositori de Mozilla Project ocupava: * En CVS : 3GB * En Subversion : 12 GB * En Git : 300 MB \\ ===== Com funciona Git ===== Mostrem en imatges com funciona Git: {{ git1.png?600 }} Comencem desenvolupant un projecte en local. Prem abaix per seguir la seqüència: ==== Clonació ==== Un segon desenvolupador fa una còpia del nostre projecte. {{ git2.png?600 }} ==== Afegint codi ==== Cada desenvolupador segueix treballant individualment. {{ git3.png?600 }} ==== Més codi ==== Els canvis de cadascun no afecten l'altre. {{ git4.png?600 }} ==== Fetch ==== El desenvolupador principal descarrega els canvis que ha fet el 2n desenvolupador. {{ git5.png?600 }} ==== Merge ==== Combina els canvis amb el seu projecte amb un MERGE. {{ git6.png?600 }} ==== Fetch (2) ==== Finalment, el segon desenvolupador descarrega els canvis del primer, amb els seus propis canvis integrats. {{ git7.png?600 }} \\ ===== Bones pràctiques ===== Disposar de Git és una gran cosa, però també cal seguir unes bones pràctiques a l'hora de crear i administrar les branques. ===== Distribuït però centralitzat ===== Amb **"distribuït però centralitzat"** es vol dir que el sistema suporta un esquema distribuït on els desenvolupadors poden descarregar-se el codi d'altres companys, però finalment **hi ha un repositori de referència que es sol dir //origin//**, on es deixen els canvis consolidats i testejats. Un projecte en Git pot ser centralitzat per conveniència, però no per arquitectura, permetent els desenvolupadors treballar descentralitzadament. {{ centr-decentralized-vcs.png?direct&650 }} ===== Model exitós: git-flow ===== Fa 10 anys [[https://nvie.com/posts/a-successful-git-branching-model/|Vincent Driessen va proposar un model de treball]] o //workflow// que encara avui es considera el de referència de forma estàndard, fins al punt que l'han anomenat **"Git-flow"**. {{ hotfix-branches.png?500 }} ===== Caraterístiques del "git-flow" ===== A l'[[https://nvie.com/posts/a-successful-git-branching-model/|article de git-flow de Driessen]] s'expliquen els diversos tipus de branques i com utilitzar-les: * Main branches, existeixen sempre * **main** : abans es deia "master", però s'ha canviat a "main" per evitar nomenclatures esclavistes. * **develop** : mes coneguda per **dev** * Supporting branches: * Feature branch : noves funcionalitats * Release branch : **pre** (preproducció) / **pro** (production) * Hotfix branch : per solucionar //bugs//. \\ ===== Primeres pràctiques amb Git ===== [[Git|Segueix llegint l'article de Git]] on trobaràs exercicis pràctics i xuletes.