# GIT - La guía definitiva ## Control de versiones ### ¿Qué es un sistema de control de versiones? Un sistema de control de versiones es un sistema que nos permite guardar un registro de las modificaciones de un archivo a lo largo del tiempo, de tal manera que sea posible recuperar versiones o cambios específicos más adelante. Imaginemos que varias personas desean trabajar al mismo tiempo sobre un mismo archivo o proyecto. Sin un sistema de control de versiones, sería una tarea tediosa ya que los individuos deberían tener una gran coordinación sobre el trabajo. Podríamos comparar a un sistema de control de versiones con la opción de “Guardar progreso” de un videojuego. Cada cierto tiempo o cada cierto progreso en el juego, el jugador guardará el estado actual para no perderlo ante cualquier problema. Estos sistemas de control de versiones toman una “foto” del archivo y luego la guardan, creando un álbum al cual podremos consultar por si queremos volver a un estado particular. Existen vario siendo los más conocidos: SVN Y Git. ## Git ### ¿Por qué Git? Como mencionamos anteriormente, Git es un sistema de control de versiones. Este manual describe el uso básico de esta herramienta en particular ya que actualmente es la más utilizada. ### Como instalar Git Podemos encontrar una guía en: https://git-scm.com/book/es/v2/Inicio---Sobre-el-Control-de-Versiones-Instalaci%C3%B3n-de-Git ### Estructura Vamos a llamar **repositorio** al lugar donde está alojado nuestro código. Tenemos dos: Uno local (en nuestra computadora) y otro remoto (en un servidor). Nuestro repositorio local está compuesto por tres "Árboles": * **Directorio de trabajo**: Contiene nuestros archivos. * **Index**: Es una zona intermedia. * **HEAD**: Apunta al ultimo cambio realizado Supongamos que estamos trabajando en colaboración con otras personas. Vamos a necesitar un repositorio donde esté centralizado todo. Ahí es donde entran en juego los repositorios remotos. ### Github Github es una plataforma donde se alojan miles de repositorios de código. Al igual que ésta, existen otras como lo son Gitlab o Bitbucket. Esta plataforma es la que utilizaremos para alojar nuestro repositorio remoto, al cual podrán acceder los distintos colaboradores del proyecto. ### Conceptos básicos * **Branch (rama)**: Un branch es una copia del proyecto a partir de un cierto punto, el cuál nos va a permitir trabajar sobre una copia del código original pero sin modificar el código original. Por lo general, el branch principal se llama “Master”. * **Commit**: Una vez que nuestros cambios están en el Index (la zona intermedia que mencionábamos antes), haremos un *commit* para ponerlos en el HEAD. En otras palabras, con un commit guardamos nuestros cambios. Al hacer un commit, podemos también escribir una descripción de los cambios que hicimos. * **Origin**: Hace referencia al repositorio remoto. * **Merge**: Es cuando el código de nuestro branch se une o bien con el código de otro branch o bien con el código hecho por otra persona sobre el mismo branch. * **Pull request**: Es una solicitud que hacemos en el repositorio remoto para luego hacer un merge de dos branch. ### Comandos básicos Git es una herramienta que fue pensada originalmente para ser utilizada por linea de comandos (terminal), aunque hay adaptaciones para los distintos entornos de desarrollo, haciendo que sea muy fácil de utilizar. * **git init**: Crea el repositorio local. * **git remote add**: Asigna un repositorio remoto (previamente creado) a nuestro repositorio local. Hay que especificar el nombre y la url. Por ejemplo: *git remote add origin https://github.com/nuestroUsuario/nuestroRepo.git* * **git clone**: Clona un repositorio remoto en nuestra computadora. Si usamos este comando, no hace falta utilizar *git init*. Por ejemplo *git clone https://github.com/github/linux*. * **git checkout**: Sirve para moverse entre branchs en nuestro repositorio local, también con este comando se pueden crear nuevos. Por ejemplo: *git checkout staging* (si ya existe) o *git checkout -b staging* (si no existe). * **git diff**: Con este comando podemos revisar los cambios que hicimos antes de añadirlos al Index. * **git add**: Registra nuestros cambios en el Index. Por ejemplo *git add style.css*. * **git commit**: Incluye nuestros cambios en el HEAD, guarda los cambios en el repositorio local. Por ejemplo: *git commit -m "Arregla el error del navbar"*. * **git push**: Envía el ultimo commit del repositorio local al repositorio remoto. Hay que especificar el repositorio remoto y el branch sobre el cuál estamos trabajando. Si el branch existe en el repositorio local pero no en el remoto, entonces se creará automáticamente. Por ejemplo: *git push origin master*. * **git pull**: Trae los últimos cambios del repositorio remoto a nuestro repositorio local. Hay que especificar el repositorio remoto y el branch sobre el cuál queremos trabajar. Por ejemplo: *git pull origin master*. ### Ejemplo de flujo de trabajo Se propone un ejemplo donde clonamos un repositorio, hacemos algunos cambios y luego los subimos nuevamente al repositorio remoto. ``` 1. git clone https://github.com/miUsuario/miProyecto proyectito (Clonamos el repositorio remoto de react en el directorio "proyectito") 2. git checkout -b arreglarNavbar (Creamos un branch en nuestro repositorio local para los nuevos cambios) 3. Hacemos los cambios deseados en el código. (Supongamos que modificamos el archivo index.html) 4. git diff index.html (Vemos los cambios que hicimos en el archivo index.html) 5. git add index.html (Agregamos al Index los cambios del archivo index.html) 6. git commit -m "Agrega una clase a los elementos del navbar" (Guardamos nuestros cambios junto al mensaje entre comillas) 7. git push origin arreglarNavbar (Subimos nuestros cambios al repositorio remoto. Como el branch "arreglarNavbar" solo existía en el repositorio local, automaticamente se crea tambien en el repositorio remoto) ```