1 - Control de Versiones Teórico - Práctico
1 - Control de Versiones Teórico - Práctico
1 - Control de Versiones Teórico - Práctico
1. Primero vimos cómo crear un repositorio local con git init y mantener nuestros
cambios con git add -A y git commit -m "Mensaje del commit" .
2. Pero no solo eso, también hemos aprendido a conectar nuestro proyecto local con un
repositorio remoto alojado en GitHub con git remote add
3. O directamente, a crearlo en Github y clonarlo en nuestro equipo con git clone .
También vimos cómo publicar nuestro trabajo a través del sistema de hosting propio de
GitHub: GitHub Pages.
Hoy vamos a ver cómo trabajar en grupo sobre el mismo proyecto y sus archivos.
Lo más sencillo es crear el proyecto de cero desde nuestro servicio de Git, en este caso,
GitHub:
4. Ahora podemos elegir tres acciones (se pueden elegir las tres, alguna o ninguna):
5. Una vez creado solo faltaría clonarlo a nuestro ordenador para trabajar con él, hay dos
formas:
Desde la terminal voy a la carpeta donde quiero clonar el proyecto y, con la url que me
da github para clonar, escribo: git clone url-del-repositorio-que-me-da-github .
Si quiero clonarlo y usar un nombre específico para la carpeta de mi repositorio sigo el
paso uno, pero escribo:
git clone url-del-repositorio-que-me-da-github nuevo-nombre-de-carpeta
README.md
Ejemplos de readme.md:
.gitignore
Git tiene un sistema para poder ignorar archivos de un proyecto.
¿Y por qué querríamos hacer esto? Porque habrá archivos que necesitemos en nuestra
carpeta de trabajo local pero que no queramos subir al repositorio ni controlar sus
cambios.
En proyectos pequeños como los que tenemos ahora vamos a querer siempre subir al
repositorio remoto todos nuestros archivos. Pero podría pasar que tuviésemos una carpeta
con los archivos de diseño de ciertas partes del proyecto o archivos comprimidos que
usamos para enviar a nuestro cliente los avances.
NOTA: Es muy común que el propio sistema operativo cree en cada carpeta una serie de
archivos o carpetas ocultas que le ayudan a realizar tareas como la búsqueda de
archivos.
Estos archivos, que no tiene sentido tener "controlados" pero que en nuestra carpeta local
queremos mantener, se listan en este archivo especial, .gitignore para decirle al
algoritmo de Git que no los tenga en cuenta.
En gitignore.io podemos encontrar una serie de configuraciones ya hechas que nos ayudan
a ignorar tipos de archivos comunes según el sistema operativo o el lenguaje en el que
trabajemos.
Licencia
Uno de los puntos claves un entorno social donde poner al alcance de todos tus proyectos
es indicar cómo y en qué términos se deben usar. Para esto están las licencias, que son
archivos legales que especifican qué se puede y qué no se puede hacer con los archivos
asociados.
GitHub nos ofrece un enlace donde nos intenta orientar sobre qué licencia elegir en cada
caso: choosealicense.com.
2. Se añaden para su control con git add -A (añade todos los archivos modificados) o
con git add nombre-de-archivo (añade solo el archivo especificado)
Hasta aquí todo normal. Ahora llega el momento de subir el commit (o los commits, si
hemos hecho varios) con nuestros cambios al repositorio remoto con
git push origin master , pero pueden pasar varias cosas:
1. Git comprueba si en el repositorio remoto hay una versión posterior (más nueva) a la que
se encuentra en nuestro repositorio local.
2. Si encuentra cambios posteriores, los baja e intenta mezclarlos con los de nuestros
commits.
1. Los cambios que se han bajado del repositorio remoto (realizados por mis compañeras)
y los míos se pueden mezclar (o mergear) automáticamente, Git crea un commit
automático con esta mezcla (o merge) y nos lo muestra usando el editor por defecto que
tenemos configurado en nuestra terminal (NANO, vim...).
2. Otra posibilidad es que Git no pueda mezclar los cambios automáticamente. Entonces
nos avisa de que hay conflictos que tendremos que resolver nosotras manualmente. Nos
mostrará una lista de archivos donde encuentran los conflictos.
NOTA: En el primer caso podremos cambiar el mensaje del commit automático o poner
uno nuevo. Guardamos aceptando el nombre que nos propone, salimos, y hacemos un
push (se subirá el commit con nuestros cambios y el commit con el merge o mezcla).
Un conflicto ocurre cuando git se encuentra con dos versiones del mismo bloque de código.
Entonces, marca en el documento que hay un conflicto y muestra las dos opciones para
que nosotros elijamos qué hacer:
1 <<<<<<<
2 1ª versión del código en conflicto
3 =======
4 2ª versión del código en conflicto
5 >>>>>>>
Aquí puede pasar que queramos la primera opción, la segunda, las dos, o una mezcla de
las dos.
La manera de afrontar este conflicto es elegir lo que queremos que ponga en ese bloque,
quitar los separadores que añade Git, guardar el archivo y hacer add, commit y push con
normalidad.
Los conflictos más pequeños los resolveremos sobre la marcha, en los más complicados
tendremos que hablar con la compañera que haya hecho los cambios para decidir qué
hacer.
Ramas
al repositorio remoto.
Git nos permite crear versiones paralelas de nuestro proyecto para poder desarrollar o
probar varias funcionalidades a la vez sin miedo a perder lo hecho hasta ahora:
Trabajo SIN ramas - Trabajo CON ramas
Cuando iniciamos un repositorio git se crea una primera rama, y se llama master por
convención. En la última sesión trabajamos en esa rama.
Vamos a ver el trabajo en ramas a través de un ejemplo, como un mini proyecto de grupo,
porque al fin y al cabo, git va de trabajar en grupo.
EJERCICIO 1
1. Vamos crear un repositorio por pareja, donde ambas deben tener acceso al repositorio
(la que lo crea debe dar acceso al usuario de GitHub de la otra).
2. Crearemos una primera versión de nuestra web (solo en HTML) que tendrá:
1. Un <header> con un <h1> con el nombre del grupo
2. Un <main> con dos secciones:
1. <section class="motivacion"></section>
2. <section class="contenido"></section>
3. Un <footer> con un <p> con el texto: "Maquetado en grupo en Academia Geek"
3. Lo subiremos a GitHub
1 <!DOCTYPE html>
2 <html lang="en">
3 <head>
4 <meta charset="UTF-8">
5 <title>Grupo nombre-de-grupo</title>
6 </head>
7 <body>
8 <header>
9 <h1>Grupo nombre-de-grupo</h1>
10 </header>
11 <main>
12 <section class="motivacion"></section>
13 <section class="contenido"></section>
14 </main>
15 <footer>
16 <p>Maquetado en grupo en Academia GeeK</p>
17 </footer>
18 </body>
19 </html>
Creando ramas
Para crear ramas escribimos git branch nombre-de-la-rama y nos movemos a ella con
git checkout nombre-de-la-rama .
NOTA: Para poder movernos entre ramas debemos tener todos los archivos modificados,
al menos, añadidos a un futuro commit. Si modifico un archivo e intento cambiar de
rama no me dejará.
Añadir archivos y crear un commit funciona igual pero cuando queramos hacer un push
usaremos:
git push origin nombre-de-la-rama
EJERCICIO 2
1. Una de la pareja creará una rama footer , nos movemos a ella y modificamos un
poco nuestro proyecto. Añadiremos a nuestro footer el enlace a la web de Adalab,
quedando así:
1 <footer>
2 <p>Maquetado en grupo en <a href="http://adalab.es">Adalab</a></p>
3 </footer>
Fusionar ramas
Una vez que hemos terminado el trabajo en nuestra nueva rama y lo hemos subido al
servidor remoto querremos aplicar estos cambios en nuestra rama principal, master .
Para ello nos vamos a la rama destino (en este caso master ) con git checkout master ,
y escribiremos:
Esto nos mezclará nuestra versión local de la rama nombre-de-la-rama con la rama
donde estemos, en este caso, master . Si todo va bien nos mezclará las ramas, creará un
commit automático y si hacemos un git status nos dirá que solo queda hacer un
git push origin master y ya.
EJERCICIO 3
Vamos a fusionar nuestra rama footer con master para que nuestra web tenga el
enlace que hemos añadido anteriormente. Para ello:
1 <footer>
2 <p>Maquetado en grupo en <a href="http://makaria.org">Makaia</a></p>
3 </footer>
EJERCICIO 4
Ahora que hemos hecho un primer acercamiento a las ramas, vamos a hacer lo mismo
pero cada miembro de la pareja por separado. Cada una estará encargada de un trabajo
diferente que tendrá que realizar en una rama y posteriormente mezclar en la rama
principal.
Como refleja la imagen vamos a hacer dos ampliaciones de contenido: 1. una alumna de
cada pareja tiene que añadir el contenido de la sección con una frase motivadora 2. la otra
alumna de la pareja tiene que añadir el contenido de la sección con un título y un pequeño
párrafo
1 <section class="motivacion">
2 <h2>Frase súper motivadora, ¡Si podemos!</h2>
3 </section>
1 <section class="contenido">
2 <h2>Contenido normal</h2>
3 <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do ei
4 </section>
NOTA: Debe elegir bien el nombre de las nuevas ramas ;)
Ahora realmente da igual el orden, la que acabe su trabajo, que suba su rama al repositorio
remoto, y siga los pasos para fusionarlo con la rama master.
git add y 'commiteamos' (creamos nueva versión) con git commit . Siempre es buena
Y pusheamos (subimos los commits) con git push cuando terminemos la tarea que nos
toca.
¿Qué pasa si hago un cambio, lo añado, hago commit y luego... querría no haberlo hecho?
Pues no pasa nada, para eso trabajamos con un control de versiones.
Esto pasará de vez en cuando, unas veces por inexperiencia, otras por descuido y otras por
otras razones, pero no hay miedo porque cada commit queda registrado y siempre
podemos volver a consultar uno anterior o revertir el último. Vamos a ver cómo.
Si queremos ver nuestra actividad en el proyecto usaremos git log , esto nos mostrará
un listado de los commits realizados.
Ejemplo de Git Log
En este caso, con el último commit, hemos borrado el archivo readme.md y ahora vemos
que ha sido un error...
Si ahora hacemos un git log podemos ver cómo queda el historial de commits:
Git REVERT PASO TRES
Issues
Github, como otros servicios de control de versiones tienen un sistema de tickets, los
issues. Te permiten crear pequeñas tareas donde solicitas información, avisar de un
problema o de alguna mejora. Además, nos permiten asignar responsables, clasificarlas
por etiquetas...
EJERCICIO 5
EJERCICIO 6
Clonar repositorio
EJERCICIO 7
Eliminar un repositorio
No es tan habitual pero de tanto en tanto querremos hacer limpieza en nuestra cuenta de
GitHub. ¿Seremos capaces de borrar el repositorio que acabamos de crear? ¿Sí, no? :)
EJERCICIO 8.1
Ahora vamos a trabajar de una manera menos habitual y un poco más complicada, pero a
veces pasa: crearemos un proyecto en nuestro equipo, algo sencillito. Podemos elegir entre:
Y ahora, ¿no sería genial conectarlo con un repositorio remoto y tenerlo siempre accesible
en Github? Claro que sí.
1. En Github creamos un repo vacío SIN añadir licencia ni README.me (¿Por qué?).
2. Seguimos las instrucciones para conectarlo.
3. Hacemos push de los cambios hechos.
4. Añadimos a nuestra compañera como colaboradora y ella se clonará el repositorio.
EJERCICIO 8.2
Solucionar un conflicto
Una vez que tenemos las dos el repositorio en nuestro equipo vamos a modificar
index.html a la vez. Cada miembro del equipo hará un cambio, su commit y lo subirá. El
conflicto lo resuelven entre las dos :)
Code trae por defecto un paquete para integración con Git y GitHub que nos ayuda con las
tareas de control de versiones de nuestro día a día.
También en el panel principal, el editor del fichero que estamos editando, aparece a la
izquierda del número de línea una franja de color:
Este paquete también facilita una herramienta gráfica para resolver conflictos, que ayuda a
elegir la versión del código que nos interesa mantener.
Además nos permite ver qué se ha modificado en nuestro proyecto solo haciendo click en
el icono lateral