Tutorial Git Print Version
Tutorial Git Print Version
18 de mayo de 2021
Índice
Introducción 2
1. Primeros pasos 3
1.1. Creación de una cuenta de GitHub . . . . . . . . . . . . . . . 3
1.2. Instalación de Git . . . . . . . . . . . . . . . . . . . . . . . . 3
2. Iniciación a Git 4
2.1. Crea tu primer repositorio . . . . . . . . . . . . . . . . . . . . 4
2.2. Crear repositorio en GitHub . . . . . . . . . . . . . . . . . . . 6
2.3. Añadir y sincronizar repositorio remoto . . . . . . . . . . . . 10
2.4. Control de cambios y versionado . . . . . . . . . . . . . . . . 13
2.5. Restaurar versiones previas . . . . . . . . . . . . . . . . . . . 17
2.6. Ramificaciones del código . . . . . . . . . . . . . . . . . . . . 18
2.7. Actualizar el repositorio local y remoto . . . . . . . . . . . . . 21
1
Introducción
Este tutorial tiene como objetivo la familiarización con el entorno Git
y la plataforma GitHub. Está diseñado para seguir paso a paso, para su
aprovechamiento óptimo a continuación se detalla la guı́a de estilos.
Las explicaciones y desarrollo del tutorial se muestran en texto normal
como éste.
2
1. Primeros pasos
1.1. Creación de una cuenta de GitHub
GitHub es una plataforma online de repositorios Git que actualmente
forma parte de la matriz de Microsoft. Para bien o para mal1 , GitHub es
probablemente la plataforma más utilizada para compartir y trabajar online
con código abierto, por lo que en este curso nos centraremos en esta plata-
forma. No obstante, hay otras plataformas alternativas para almacenar tus
códigos en la nube como pueden ser GitLab, BitBucket, e incluso tú o tu
compañı́a/departamento puede tener tu propia plataforma Git para la ges-
tión de software y código. Un último comentario antes de ponernos en faena
es que para trabajar con Git no es necesario utilizar GitHub, sin embargo
para trabajar con GitHub sı́ necesitas usar Git.
En tu explorador web favorito teclea github.com y regı́strate introdu-
ciendo tus datos. GitHub ofrece cuentas gratuitas con un número limitado
de respositorios públicos y/o privados por lo que en princpio es más que
suficiente para las tareas diarias que necesitarás para este tutorial y tam-
bién para el futuro. Es importante que elijas un nombre de usuario fácil
de memorizar y de identificar por otros, ya que tu espacio GitHub será
https://github.com/<nombre_de_usuario>2
Ahora sólo un par de pasos para la configuración básica de Git en tu PC. Con
el fin de que todos los cambios y versiones que realices queden registrados a
tu nombre teclea estos dos comandos:
1
Bill Gates se está metiendo dentro de tı́ no sólo a través de las vacunas
2
Gonzalo, a no ser que busques trabajar para el Clan los Gil mejor evita la tentación
de ponerte como usuario oleoleolecholosimeone
3
git config --global user.name <nombre_de_usuario>
git config --global user.email <email>
Windows Notepad
git config core.editor notepad
Mac BBEdit
git config core.editor ’bbedit -w’
Linux Gedit
git config --global core.editor ’gedit --wait --new-window’
2. Iniciación a Git
2.1. Crea tu primer repositorio
1. Abre un terminal y navega a la carpeta donde quieras crear el repo-
sitorio5 . Para este ejercicio recomiendo usar una carpeta vacı́a pero
en el futuro puedes usar una carpeta donde tengas algún código ya
existente.
3
Si no pones “--global” las configuraciones que hagas se aplican sólo al repositorio en
el que te encuentres
4
Por si acaso te estabas haciendo ilusiones “Office Word” no es un editor de texto por
lo que no puedes usarlo
5
usa “cd” para ir cambiando de carpetas
4
3. Si te fijas de nuevo en tu carpeta de trabajo, Git ha creado una sub-
carpeta llamada “.git” con todos los archivos que requiere el sistema.
Si no la ves no entres en pánico, por defecto esta carpeta está oculta6
$ ls - lha
total 40 K
drwxrwxr - x 7 hector hector 4 ,0 K may 7 11:01 .
drwxrwxr - x 3 hector hector 4 ,0 K may 7 11:01 ..
drwxrwxr - x 2 hector hector 4 ,0 K may 7 11:01 branches
-rw - rw -r - - 1 hector hector 92 may 7 11:01 config
-rw - rw -r - - 1 hector hector 73 may 7 11:01 description
-rw - rw -r - - 1 hector hector 23 may 7 11:01 HEAD
drwxrwxr - x 2 hector hector 4 ,0 K may 7 11:01 hooks
drwxrwxr - x 2 hector hector 4 ,0 K may 7 11:01 info
drwxrwxr - x 4 hector hector 4 ,0 K may 7 11:01 objects
drwxrwxr - x 4 hector hector 4 ,0 K may 7 11:01 refs
No commits yet
Untracked files :
( use " git add < file >... " to include in what will be committed )
archivo_1 . txt
nothing added to commit but untracked files present ( use " git add
" to track )
5
y vueve a teclear git status , ahora aparecerı́a un mensaje similar
a este:
On branch master
No commits yet
Changes to be committed :
( use " git rm -- cached < file >... " to unstage )
new file : archivo_1 . txt
6
3. Para este primer caso vamos a crear un repositorio donde vamos a subir
nuestro ejercicio. Ası́ que lo nombraremos como primeros_pasos .
4. La descripción suele ser una lı́nea o dos de texto libre que resuma
tu repositorio/software. Algo ası́ como “Voy a disfrutar tanto de este
curso que he decidido subirlo a GitHub”, o este otro “La UAH necesita
una prueba de que he realizado el curso satisfactoriamente por lo que
7
colgaré mis tareas en GitHub como evidencia”
6. Deja sin marcar las opciones Add a README file , Add gitignore
y Choose a license , ya que en la siguiente tarea vamos a importar
nuestro repositorio local ya existente.
8. Antes de terminar con esta parte, una cosa importante de los reposito-
rios privados es controlar quién puede acceder a ellos. Vais a añadirme
como colaborador de este repositorio que acabáis de crear, para ello
pinchad en Settings y depués en la barra izquierda en la segun-
da opción Manage Access . Os aparecerá esta pantalla, tras lo cual
pincháis en el botón verde de Invite a collaborator
9
Actualmente el plan gratuito de GitHub admite crear repositorios tanto públicos como
privados ilimitados
8
En el recuadro tenéis que buscarme por usuario hectornieto , en
caso de duda u os salgan otros usuarios similares, mi usuario tiene
mi foto, o alguien parecido a mı́ con gafas de sol con el Golden Gate
Bridge de fondo. De este modo sólo tu y yo podremos ver tu repo-
sitorio en GitHub, y podré ademas sugerirte cambios a través de un
Pull Request .
En cualquier caso, te recomiendo que generes otro repositorio desde
GitHub y en este caso marques estas tres casillas para que experimentes
lo que hace GitHub:
Marcar la opción de Add a README file creará en el la carpeta raı́z
del repositorio un archivo vacı́o README.md. Éste es un archivo AS-
CII de texto que GitHub lee y lo incorpora como descripción completa
del repositorio. El archivo README.md (y por defecto la extensión
md) se basa en la edición en Markdown, una serie de etiquetas muy
sencillas que permite darle formato al texto (secciones, hipervı́ncu-
los, viñetas, ...). Para más información de por qué es útil el READ-
ME.md y qué información incluir pincha aquı́. Para saber más so-
bre escritura en Markdown ve a https://www.markdownguide.org/
getting-started/. Si quieres ver un ejemplo de un README.md
puedes ir a alguno de mis repositorios públicos, p.ej este de pyTSEB.
Marcar la opción de Add gitignore te permite elegir una de las plan-
tillas, que te aparecerá en el menú desplegable, según el lenguaje de
programación habitual que utilices. .gitignore es un archivo (ocul-
to) que puede estar en la carpeta raı́z de cada repositorio Git y que
dice a Git qué archivos, dentro de las carpetas y subcarpetas del repo-
sitorio, va a ignorar a la hora de detectar los cambios. Este archivo es
muy útil en la mayorı́a de los casos ya que la mayorı́a de los lenguajes
de programación generan (bien al compilarse o a ejecutarse) un gran
número de archivos (por ejemplo .pyc en Python o .o en C) que no
son parte del código fuente y por lo tanto no merece la pena realizar
un seguimiento sobre ellos.
Para finalizar, Choose a license añadirá también automáticamente
un arhivo con el texto de la licencia y un mensaje en la página principal
destacando la licencia bajo la que está el repositorio. En el futuro para
tus repositorios, sobre todo los públicos, es recomendable elegir cuida-
dosamente la licencia. En este caso este curso (todo el tutorial y los
ejemplos) los he generado bajo la licencia Creative Commons Zero
por lo que tienes libertad total para usarlo y distribuirlo para lo que
te plazca.
Finalmente si pinchas ahora en el botón verde Create repository
en muy poco tiempo te aparecerı́a la ventana un repositorio GitHub,
9
pero ya con contenido y un primer commit, con los tres archivos men-
cionados anteriormente:
10
que la versión en la nube es el origen de todas, ya que es la única
accesible a todos los usuarios o colaboradores, pero también se suele
usar como nombre remote o upstream . <usuario> es tu usuario
github y por último <repositorio> es el nombre del repositorio que
le dimos en GitHub ( primeros_pasos )
11
¯
10
git push sube los cambios realizados en local al remoto, mientras que git pull se podrı́a
decir que hace el camino inverso
12
remote : Compressing objects : 100 % (3/3) , done .
remote : Total 3 ( delta 0) , reused 0 ( delta 0) , pack - reused 0
Unpacking objects : 100 % (3/3) , 752 bytes | 752.00 KiB /s , done .
From https :// github . com / hectornieto / pri meros_p asos
* branch master -> FETCH_HEAD
9 a9ea98 .. bb74ee6 master -> origin / master
Updating 9 a9ea98 .. bb74ee6
Fast - forward
README . md | 2 ++
1 file changed , 2 insertions (+)
create mode 100644 README . md
2. De nuevo para ver qué está pasando y cómo lo interpreta Git teclea
git status
On branch master
Changes not staged for commit :
( use " git add < file >... " to update what will be committed )
( use " git restore < file >... " to discard changes in working
directory )
modified : archivo_1 . txt
no changes added to commit ( use " git add " and / or " git commit -a " )
13
diff -- git a / archivo_1 . txt b / archivo_1 . txt
index 7 aa40b1 .. b3c9105 100644
--- a / a r c h i v o _ 1 . txt
+++ b / a r c h i v o _ 1 . txt
@@ -1 +1 @@
- mi primera linea de codigo
+ mi primera linea de codigo corregida
donde las partes en rojo indican lı́neas que han sido eliminadas y las
partes en verde muestran lı́neas que han sido añadidas.
Untracked files :
( use " git add < file >... " to include in what will be committed )
archivo_2 . txt
no changes added to commit ( use " git add " and / or " git commit -a " )
14
verás que Git te está diciendo que hay cambios listos para ser regis-
trados con un nuevo commit. Estos cambios se resumen en que hay un
archivo existente que ha sido modificado y un nuevo archivo añadido.
7. Llegados a este punto, nos hemos dado cuenta que en realidad el segun-
do archivo que hemos creado no funciona correctamente, o simplemen-
te no lo queremos incluir en esta nueva versión. Podemos descartar su
inclusión antes de hacer el commit tecleando git restore --staged archivo_2.txt
o también tecleando git reset archivo_2.txt . Vuelve a teclear
git status para ver de nuevo el estado actual:
On branch master
Changes to be committed :
( use " git restore -- staged < file >... " to unstage )
modified : archivo_1 . txt
Untracked files :
( use " git add < file >... " to include in what will be committed )
archivo_2 . txt
9. Ahora sı́, hemos visto que el segundo archivo o módulo funciona como
queremos y queremos añadirlo al proyecto. Por lo tanto lo añadimos
para el siguiente commit y lo registramos:
10. Asegúrate que no tienes ningua tarea pendiente mediante git status .
Si todo va sobre ruedas el entorno de trabajo deberı́a estar limpio:
On branch master
nothing to commit , working tree clean
commit f 0 c f 4 7 9 7 e d 3 3 1 e e 1 6 d 2 a c 5 e f e 2 3 a 4 1 f 2 5 0 4 3 6 f 0 f
15
Author : hectornieto < hector . nieto . solana@gmail . com >
Date : Sun May 9 11:50:28 2021 +0200
commit 062 c c f c 2 4 4 7 9 2 9 a d d 1 9 a 3 6 c f 6 b 8 9 8 b 9 1 b d 0 0 5 c 9 0
Author : hectornieto < hector . nieto . solana@gmail . com >
Date : Sun May 9 11:20:48 2021 +0200
commit b a 4 3 a 6 b 0 2 1 8 f 5 8 1 2 c d 6 d 4 f 4 4 5 2 3 1 c 1 3 8 1 9 f 4 b b 1 9
Author : hectornieto < hector . nieto . solana@gmail . com >
Date : Sun May 9 10:39:02 2021 +0200
My first commit
Por otro lado, con git log --oneline obtenemos una salida resu-
mida y más fácil de ver del mismo historial:
9 a9ea98 ( HEAD -> master ) Added new module archivo_2
f0cf479 Added a second line of code
062 ccfc Fix inital bug
ba43a6b My first commit
11
El id del commit es una frase SHA-1, de 40 dı́gitos en formato hexadecimal, que
incluye la información básica del mismo. Como es probabilı́sticamente casi imposible que
coincidan, uno puede referirse a cualquier commit usando sólo los 7 primeros dı́gitos
16
También podemos ver diferencias entre commits usando sus id.
Con git log --oneline anota los id de dos de los commits e in-
trodúcelos en el comando git diff <commit_1> <commit_2> .
En mi caso si quisiera ver qué ha cambiado entre el primer com-
mit (ba43a6b My first commit) y mi último commit, tendrı́a
que teclear git diff ba43a6b 9a9ea98
diff -- git a / archivo_1 . txt b / archivo_1 . txt
index 7 aa40b1 .. ac6c5fc 100644
--- a / a r c h i v o _ 1 . txt
+++ b / a r c h i v o _ 1 . txt
@@ -1 +1 ,2 @@
- mi primera linea de codigo
+ mi primera linea de codigo corregida
+ segunda linea de codigo
diff -- git a / archivo_2 . txt b / archivo_2 . txt
new file mode 100644
index 0000000..01 a59b0
--- / dev / null
+++ b / a r c h i v o _ 2 . txt
@@ -0 ,0 +1 @@
+ lorem ipsum
You are in ’ detached HEAD ’ state . You can look around , make
experimental
changes and commit them , and you can discard any commits you make
in this
state without impacting any branches by switching back to a
branch .
git switch -
17
Turn off this advice by setting config variable advice .
detachedHead to false
2. Teclea ahora git log --oneline para confirmar que estás en el com-
mit que querı́as. Si todo va según lo planeado, mira ahora el contenido
de la carpeta, verás que el segundo archivo que añadimos en el último
commit ya no está. Además si abres el primer archivo, éste no con-
tendrá las modificaciones hechas en los dos últimos commits. En este
punto podrı́as correr tu código con esa versión e incluso hacer nue-
vas modificaciones al mismo a partir de ese estado. Sin embargo, no
te preocupes y no entres en pánico, siempre puedes volver a la últi-
ma versión tecleando git checkout - o git checkout <branch> ,
donde branch es la rama (por defecto master) en la que estabas tra-
bajando. Verás que los archivos vuelven a estar según estaban en el
último commit que hicimos12 .
18
comúnmente llamado el “Benevolente dictador” del código o del reposito-
rio14 .
3. puedes ver ahora las ramas de tu código tecleando git branch , apa-
reciendo resaltado con un asterisco (y distinto color) el nombre de la
rama en la que te encuentras actualmente
dev
* master
4. cambia de rama tecleando git checkout dev o con git switch dev .
Switched to branch ’ dev ’
si tecleas git log o git log --oneline verás que tenemos los mis-
mos commits que con tu rama maestra, y si echas un ojo al contenido
de tus archivos aparecen exactamente como estaban en master. Es
decir ambas ramas en este momento son exactamente idénticas.
14
Si quieres ver la historia de los orı́genes de este término pincha en este blog del creador
de Python
19
5. Asegúrate que estas en la rama dev (con git branch ) y edita el se-
gundo archivo, añadiendo una segunda lı́nea nueva linea experimental .
Guarda el archivo, y registra el cambio15 .
6. mira ahora la lista de commits con git log --oneline . Algo similar
a esto deberı́a aparecerte:
deb0b98 ( HEAD -> dev ) Include more effiicent computation
9 a9ea98 ( master ) Added new module archivo_2
f0cf479 Added a second line of code
062 ccfc Fix inital bug
ba43a6b My first commit
teclea
git log --oneline --graph --all --simplify-by-decoration
para ver en la terminal una visualización simplificada de todas
las ramificaciones de tu código.
Ya conocemos qué hace git log --oneline, en este caso le añadi-
mos la opción graph para que muestre en la terminal en forma
de gráfico, all para que muestre todas las ramas a la vez, y
simplify-by-decoration para que sólo muestre los registros re-
levantes, es decir, aquéllos cuando ocurrieron las ramificaciones.
15
Recuerda que los cambios se registran primero añadiendo archivos al futuro commit
con “git add” para despues confirmar y documentar el cambio con “git commit”
20
Otra forma más amigable de ver la evolución de las ramifica-
ciones es en GitHub, claro está siempre que esté en esta plata-
forma. Vamos a echar un ojo al estado de uno de mis reposi-
torios (pyTSEB) en GitHub. En tu explorador navega a https:
//github.com/hectornieto/pyTSEB, pincha en Insights y lue-
go Network para ver un gráfico similar a este
21
Vamos a actualizar las dos ramas con la que hemos estado trabajando.
22
3. Fusión y resolución de conflictos
3.1. Fusionados de ramificaciones
El fin último de trabar con ramas es incorporar en tu rama principal el
código que hayas desarrollado, una vez hayas visto que funciona y que es es-
table. Para eso hay dos nuevos comandos que vamos a aprender git rebase
y git merge .
2. Activa la rama dev mediante git switch dev o git checkout dev
23
4. teclea de nuevo git log --oneline --all --graph para ver que la
nueva rama que has creado se encuentra en el mismo estado que dev
* bb74ee6 ( origin / master , master ) Create README . md
| * deb0b98 ( HEAD -> dev , origin / dev , dev_old ) Include more
effiicent computation
|/
* 9 a9ea98 Added new module archivo_2
* f0cf479 Added a second line of code
* 062 ccfc Fix inital bug
* ba43a6b My first commit
24
Si te fijas de nuevo en el mensaje que recibiste al ejecutuar git merge dev,
La actualización/fusionado se ha realizado mediante la estrategia Fast Forward,
que significa que simplemente git puede añadir todos los registros nuevos al
final del último registro. Esto es debido a que previamente al fusionado hici-
mos una actualización de la rama dev para que incluyese todos los commits
de master posteriores al momento en que ambas ramas se separaron. Esto a
veces no siempre es posible y, sobre todo al actualizar/sincronizar los repo-
sitorios remotos, que han podido sufrir cambios desde otro ordenador o por
otro usuarios.
Afortunadamente Git es suficientemente inteligente para decidir qué es-
trategia de fusionado es la mejor para cada caso (según los registros en
común y las divergencias entre ramas), por lo que no te tienes que preocu-
par mucho de esto20 . Sin embargo, puede darse el caso, y más frecuente de
lo que te imaginas sobre todo en las fases de iniciación de Git, que haya
casos en los que el sistema no pueda hacer la fusión de forma automática, y
entonces es cuando tenemos nosotros que resolver el conflicto.
25
nueva linea de codigo en futuro_conflicto
6. registra el cambio en un nuevo commit, p.ej.
Que viene a decir que Git no puede por sı́ solo fusionar las ramas por la
existencia de conflictos en el archivo_1.txt. Nos pide que arreglemos
el conflicto y que registremos el cambio.
9. Edita de nuevo el archivo en conflicto, verás que presenta un texto
similar a este:
mi primera linea de codigo corregida
segunda linea de codigo
<<<< <<< HEAD
nueva linea de codigo de la rama master
=======
nueva linea de codigo en f u t u r o _ c o n f l i c t o
>>>> >>> f u t u r o _ c o n f li c t o
26
10. Edita manualmente el texto de modo que tu código final se ajuste a
lo que realmente querı́as, por ejemplo podemos pensar que la parte
de master es la buena, o viceversa, o incluso que ninguna de las dos
lı́neas es la correcta y reescribir esa lı́nea.
11. Una vez termines y estés satisfecho con la resolución del conflicto tu
texto no deberı́a contener ningún caracter del tipo <<<<<<<, >>>>>>>
o =======. Por ejemplo:
mi primera linea de codigo corregida
segunda linea de codigo
nueva linea de codigo con conflicto resuelto
27
4.1. Creación de copias (“Forks”)
1. Primero vamos a descargar y sincronizar el repositorio del curso a una
carpeta de tu PC. Teclea
git clone https://github.com/hectornieto/cursoGit Un men-
saje parecido a éste aparecerá
Cloning into ’ cursoGit ’ ...
remote : Enumerating objects : 72 , done .
remote : Counting objects : 100 % (72/72) , done .
remote : Compressing objects : 100 % (49/49) , done .
remote : Total 72 ( delta 29) , reused 60 ( delta 20) , pack - reused 0
Unpacking objects : 100 % (72/72) , 13.05 MiB | 9.12 MiB /s , done .
6. Confirma que tu repositorio local está ahora conectado a los dos reposi-
torios remotos, el original al que más adelante haremos el Pull Request
y su copia en tu propio espacio GitHub, mediante el comando git remote -v
28
origin https :// github . com / hectornieto / cursoGit ( fetch )
origin https :// github . com / hectornieto / cursoGit ( push )
upstream https :// github . com / complutig / cursoGit ( fetch )
upstream https :// github . com / complutig / cursoGit ( push )
La idea de tener dos remotos es usar el remoto original para tener siempre
actualizado tus repositorios, tanto el local como tu copia remota. Para ello
se recomienda confirmar el estado de sincronización con git status y
en caso de que haya nuevos commits en el repositorio original traerlos a
tus copias con git pull origin <branch> . Luego subir los cambios que
hagas desde tu repositorio local a tu repositorio remoto, con el fin último de
hacer el Pull Request desde tu remoto al remoto original.
1. Para asegurarnos que tenemos los últimos registros del repositorio ori-
ginal teclea git fetch --all
2. Como hay una rama remota con tu nombre de usuario GitHub teclea
git checkout <usuario> para que el sistema construya esa rama
en tu repositorio local.
29
Username for ’ https :// github . com ’: hectornieto
Password for ’ https :// h e c t o r n i e t o @ g i t h u b . com ’:
Enumerating objects : 3 , done .
Counting objects : 100 % (3/3) , done .
Delta compression using up to 4 threads
Compressing objects : 100 % (2/2) , done .
Writing objects : 100 % (2/2) , 237 bytes | 237.00 KiB /s , done .
Total 2 ( delta 1) , reused 0 ( delta 0)
remote : Resolving deltas : 100 % (1/1) , completed with 1 local
object .
To https :// github . com / complutig / cursoGit
5 b0e2c6 .. f98d500 test -> test
30
8. Pincha en el icono verde de Compare & Pull Request . Aparecerá
una pantalla como esta
31
Figura 1: Ejemplo de Pull Request pendiente por aprobar por el dueño del
repositorio
32
git add *.py añadirı́a todos los arhivos dentro de la carpeta con la ex-
tensión .py.
33
git checkout <commit> o git checkout HEAD~<número> permite
restaurar una versión previa del repositorio
git branch <branch> crea una nueva rama con nombre <branch>
como réplica de la ramificación en la que actualmente te encuentres.
34