Control de Versiones
Introducción
Hasta ahora hemos hecho una primera aproximación a Git.
Primero vimos cómo crear un repositorio local con
git init
y mantener nuestros cambios congit add -A
ygit commit -m "Mensaje del commit"
.Pero no solo eso, tambiƩn hemos aprendido a conectar nuestro proyecto local con un repositorio remoto alojado en GitHub con
git remote add
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.
Inicio de un repositorio desde Github
Lo mƔs sencillo es crear el proyecto de cero desde nuestro servicio de Git, en este caso, GitHub:
1. Vamos a nuestro perfil
2. Creamos un nuevo repositorio
3. Rellenamos el nombre y la descripción
4. Ahora podemos elegir tres acciones (se pueden elegir las tres, alguna o ninguna):
AƱadir un archivo
README.md
AƱadir un archivo
.gitignore
AƱadir una licencia
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
Inicio de repositorio desde un proyecto existente
ĀæCómo? ĀæQue ya tenĆamos un proyecto local y queremos subirlo a GitHub? Bueno, tampoco es tan malo:
IMPORTANTE: Antes de inicializar un repositorio debemos estar en la carpeta correcta. Desde la terminal, con
cd
, nos desplazamos dentro de la carpeta de nuestro proyecto.Inicializamos el repositorio local Git con
git init
(se hace desde la terminal y tenemos que asegurarnos de estar en la carpeta correcta).Vamos a Github.com y creamos un repositorio nuevo (esta vez no aƱadiremos ni licencia, ni
README.md
, ni.gitignore
) y GitHub nos redirigirƔ a una pƔgina con las instrucciones a seguirComo ya hemos inicializado nuestro proyecto Git simplemente aƱadiremos el repositorio remoto. Usaremos
git remote add origin url-del-repositorio-que-me-da-github
.Creamos cómodamente el
README.md
desde nuestro editor de código.Añadimos los archivos con
git add -A
Hacemos un primer commit
git commit -m "Initial commit"
Y subimos, esta primera vez, con
git push -u origin master
ā
README.md
NOTA: Markdown es un lenguaje de marcado como HTML pero mƔs simple.
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.
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.
Compartir código con mi equipo
Otras de las bondades de Git es que hace que trabajar en grupo sea seguro y mÔs fÔcil. Nos evita por ejemplo: tener que compartir archivos a través del email, perder código cuando una compañera lo sobreescribe por error...
Desde la pƔgina de nuestro repositorio accedemos a settings
y desde allĆ a Collaborators & teams
donde podremos aƱadir a nuestras colaboradoras favoritas, o a las que nos toquen ;)
ā
Modificar archivos en local y subir a remoto los cambios
Ya lo hemos ido viendo lo siguiente:
1. Se modifican archivos y se guardan los cambios en el editor.
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)
3. Creamos el commit con git commit -m "Short description of the commit"
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:
Que se suba bien, sin problemas ni conflictos.
Que no podamos subir nuestros cambios porque no estemos trabajando con la última versión. En este caso tendremos que hacer
git pull
para actualizar nuestro repositorio local con la última versión que se encuentra en remoto, es decir, nos traeremos los últimos cambios hechos por otras personas a nuestro ordenador.
NOTA: Antes de comenzar a trabajar (antes de empezar a hacer cambios en nuestros archivos) es una buena prƔctica hacer
git pull
y actualizar nuestro repositorio local con los cambios que otras personas han subido al repositorio remoto. Aun asĆ, ocurrirĆ” que tras hacer nuestros cambios y commitearlos, al intentar hacergit push
el terminal nos indique que tenemos que hacergit pull
primero, esto ocurre por que alguna compaƱera ha subido cambios mientras nosotras trabajamos.
¿Qué pasa cuando hacemos un git pull
?
git pull
?Pasan 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.
Y aquĆ tenemos dos escenarios diferentes:
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).
¿Qué apariencia tiene un conflicto?
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:
<<<<<<<: Indica el inicio de la zona de conflicto, en la lĆnea siguiente muestra el primer bloque en conflicto. =======: Separa las dos versiones, seguidamente muestra el bloque alternativo que estĆ” dando conflicto. >>>>>>>: Indica el final e la zona de conflicto
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
Cuando subimos los commits habĆamos visto que escribimos $ git push origin master
, lo que estamos diciendo es que suba muestra rama master al repositorio remoto.
¿Qué es una rama?
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:
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
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).
Crearemos una primera versión de nuestra web (solo en HTML) que tendrÔ:
Un
<header>
con un<h1>
con el nombre del grupoUn
<main>
con dos secciones:<section class="motivacion"></section>
<section class="contenido"></section>
Un
<footer>
con un<p>
con el texto: "Maquetado en grupo en Academia Geek"
Lo subiremos a GitHub
Nos tiene que quedar algo asĆ:
Creando ramas
Para crear ramas escribimos git branch nombre-de-la-rama
y nos movemos a ella con git checkout nombre-de-la-rama
.
Tenemos un atajo para crear la rama y cambiarnos a ella directamente
En cualquier caso, si queremos movernos de una rama a otra usaremos git checkout nombre-de-la-rama
, de esta manera podemos movernos a nuestra nueva rama o volver a master
en cualquier momento.
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:
La primera vez usaremos el git push con -u
:
EJERCICIO 2
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 Academia Geek quedando asĆ:
Como siempre, aƱadimos, commiteamos y hacemos push, esta vez usando
git push -u origin footer
.Si ahora cambiamos a la rama
master
veremos que permanece como la dejamos y que el cambio del enlace solo estĆ” hecho en nuestra ramafooter
.
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.
NOTA: Es importante haber hecho un
git pull origin nombre-de-la-rama
en la rama que vamos a fusionar, en este casonombre-de-la-rama
antes de empezar el proceso de fusión para asegurarnos de que tenemos la última versión en ambas ramas.
EJERCICIO 3
Vamos a fusionar nuestra rama footer
con master
para que nuestra web tenga el enlace que hemos aƱadido anteriormente. Para ello:
Nos movemos a la rama
footer
Comprobamos que estÔ correcto y tenemos la última versión
Nos movemos a la rama
master
(sĆ, es super buena idea asegurarnos de que tambiĆ©n tenemos la Ćŗltima versión)Hacemos un merge de la rama
footer
Resolvemos los conflictos si los hay
Comprobamos que los cambios estĆ” hechos
Y subimos al repositorio remoto
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
Sección con frase motivadora
Sección con frase y tĆtulo
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.
Entonces, ¿cómo se supone que tengo que trabajar con Git?
Lo normal es que antes de empezar a trabajar comprobemos si tenemos la última versión. También puede no hacerse y seguir trabajando en lo que se estuviese trabajando. En cualquier caso, podemos comprobar si hay una versión nueva del proyecto con git fetch
o comprobar y descargar una versión nueva con git pull
.
Luego seguimos trabajando con normalidad, recordando guardar frecuentemente con Ctrl+S
. y cuando creamos conveniente 'stageamos' (aƱadimos los cambios) con git add
y 'commiteamos' (creamos nueva versión) con git commit
. Siempre es buena idea hacer commit tras pequeƱas tareas o cambios.
Y pusheamos (subimos los commits) con git push
cuando terminemos la tarea que nos toca.
Ā”Oh, oh! ””He hecho un commit que no querĆa hacer!!
Āæ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.
En este caso, con el Ćŗltimo commit, hemos borrado el archivo readme.md
y ahora vemos que ha sido un error...
Nos gustarĆa deshacer el commit con el nĆŗmero (o hash): e139ca3e275be608eed457ab08395e6347e804bf
, para ello usamos git revert
:
y si aceptamos el revert, ya lo tenemos:
Si ahora hacemos un git log
podemos ver cómo queda el historial de commits:
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
Crear repositorio en GitHub
Hay que crear un repositorio vacĆo en GitHub:
¿Qué licencia hemos elegido?
¿Por qué es importante añadir un README.md?
EJERCICIO 6
Clonar repositorio
Clonamos el repositorio de nuestra compaƱera y le pondremos o abriremos un issue a travƩs de la web de GitHub para que nos aƱada como colaboradora con permisos de escritura.
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
Crear un repositorio local y conectarlo con remoto
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:
Un html bƔsico con un "hola, mundo" centrado en la ventana del navegador
Un html bƔsico con una sonrisa centrada en la ventana -> :) o :D
Una vez conseguido vamos a:
1. Inicializar un repositorio local git init
2. Hacer algĆŗn cambio y un commit.
Y ahora, Āæno serĆa genial conectarlo con un repositorio remoto y tenerlo siempre accesible en Github? Claro que sĆ.
En Github creamos un repo vacĆo SIN aƱadir licencia ni README.me (ĀæPor quĆ©?).
Seguimos las instrucciones para conectarlo.
Hacemos push de los cambios hechos.
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 :)
BONUS: Paquete de Code para Git
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.
En el explorador (menĆŗ de la izquierda), aparecen:
de color verde los ficheros nuevos respecto al Ćŗltimo commit local
de color amarillo los ficheros modificados desde el Ćŗltimo commit local
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:
amarillo para las lĆneas modificadas desde el Ćŗltimo commit
verde las lĆneas nuevas desde el Ćŗltimo commit
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
ā
Recursos externos
Last updated
Was this helpful?