Prácticas Guiadas Con Git y Github
Prácticas Guiadas Con Git y Github
Prácticas Guiadas Con Git y Github
git y github
2
Práctica 1: Nuestro primer repositorio
3
Lo primero que tenemos que hacer es enviar el fichero al staging area, para ello usaremos
git add. Si volvemos a ejecutar git status, veremos que ya está preparado para enviarlo a
nuestro repositorio local mediante un commit:
git commit -m “Primer commit”
Al hacer git status, veremos que el staging area está vacía y no hay ningún commit
pendiente.
4
Práctica 2. Trabajamos en local
Si quiero añadir todos los ficheros a la staging area, puedo usar la opción git -a .
5
Vamos a modificar, esos dos ficheros. Siguiendo los pasos anteriores deberíamos hacer:
git -a .
git commit -m “mensaje”
Pero estas instrucciones se pueden abreviar utilizando:
6
Descartar cambios en el repositorio
Cómo podemos sacar un archivo del staging area y descartar sus cambios en el directorio
de trabajo. Nos valdremos de los comandos:
git reset HEAD <nombre del fichero> //para sacar del staging
area
git checkout -- <nombre del fichero> // para descartar cambios
en el directorio de trabajo.
7
Eliminar ficheros del repositorio
Imaginemos que uno de los archivos que ya están en el repositorio de git tras un commit no
lo queremos allí. Podemos usar el comando rm de remove y el nombre del archivo:
git rm index.html
Si nos damos cuenta que nos hemos equivocado antes de hacer el commit podemos
revertirlo:
8
Si en algún momento quieres repasar los ficheros modificados en cada commit puedes
hacerlo con la opción -p:
9
Práctica 4: El fichero .gitignore
Git tiene una herramienta imprescindible casi en cualquier proyecto, el archivo "gitignore",
que sirve para decirle a Git qué archivos o directorios completos debe ignorar y no subir al
repositorio de código.
Únicamente se necesita crear un archivo especificando qué elementos se deben ignorar y, a
partir de entonces, realizar el resto del proceso para trabajar con Git de manera habitual.
Existe una herramienta online que se llama gitignore.io. Básicamente permite escribir en
un campo de búsqueda los nombres de todas las herramientas, sistemas, frameworks,
lenguajes, etc. que puedas estar usando. Seleccionas todos los valores y luego generas el
archivo de manera automática.
Vamos a crear un archivo .gitignore que ignore los ficheros *.log y los contenidos de una
carpeta en concreto.
Ahora podemos hacer pruebas para comprobar que cada de lo que añadamos a la
carpeta_ignorar, ni ningún fichero *.log se tendrán en cuenta en un commit.
10
Práctica 5: Cargando versiones antiguas
git reset --soft HEAD~1 → No perdemos los cambios de los commits posteriores.
11
Si hemos subido el commit a nuestro repositorio remoto
Checkout
git checkout te permite ante situaciones donde hayas modificado cosas en el área de
trabajo, pero aún no las hayas pasado al área de preparación (con git add), volver a la
versión exacta del repositorio de dicho archivo, es decir, deshacer los cambios realizados.
Para ello, simplemente tienes que hacer lo siguiente:
git checkout NOMBRE_DEL_ARCHIVO
Si quieres hacer esto mismo pero para todos los archivos, utilizarás:
git checkout -- .
Si además de modificaciones, has hecho inserciones tienes que ejecutar el siguiente
comando:
git clean -df
12
Vamos a recuperar la versión de nuestro proyecto en el primer commit que hicimos. Si
hacemos git log obtenemos lo siguiente:
13
Por lo tanto f6b36a7 es el identificador de mi primer commit. Utilizando:
git checkout f6b36a7 , has solicitado cargar en tu directorio de trabajo esta
instantánea del proyecto. Pero puedes volver en cualquier momento al punto en el que te
encontrabas haciendo git checkout master.
14
Práctica 6. Conectándome a un repositorio
remoto.
Primero vamos a crear el repositorio remoto, en nuestro caso en github, con el mismo
nombre que el repositorio local.
15
Clonar tu repositorio remoto en local
16
Si nos fijamos tanto en el estado del repositorio local, como remoto, vemos que no
coinciden:
17
Git fetch + git merge
Si utilizamos git fetch, tan sólo recuperaremos la información del repositorio remoto y la
ubicará en una rama oculta del repositorio local (FETCH_HEAD), pero no hará el ‘merge’.
Así que tendremos que hacerlo manualmente si queremos que ambos repositorios estén
sincronizados.
Para fusionar la rama oculta con la rama local necesitamos hacer un git merge:
18
Git pull
El comando git pull es un atajo para evitar realizar las dos acciones anteriores en un solo
paso. Cuando hacemos git pull, estamos bajando todos los cambios en el remoto en la rama
que estamos trabajando.
Vamos a hacer una prueba de cómo revertir los cambios que hemos hecho hasta ahora
tanto el remoto como en local:
19
Y mediante pull vamos a actualizar nuestro repositorio local:
20
Práctica 8: Actualización del repositorio
remoto
Actualización simple
21
Actualización del repositorio remoto no actualizado en
local
Supongamos que alguien más está colaborando con nosotros en el proyecto y que ha
hecho modificaciones en el repositorio, que aún nosotros no tenemos en nuestro local.
Realmente, a no ser que estemos utilizando un entorno visual con git, a simple vista, no
sabremos si eso se ha producido. Veamos qué ocurre si intentamos actualizar el remoto,
cuando no tenemos la última versión del mismo.
22
2º Modificamos el repositorio en local ficheros distintos.
Esto ocurre porque no tenemos el repositorio actual actualizado, por lo tanto debemos hacer
un pull o fetch antes de actualizar el remoto.
23
Veamos ahora que los dos últimos commits están tanto en local como en remoto:
24
Actualización del repositorio remoto con conflictos
Pongámonos en la situación de que un colaborador de nuestro repositorio ha modificado el
fichero index.html y ha subido su versión al repositorio remoto. Posteriormente nosotros
tenemos que modificar ese mismo fichero y subirlo también al repositorio. Al subirlo, nos
dará un conflicto en el merge final que tendremos que resolver.
Veamos los pasos que tenemos que seguir para reproducir esta situación:
1º. Modificamos el fichero index.html en el repositorio remoto.
25
2º Modificamos el mismo fichero en local
Veamos que si queremos hacer un push de nuestra rama en local, nos dirá que no estamos
actualizados, ya que hay modificaciones pendientes de bajar.
El pull ha funcionado, pero no del todo, ya tenemos conflictos pendientes de resolver antes
de nos deje hacer el merge:
26
Ahora tenemos que resolver los conflictos y hacer un commit, para así poder hacer el push
al remoto.
Pero ¿cómo sabemos dónde está el conflicto? Pues git lo marca de la siguiente manera:
Lo que me quiere decir que yo en mi HEAD tengo una versión y la que viene pull tiene otra
versión y me las marca. Ahora tengo que quedarme con la versión que me interesa o una
mezcla de las dos, que es el caso.
Por lo tanto, editamos el fichero hasta que quede de la siguiente manera:
27
Ya podemos hacer el commit y el push de nuestros cambios al remoto:
28
Práctica 9 Ramificaciones en git
Una rama (branch) es una bifurcación en la línea de tiempo del proyecto que nos permite
crear una copia paralela para desarrollar cambios sin afectar la versión estable (por defecto
la rama master).
Supongamos que nos mandan una tarea nueva y es hacer la página aboutus.html de
nuestra página web y para ello queremos partir de la última versión de “master”. Una vez
creada la rama, haremos las modificaciones necesarias y una vez que comprobamos que
hace lo que nosotros queramos, subiremos las modificaciones a la rama master.
Como vemos, la rama donde nos encontramos, es la rama marcada con un *. Vamos ahora
a hacer un checkout para posicionarnos en la rama recién creada.
29
Confirmamos los cambios:
Necesitamos por lo tanto fusionar nuestro contenido con master. Para ello, sobre la rama
master, hacemos un git merge con nuestra rama.
30
Paso 4: Enviamos cambios al repositorio remoto
31
Vamos ahora a subir la rama al remoto:
git push -u origin <nombre rama>
32
La manera de proceder para ir actualizando la rama es, modificar y confirmar los cambios
en local y subirlos al origin. Una vez que demos por finalizada la tarea, procederemos igual
que en la práctica 9, fusionando nuestra rama con master y subiéndolo al repositorio.
Cuando hablemos de workflow en git, veremos que se producen eliminación de ramas (
en local: git branch -d rama_a_borrar y en remoto:git push origin
--delete rama_a_borrar) , pero lo veremos en entorno gráfico.
33
Y vamos a hacer alguna modificación y la vamos a confirmar:
Si listamos las ramas que tenemos en local, vemos que no tenemos la rama que acabamos
de crear en remoto:
34
Si observamos sólo la tenemos como remota, no hay ninguna rama local con ese nombre,
pero al hacer checkout sobre ella, ya si se nos crea una rama local con ese nombre:
35