Tutorial Git
Tutorial Git
Í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 . . . . . . . . . . . . . . . 20
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 aprovecha-
miento ó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 laboratorio nos centraremos en esta plataforma. No obstante,
hay otras plataformas alternativas para almacenar tus códigos en la nube como
pueden ser GitLab, BitBucket, e incluso tú o una compañı́a/departamento puede
tener su propia plataforma Git para la gestión de software y código. Un último
comentario antes de empezar 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 introduciendo
tus datos. GitHub ofrece cuentas gratuitas con un número limitado de resposi-
torios 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 también para el futuro. Es im-
portante 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:
3
el entorno git, es decir no hace falta que más adelante especifiques de nuevo un
usuario y un correo electrónico cada vez que crees un repositorio en tu PC3 .
Por otro lado, en algunos casos Git te pedirá editar algún archivo de texto.
Según el editor al que estés acostumbrado/a puedes cambiar el editor de texto
con este comando:
Windows Notepad
git␣config␣--global␣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 repositorio4 .
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.
2. Una vez estés en la carpeta de destino teclea
git␣init
Un mensaje similar a este aparece diciendo que has creado un nevo repo-
sitorio vacı́o.
Initialized empty Git repository in < carpeta_actual >
que te encuentres
4 usa “cd” para ir cambiando de carpetas
5 En Linux todos los archivos y carpetas que comienzan con un punto (“.”) son ocultos
4
No vamos a entrar en detalle sobre la estructura y contenido de esta car-
peta ya que es parte del sistema interno de Git. Simplemente remarcar
que todos los cambios y versiones que hagas en tu futuro código, quedarán
registrado dentro de esta carpeta, por lo que nunca la borres. Por otro la-
do, si quieres borrar un proyecto de Git, no tienes más que borrar esta
subcarpeta.
4. En la carpeta donde creaste el repositorio vacı́o crea o guarda un archivo
de texto con este texto6
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 )
No commits yet
Changes to be committed :
( use " git rm -- cached < file >... " to unstage )
new file : archivo_1 . txt
5
2.2. Crear repositorio en GitHub
Para esta parte es necesario que ya tengas un usuario registrado en GitHub,
por lo que si aún no lo has hecho sigue los pasos mostrados en la sección 1.1.
ya estés registrado/a
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 repo-
7
sitorio/software. Algo ası́ como “Voy a disfrutar tanto de este laboratorio
que he decidido subirlo a GitHub”, o este otro “La FIS necesita una prue-
ba de que he realizado el curso satisfactoriamente por lo que colgaré mis
tareas en GitHub como evidencia”
5. Ahora, como no quieren que sus compañeros de curso se copien de tu
ejercicio, vamos a seleccionar que nuestro repositorio sea privado8 . Esto
implicará que nadie puede ver tu código a no ser que le des permiso expreso
como colaborador. Si no les permite crear un repositorio privado pueden
hacerlo público (lo haremos más adelante).
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 nues-
tro repositorio local ya existente.
7. Finalmente click en el botón verde Create␣repository en muy poco
tiempo te aparecerá una ventana explicándote los siguientes pasos/op-
ciones que puedes hacer para importar tu repositorio. En nuestro caso
usaremos la segunda opción (pero más adelante)
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 haz
click en Settings y depués en la barra izquierda en la segunda opción
Manage␣Access . Os aparecerá esta pantalla, tras lo cual das click en el
botón verde de Invite␣a␣collaborator
8 Actualmente el plan gratuito de GitHub admite crear repositorios tanto públicos como
privados ilimitados
8
En el recuadro tienen que buscarme por usuario richardriverag , en
caso de duda u os salgan otros usuarios similares, mi usuario tiene mi
foto, o alguien parecido a mı́ con gafas de sol. De este modo sólo tu y yo
podremos ver tu repositorio en GitHub, y podré ademas sugerirte cambios
a través de un Pull␣Request .
9
¯
Puedes navegar y visualizar ahora el contenido de los tres archivos y fami-
liarizarte un poco con el entorno de trabajo de GitHub. En el que puedes
incluso editar código y archivos, aunque siempre es recomendable trabajar
en local, editando los arhivos en tu PC, para luego sincronizar el reposi-
torio local con el remoto.
Hay un gran número de pestañas en cada repositorios, pero en realidad,
tan sólo usarás el 99 % del tiempo la pestaña de Code , Settings e
Insights , en ese orden de importancia. Luego en menor medida, y lo
veremos más adelante la pestaña de Pull␣Requests .
10
git␣push␣-u␣<alias_del_remoto>␣<branch>
donde <alias_del_remoto> es el nombre que le dimos con el comando
git␣remote␣add , y <branch> es la rama que queremos subir ( main
o master generalmente). La opción -u es para que genere una nueva
rama en el remoto y la asigne esa rama al seguimiento de la rama local
actual, por lo que sólo es necesario incluir esta opción la primera vez que
subamos una nueva rama al remoto. Git retorna un mensaje parecido a
este si todo se ha subido adecuadamente:
$ git push -u origin master
info : please complete authe nticati on in your browser ...
Enumerating objects : 3 , done .
Counting objects : 100 % (3/3) , done .
Writing objects : 100 % (3/3) , 245 bytes | 61.00 KiB /s , done .
Total 3 ( delta 0) , reused 0 ( delta 0) , pack - reused 0
To https :// github . com / r ichardri verag / primer os_pasos
* [ new branch ] master -> master
branch ’ master ’ set up to track ’ origin / master ’.
En algunos casos les aparecerá una ventana para iniciar sesión en el na-
vegador, solo deben seguir el proceso e iniciar sesión. también se puede
cerrar esta ventana e iniciar la sesión desde la terminal
¯
Username for ’ https :// github . com ’: ri chardri verag
Password for ’ https :// ri ch 7 mc s@ gi t hu b . com ’:
Enumerating objects : 3 , done .
Counting objects : 100 % (3/3) , done .
Counting objects : 100 % (3/3) , done .
Writing objects : 100 % (3/3) , 245 bytes | 61.00 KiB /s , done .
Total 3 ( delta 0) , reused 0 ( delta 0) , pack - reused 0
To https :// github . com / r ichardri verag / primero s_pasos
* [ new branch ] master -> master
branch ’ master ’ set up to track ’ origin / master ’.
11
tu repositorio tiene contenido, exactamente lo que tenı́as añadido a tu
repositorio local.
¯
´
4. Verás que GitHub te está mandando un mensaje para añadir un README
y documentar el repositorio, vamos a hacerle caso y damos click en el
botón verde Add␣a␣README . Aparecerá un editor de texto para escribir
texto libre, en formato Markdown. Escribe una pequeña descripción, por
ejemplo que tú eres el autor y que se trata de un laboratorio. Puedes dar
click en Preview para ver cómo se mostrarı́a en la pantalla inicial de tu
repositorio en GitHub. Cuando estés contento guarda el archivo clickando
abajo del todo en Commit␣new␣file dejando el resto de las opciones por
defecto. En seguida el navegador volverá a la pantalla de inicio y verás
que el repositorio de GitHub contiene ya el nuevo archivo README.md
5. Ahora lo que ocurre es que en tu remoto tienes un commit (el nuevo ar-
chivo README.md) que no está en tu repositorio local. Por tanto acaba-
mos con esta parte sincronizando ambos repositorios mediante el comando
git␣pull9 . Para ello vuelve a tu terminal y teclea
git␣pull␣<alias_del_remoto>␣<branch>.
En nuestro caso serı́a:
git␣pull␣origin␣main.
Si todo va bien tendrı́as que recibir un mensaje parecido a este:
remote : Enumerating objects : 4 , done .
remote : Counting objects : 100 % (4/4) , done .
remote : Compressing objects : 100 % (3/3) , done .
remote : Total 3 ( delta 0) , reused 0 ( delta 0) , pack - reused 0
Unpacking objects : 100 % (3/3) , 733 bytes | 66.00 KiB /s , done .
From https :// github . com / richar drivera g / prim eros_pa sos
* branch master -> FETCH_HEAD
2 d3d729 ..8 ab8bb1 master -> origin / master
Updating 2 d3d729 ..8 ab8bb1
9 git push sube los cambios realizados en local al remoto, mientras que git pull se podrı́a
12
Fast - forward
README . md | 2 ++
1 file changed , 2 insertions (+)
create mode 100644 README . md
no changes added to commit ( use " git add " and / or " git commit -a " )
Ahora te está diciendo que hay cambios en tu proyecto que aún no han sido
añadidos para su posterior registro. Bien puedes ejecutar git␣add␣<archivo>
para añadir esos cambios al siguiente registro o descartar los mismos me-
diante git␣restore␣<archivo> . Nosotros, como estamos seguros y he-
mos visto que esta parte de código funciona queremos añadir y registrar el
cambio. Pero antes vamos a asegurarnos qué es lo que ha cambiado entre
la versión actual y la que fue registrada por el primer commit.
3. Teclea git␣diff␣<archivo> , un texto similar a este te aparecerá
diff -- git a / archivo . txt b / archivo . txt
index ba0951d ..8 f1d56c 100644
--- a / archivo . txt
+++ b / archivo . 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.
4. Repite los pasos 6 y 7 de la sección 2.1 para añadir la nueva versión
del archivo y registrarla bajo un nuevo commit. Recuerda modificar el
13
comentario del commit para que refleje de forma clara el porqué de tal
cambio, p.ej:
git␣commit␣-m␣’Fix␣initial␣bug’
5. Añade ahora una segunda lı́nea de código (cualquier frase servirı́a) a nues-
tro archivo y guárdalo. Crea un nuevo archivo de texto (p.ej. archivo2.txt)
con algún contenido (cualquier texto valdrı́a). Si tecleas ahora git␣status
te aparecerı́a un mensaje diciéndote por un lado que el archivo que ya
habı́as registrado ha sido modificado y, por otro lado, que hay un nuevo
archivo que aún no ha sido añadido para el seguimiento.
On branch master
On branch master
Your branch is ahead of ’ origin / master ’ by 1 commit .
( use " git push " to publish your local commits )
Untracked files :
( use " git add < file >... " to include in what will be committed )
archivo2 . txt
no changes added to commit ( use " git add " and / or " git commit -a " )
Changes to be committed :
( use " git restore -- staged < file >... " to unstage )
modified : archivo . txt
new file : archivo2 . txt
verás que Git te está diciendo que hay cambios listos para ser registrados
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 segundo
archivo que hemos creado no funciona correctamente, o simplemente no lo
queremos incluir en esta nueva versión. Podemos descartar su inclusión an-
tes de hacer el commit tecleando git␣restore␣--staged␣archivo2.txt
o también tecleando git␣reset␣archivo2.txt . Vuelve a teclear git␣status
para ver de nuevo el estado actual:
On branch master
Your branch is ahead of ’ origin / master ’ by 1 commit .
( use " git push " to publish your local commits )
Changes to be committed :
( use " git restore -- staged < file >... " to unstage )
modified : archivo . txt
14
Untracked files :
( use " git add < file >... " to include in what will be committed )
archivo2 . 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:
commit 7 b a d 9 0 0 8 e 6 0 a b 7 2 e 7 2 5 b 6 e a f b f a 8 2 7 0 7 6 d 2 9 7 e 8 4
Author : ric hardrive rag < r i c h 7 m c s @h o t m a i l . com >
Date : Sat Dec 3 14:29:53 2022 -0500
commit 325 f 9 a 8 e c d f b 2 c e e 3 7 a b 5 8 f 4 1 a b 1 a 2 8 f 0 3 0 b 3 b 4 8
Author : ric hardrive rag < r i c h 7 m c s @h o t m a i l . com >
Date : Sat Dec 3 14:21:42 2022 -0500
Create README . md
commit 2 d 3 d 7 2 9 d f b d f 8 d d 2 3 e f 0 f e 1 9 1 f 4 d 8 2 8 9 7 e f c e f 6 e
Author : ric hardrive rag < r i c h 7 m c s @h o t m a i l . com >
Date : Fri Dec 2 18:06:41 2022 -0500
Mi primer commit
15
Por otro lado, con git␣log␣--oneline obtenemos una salida resumida
y más fácil de ver del mismo historial:
625 d85c ( HEAD -> master ) Added new module archivo2
7 bad900 Added a second line of code
325 f9a8 Fix initial bug
8 ab8bb1 ( origin / master ) Create README . md
2 d3d729 Mi primer commit
También podemos ver diferencias entre commits usando sus id. Con
git␣log␣--oneline anota los id de dos de los commits e introdúce-
los en el comando git␣diff␣<commit_1>␣<commit_2> . En mi caso
si quisiera ver qué ha cambiado entre el primer commit (2d3d729␣My␣first␣commit)
y mi último commit, tendrı́a que teclear git␣diff␣2d3d729␣625d85c
diff -- git a / README . md b / README . md
new file mode 100644
index 0000000..5 ccbfe5
--- / dev / null
+++ b / README . md
@@ -0 ,0 +1 ,2 @@
+ # prim eros_pas os
+ Voy a disfrutar tanto de este laboratorio que he decidido subirlo
a GitHub
diff -- git a / archivo . txt b / archivo . txt
index ba0951d .. d3378ee 100644
--- a / archivo . txt
+++ b / archivo . txt
@@ -1 +1 ,2 @@
- Mi primera linea de codigo
+ Mi primera linea de codigo corregida
+ segunda linea de codigo
diff -- git a / archivo2 . txt b / archivo2 . txt
new file mode 100644
10 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
index 0000000..87 ec737
--- / dev / null
+++ b / a r c h i v o 2 . txt
@@ -0 ,0 +1 @@
+ Otro archivo del codigo de Paul
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 .
If you want to create a new branch to retain commits you create , you
may
do so ( now or later ) by using -c with the switch command . Example :
git switch -
puedes revisar y restaurar todos y cada uno de las versiones que hayas registrado con “git
commit”
17
3. Hay otros dos comandos que hacen tareas similares:
git␣reset␣<commit> es mucho más agresivo al eliminar directamente
los registro posteriores a <commit>. Es una herramienta que a veces se
usa para “reescribir” la historia del repositorio borrando permanente-
mente los cambios realizados posteriores, y por tanto no se recomienda
utilizar cuando el repositorio está ligado a un repositorio remoto, por
ejemplo en GitHub12 . El otro comando, que es más recomendable, es
git␣revert␣<commit> , que restaurará todo el código una versión an-
terior y ese cambió quedará registrado como un nuevo commit, por lo
tanto una manera mucho más transparente y recomendable para restau-
rar versiones en códigos compartidos.
18
3. puedes ver ahora las ramas de tu código tecleando git␣branch , apare-
ciendo resaltado con un asterisco (y distinto color) el nombre de la rama
en la que te encuentras actualmente
dev
* master
“git add” para despues confirmar y documentar el cambio con “git commit”
19
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 relevantes, es decir, aquéllos cuan-
do ocurrieron las ramificaciones.
Otra forma más amigable de ver la evolución de las ramificaciones es
en GitHub, claro está siempre que esté en esta plataforma. Vamos a
echar un ojo al estado de un repositorio (AVClass) en GitHub. En
tu explorador navega a https://github.com/malicialab/avclass,
click en Insights y luego Network para ver un gráfico similar a este
¯
9. Haz nuevas ramas y nuevos commits a lo loco y expermienta con todas
las herramientas hechas hasta ahora. Por ejemplo prueba a ver los efec-
tos de git␣reset, git␣revert y git␣checkout para entender mejor las
diferentes formas de restaurar vesiones previas del código. Lo bueno que
tienen las ramas es que puedes experientar con cambios en tu código sin
afectar la rama principal donde tienes la versión estable del mismo ası́ que
haz cosas, y siéntete libre.
20
ası́ también poder acceder al mismo desde cualquier lado sin tener que llevarlo
en un pendrive. Es aquı́ donde los repositorios remotos, es decir plataformas
tipo GitHub, juegan su rol principal, aparte de ser, en un futuro próximo, el
escaparate donde suban sus códigos y software para la comunidad cientı́fica y/o
el público en general.
Vamos a actualizar las dos ramas con la que hemos estado trabajando.
1. Empecemos con la rama dev. Asegúrate que en el terminal que la rama
dev es la rama activa15 . dev aún no tiene una rama hermana en el remoto
por lo que tenemos que crearla y subir los contenidos mediante
git␣push␣-u␣origin␣dev
Es decir estás ordenando a Git que genere una rama llamada dev en el
repositorio remoto con alias origin y suba los contenidos de mi rama
actual16 . Deberı́a aparecer un mensaje similar a este:
Enumerating objects : 14 , done .
Counting objects : 100 % (14/14) , done .
Delta compression using up to 6 threads
Compressing objects : 100 % (10/10) , done .
Writing objects : 100 % (12/12) , 1.11 KiB | 568.00 KiB /s , done .
Total 12 ( delta 2) , reused 0 ( delta 0) , pack - reused 0
remote : Resolving deltas : 100 % (2/2) , done .
remote :
remote : Create a pull request for ’ dev ’ on GitHub by visiting :
remote : https :// github . com / richa rdrivera g / pri meros_p asos / pull / new /
dev
remote :
To https :// github . com / r ichardri verag / primer os_pasos
* [ new branch ] dev -> dev
branch ’ dev ’ set up to track ’ origin / dev ’.
2. master ya tiene su rama remota creada, que hicimos en la sección 2.3, por
lo que para subir el contenido de tu repositorio local al GitHub no hace
falta incluir las opciones -u␣<alias_del_remoto>␣<rama_del_remoto>,
como ya por defecto master tiene esa rama en el remoto para su segui-
miento. ´
Cambia de rama con git␣switch␣master o git␣checkout␣master , y
teclea git␣push para actualizar los contenidos de master.
Ya sabes el manejo básico de Git y GitHub. El resto del laboratorio lo dedi-
caremos a tareas más especı́ficas dentro del trabajo colaborativo, pero ya estás
preparado/a para realizar el 99 % de las tareas con Git que necesitarás, por lo
que ya puedes subir versionar tus propios códigos y subirlos a GitHub, bien para
compartirlos en público o mantenerlos en privado para tener siempre una copia
en la nube.
21
ble. Para eso hay dos nuevos comandos que vamos a aprender git␣rebase y
git␣merge .
Al principio cuesta visualizarlo pero muestra que tenemos dos ramas que
se bifurcan: origin/master y master son las ramas principales (la re-
mota y la local) en la que contiene el archivo REAMDE.md que creamos
desde GitHub. Por otro lado tenemos la rama dev, tanto en local como en
remoto(origin/dev), que se bifurcó de master tras añadir archivo2.txt
(en este ejemplo es el commit 625d85c) y que incluye un registro que no
está en master (a33efe0 en este ejemplo).
Cuando estamos trabajando con ramas, y sobre todo cuando queremos
incorporar los cambios realizados en una rama en la rama principal, es
conveniente tener actualizada la rama que estamos desarrollando con las
últimas actualizaciones de la rama principial17 . Esto se hace con el co-
mando git␣rebase␣master .
1.0) pero ya estás trabajando con la versión 2.0 en otra rama. Mientras trabajas en la nueva
versión es posible que otros usuarios o tú mismo te des cuenta de la existencia de algunos
bugs y/o pequeñas mejoras que hacer en la versión 1.0, por lo que añades nuevos commits a
la rama principal, teniendo ası́ la version 1.1. Llegados a este punto te interesa que la rama
sobre la que estás desarrollando la versión 2.0 incorpore también esos cambios
22
Que viene a indicar resitúa mi rama actual al último commit de la rama
master. Vuelve a ejecutar
git␣log␣--oneline␣--all␣--graph
para ver la situación de cada una de las ramas tras el rebase. También mira
el contenido de tu repositorio para cada una de las ramas y las diferencias
entre ellas.
Ahora que ya tenemos re-actualizada nuestra rama en desarrollo con la últi-
ma versión de la rama principal, podemos seguir trabajando mejorando nuestro
código o incorporar definitivamente los cambios a la rama master. Para esto
último se utiliza el comando git␣merge. git␣merge␣<branch> indica al siste-
ma que coja la rama <branch> y la fusione en la rama actual
1. Queremos fusionar la rama dev en la rama master, por lo que primero de
todo tenemos que activar la rama master git␣switch␣master
23
3.2. Resolución de conflictos
Un conflicto es debido a que al hacer ejecutar una actualización de ramas,
bien sea por merge o rebase, hay lı́neas del código que han sido modificadas
en las dos ramas y discrepan en su contenido. Cuando esto ocurre, que puede
ser bastante probables si no hacemos fusionados y actualizaciones con el remoto
frecuentes, Git avisa que no ha podido completar el fusionado por la existencia
de conflictos y nos pide que manualmente los solucionemos.
Vamos a generar voluntariamente un conflicto y ver lo que pasa y los pasos
a seguir para resolverlo:
1. Partimos de la situación anterior, en la que tenemos una rama master con
los cambios de dev ya incorporados.
2. Crea una nueva rama y llámala por ejemplo futuro_conflicto: branch␣futuro_conflicto
3. con la rama master activada edita uno de los archivos de texto (por ejem-
plo archivo1.txt) y añade una lı́nea con este texto nueva␣linea␣de␣codigo␣de␣la␣rama␣master
aparece
24
Auto - merging archivo . txt
CONFLICT ( content ) : Merge conflict in archivo . txt
Automatic merge failed ; fix conflicts and then commit the result .
Que viene a decir que Git no puede por sı́ solo fusionar las ramas por
la existencia de conflictos en el archivo.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 l i c to
Git te está indicando dónde y en qué modo está el conflicto. Tenemos que
resolver todo el texto que está entre <<<<<<< y >>>>>>>, de modo que lo
que hay entre <<<<<<<␣HEAD y ======= es la parte conflictiva que pertene-
ce al último commit (HEAD) de la rama actual (master), y lo que está entre
======= y es la parte conflictiva que hay en la rama futuro_conflicto.
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
14. Esto lo repetirı́amos para cualquier otro conflicto que tengamos, una vez
todos estén resueltos y añadidos al espacio de trabajo podemos continuar
con la fusión mediante
git␣merge␣--continue Si no has registrado commits durante esta fase,
al ejecutar este último comando Git te dará la opción de editar el texto
del commit, puedes dejar ese texto por defecto o modificarlo.
¡Enhorabuena! ya ha solucionado tu primer conflicto durante una fusión.
Si bien los pasos a realizar durante un conflicto siempre son los mismos:
editar los archivos conflictivos, añadirlos al espacio de trabajo y continuar
25
el fusionado mediante el keyword (--continue), no hay ninguna regla
sobre cómo resolver los mismos20 , y cada caso que se te presente será
distinto y tendrás que apelar al sentido común y al objetivo que tenga
la(s) linea(s) de código conflictiva(s).
26
5. Vuelve al terminal de tu PC y añade también la copia remota de tu GitHub
a tu repositorio local con:
git␣remote␣add␣<alias_del_remoto>␣https://github.com/<TuUsuario>/Lab_Git_GitHub23B
Donde <alias_del_remoto> podrı́a ser cualquier nombre excepto origin
ya que este alias ya está asignado al repositorio de mi cuenta. Un nom-
bre común en estos casos suele ser upstream . <TuUsuario> debe ser tu
nombre se usuario en mi caso es PaulGuevaraR, otro usuario desde donde
estoy también haciendo la práctica.
6. Confirma que tu repositorio local está ahora conectado a los dos reposito-
rios 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
origin https :// github . com / richard riverag / L a b _ G i t _ G i t H u b 2 3 B ( fetch )
origin https :// github . com / richard riverag / L a b _ G i t _ G i t H u b 2 3 B ( push )
upstream https :// github . com / PaulGuevaraR / L a b _ G i t _ G i t H u b 2 3 B (
fetch )
upstream https :// github . com / PaulGuevaraR / L a b _ G i t _ G i t H u b 2 3 B ( 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 repo-
sitorio local a tu repositorio remoto, con el fin último de hacer el Pull␣Request
desde tu remoto al remoto original.
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.
3. Crea una carpeta vacı́a llamada ejercicio_<usuario> donde sustituye
<usuario> por tu nombre de usuario GitHub.
4. Copia todo el repositorio de primeros_pasos en el que trabajaste en los
pasos anteriores a esta carpeta
5. Añade esa carpeta y todo su contenido al sistema Git y registra el cambio
con un commit
27
6. Sube los cambios a tu repositorio remoto con:
git␣push␣<alias_del_remoto>␣<branch>
donde <alias_del_remoto> es el alias de tu remoto (p.ej. upstream ) y
<branch> es el nombre de la rama que estás subiendo (que en este caso
es el nombre de tu usuario GitHub). SI todo va bien un mensaje similar a
este deberı́a aparecer
info : please complete authe nticati on in your browser ...
Enumerating objects : 4 , done .
Counting objects : 100 % (4/4) , done .
Delta compression using up to 6 threads
Compressing objects : 100 % (2/2) , done .
Writing objects : 100 % (3/3) , 437 bytes | 437.00 KiB /s , done .
Total 3 ( delta 0) , reused 0 ( delta 0) , pack - reused 0
remote :
remote : Create a pull request for ’ PaulGuevaraR ’ on GitHub by visiting :
remote : https :// github . com / PaulGuevaraR / L a b _ G i t _ G i t H u b 2 3 B / pull / new
/ PaulGuevaraR
remote :
To https :// github . com / PaulGuevaraR / L a b _ G i t _ G i t H u b 2 3 B
* [ new branch ] PaulGuevaraR -> PaulGuevaraR
Como ves ya GitHub detecta que ha habido cambios entre la rama que
tienes en tu repositorio remoto y la misma rama del repositorio original y
te ofrece la posibilidad de comparar ambas ramas y hacer un pull request.
28
8. click en el icono verde de Compare␣&␣Pull␣Request . Aparecerá una pan-
talla como esta
29
o rechazar la sugerencia. Si lo aprueba, el repositorio original se actualiza au-
tomáticamente con los cambios que sugeriste.
Figura 1: Ejemplo de Pull Request pendiente por aprobar por el dueño del
repositorio
30
parados por espacios git␣add␣<archivo_1>␣<archivo_2>␣<...> . git␣add
también admite wildcards para añadir todos los archvos presentes en una car-
peta que cumplan con un patrón en su nombre. Por ejemplo git␣add␣*.py
añadirı́a todos los arhivos dentro de la carpeta con la extensión .py.
posible, mejor muchos y cortos que un gran commit con muchos cambios dentro de los arhivos
22 Algo similar a la herramienta de control de cambios de Word
31
git␣checkout␣<branch> permite ir de una rama a otra.
32