¡Apuntes para el Curso Profesional de Git y GitHub 💾💚💻! Notion: https://enchanting-digit-d82.notion.site/Curso-Profesional-de-Git-y-GitHub-30c863cffd264452baca02b1215fd0a7
¿Qué es Git?
Git es un software de control de versiones diseñado por Linus Torvalds, pensando en la eficiencia, la confiabilidad y compatibilidad del mantenimiento de versiones de aplicaciones cuando estas tienen un gran número de archivos de código fuente. Su propósito es llevar registro de los cambios en archivos de computadora incluyendo coordinar el trabajo que varias personas realizan sobre archivos compartidos en un repositorio de código.
Linus Torvalds
Linus Benedict Torvalds es un ingeniero de software finlandés-estadounidense, conocido por iniciar y mantener el desarrollo del kernel Linux, basándose en el sistema operativo libre Minix creado por Andrew S. Tanenbaum y en algunas herramientas, varias utilidades y los compiladores desarrollados por el proyecto GNU. Actualmente es responsable de la coordinación del proyecto.
GitHub
GitHub es una plataforma de desarrollo colaborativo para alojar proyectos utilizando el sistema de control de versiones Git. Se utiliza principalmente para la creación de código fuente de programas de ordenador. El software que opera GitHub fue escrito en Ruby on Rails. Desde enero de 2010, GitHub opera bajo el nombre de GitHub, Inc. Anteriormente era conocida como Logical Awesome LLC. El código de los proyectos alojados en GitHub se almacena típicamente de forma pública.
Primer repositorio
Configuración básica de git
Lo primero que debe hacer al instalar Git es configurar su nombre de usuario y dirección de correo electrónico. Esto es importante porque cada confirmación de Git usa esta información, y se integra de manera inmutable en las confirmaciones (commits
) que comienzas a crear.
$ git config --global user.name "John Doe"
$ git config --global user.email johndoe@example.com
Inicio del repositorio
git init
es un comando que se utiliza una sola vez durante la configuración inicial de un repositorio nuevo. Al ejecutar este comando, se creará un nuevo subdirectorio .git
en tu directorio de trabajo actual. También se creará una nueva rama maestra.
Primeros comandos para el manejo de Git
git add [filename]
: El comandogit add
agrega archivos nuevos o modificados en su directorio de trabajo al área de preparación de Git.git add
es un comando importante; sin él, ningúngit commit
haría nada. A veces,git add
puede tener la reputación de ser un paso innecesario en el desarrollo. Pero en realidad,git add
es una herramienta importante y poderosa.git add
te permite dar forma al historial sin cambiar tu forma de trabajar.git commit -m "text"
: Crea una nueva confirmación que contenga el contenido actual del índice y el mensaje de registro dado que describe los cambios.

Etapas de los archivos en git
Ctrl + o
Enter
Ctrl +x
Esc
:wq
Enter
git log [filename]
: El comando git log
muestra una lista de todas las confirmaciones realizadas en un repositorio para un archivo en especifico.
Otros comandos útiles
**git status**
: El comandogit status
solo genera información, no modifica las confirmaciones ni los cambios en su repositorio local. Una característica útil degit status
es que proporcionará información útil según su situación actual.**git show <file>**
: El comandogit show
muestro todos los cambios realizados en la ultima confirmación realizada a ese archivo.**git diff <file>**
: El comandogit diff
muestra las diferencias entre la versión del archivo en el Working Directory y el Staging Areagit diff <HASH> <HASH>
: El comandogit diff
al introducir el respectivoHASH
de dos confirmaciones del historial del repositorio, procederá a hacer la comparación del mismo archivo “a través del tiempo”.
Branch (rama)
Una rama Git es simplemente un apuntador móvil apuntando a una de esas confirmaciones. La rama por defecto de Git es la rama master
. Con la primera confirmación de cambios que realicemos, se creará esta rama principal master apuntando a dicha confirmación. En cada confirmación de cambios que realicemos, la rama irá avanzando automáticamente.
**git branch -r
😗* Con la opción-r or --remotes
el comandogit branch
enumera las ramas de seguimiento remoto.**git branch -a
😗* Con la opción-a or --all
el comandogit branch
enumera tanto las ramas de seguimiento remoto como las locales.git merge
: La fusión es la forma que tiene Git de volver a unir un historial bifurcado. El comandogit merge
permite tomar las líneas independientes de desarrollo creadas porgit branche
integrarlas en una sola rama.
Metodología para el manejo estándar de las ramas en git
https://www.atlassian.com/git/tutorials/comparing-workflows/gitflow-workflow, https://danielkummer.github.io/git-flow-cheatsheet/
Comandos para el manejo del flujo te trabajo en git
git checkout
: En términos de Git, “checkout
” (extraer) es el acto de cambiar entre diferentes versiones de una entidad objetivo.
‼️Careful Here‼️
git rm [filename]
: El comandogit rm
elimina un archivo de un repositorio de Git. Este comando elimina un archivo de su sistema de archivos y luego lo elimina de la lista de archivos rastreados por un repositorio de Git.- La opción
--cached
le permite eliminar un archivo de un repositorio de Git sin eliminarlo en su sistema de archivos. - La opción
--force
permite eliminar los archivos del repositorio local y del disco duro. Git siempre guarda todo, por lo que podemos acceder al registro de la existencia de los archivos, de modo que podremos recuperarlos si es necesario (Pero se deberán usar comandos más avanzados).
- La opción
git reset
: El comandogit reset
es una herramienta compleja y versátil para deshacer cambios. Se invoca principalmente de tres formas distintas, que se corresponden con los argumentos de líneas de comandos--soft
,--mixed
y--hard
.- Con la opción
--soft
borramos todo el historial y los registros de Git pero guardamos los cambios que tengamos en Staging, así podemos aplicar las últimas actualizaciones a un nuevo commit. - Con la opción
--hard
borra todo. absolutamente todo. Toda la información de los commits y del área de staging se borra del historial.
- Con la opción
**git log --stat**
: La opción --stat
muestra el número de inserciones y eliminaciones de cada archivo alterado por cada confirmación (tenga en cuenta que modificar una línea se representa como 1 inserción y 1 eliminación). Esto es útil cuando desea un breve resumen de los cambios introducidos por cada confirmación.
Flujo de trabajo básico con un repositorio remoto
Comandos para el manejo de repositorios remotos
git clone url_del_servidor
: Descarga todo los archivos de la ultima versión de la rama principal y guarda el historial de todos los cambios realizados en la carpeta.git
.git push
: Una vez los archivos sean añadidos al repositorio local congit add
ygit commit
, el comandogit push
mandara los cambios realizados al repositorio remoto.

git merge
: La fusióngit merge
es la forma en que tiene Git vuelve a unir un historial bifurcado. El comandogit merge
permite tomar las líneas independientes de desarrollo creadas porgit branch
e integrarlas en una sola rama.git pull
: El comandogit pull
ejecuta en primer lugargit fetch
, que descarga el contenido del repositorio remoto especificado. Después, se ejecutagit merge
para fusionar las referencias y los encabezados del contenido remoto en una nueva confirmación de fusión local.
HEAD (Cabecera)
El archivo HEAD es una referencia simbólica a la rama donde te encuentras en cada momento. Por referencia simbólica nos referimos a que, a diferencia de una referencia normal, esta contiene un enlace a otra referencia en lugar de un valor SHA-1. Si miras dentro del archivo, podrás observar algo como:
$ cat .git/HEAD
ref: refs/heads/master
Si se ejecuta el comando git checkout header
, Git actualiza el contenido del archivo de la siguiente manera:
$ cat .git/HEAD
ref: refs/heads/header
Conflictos de git merge
Los sistemas de control de versiones consisten en gestionar las contribuciones de diversos autores distribuidos (normalmente, desarrolladores). A veces, se puede dar el caso de que varios desarrolladores intenten editar el mismo contenido. Si el desarrollador A intenta editar código que el desarrollador B está editando, podría producirse un conflicto. Para evitar que se produzcan conflictos, los desarrolladores trabajan en ramas aisladas independientes. La función principal del comando git merge
es combinar ramas independientes y resolver los cambios en conflicto.
$ cat merge.txt
<<<<<<< HEAD
this is some content to mess with
content to append
=======
totally different content to merge later
>>>>>>> new_branch_to_merge_later
Información acerca de cambio de palabras relacionadas con el racismo en el uso de GitHub
Conectar repositorio local a remoto
En caso de haber tenido algún problema en los pasos 1 y 2 podemos usar el comando git remote remove origin
, el cual elimina la conexión con el repositorio remoto (origin) establecida en el primer paso.
-
Se debe guardar la URL del repositorio remoto con el comando
git remote
.git remote add origin <URL>
-
Verificar la validez de la URL introducida en el paso anterior a través del comando
git remote
.git remote git remote -v
-
Se deben extraer los archivos del repositorio remoto y posteriormente hacer un
merge
para crear uncommit
con los archivos de ambos repositorios. Es posible hacer uso degit fetch
ygit merge
o simplemente escribir el comandogit pull con el flag --allow-unrelated-histories
.git pull origin master --allow-unrelated-histories
-
Por ultimo, se procede a hacer un
git push
para guardar los cambios del repositorio local en el repositorio remotogit push origin master
Recuerda que antes de hacer push
a tu repositorio remoto es una buen practica hacer un git pull origin master
y posteriormente hacer un git push origin master
Criptografía asimétrica
La criptografía asimétrica, también llamada criptografía de clave pública o criptografía de dos claves, es el método criptográfico que usa un par de claves para el envío de mensajes. Las dos claves pertenecen a la misma persona que recibirá el mensaje.

Una clave es pública y se puede entregar a cualquier persona, la otra clave es privada y el propietario debe guardarla de modo que nadie tenga acceso a ella. Además, los métodos criptográficos garantizan que esa pareja de claves solo se puede generar una vez, de modo que se puede asumir que no es posible que dos personas hayan obtenido casualmente la misma pareja de claves.
Clave SSH Local
Generar una nueva llave SSH
ssh-keygen -t rsa -b 4096 -C "youremail@example.com"
Comprobar proceso y agregarlo (Windows)
eval $(ssh-agent - s)
ssh-add ~/.ssh/id_rsa
Una vez añadida, la llave publica a GitHub debe actualizar la conexión de su repositorio local con el repositorio remoto y hacer uso de una URL con SSH
git remote set-url origin <url-ssh-del-repositorio-en-github>
Etiquetado git tag
Las etiquetas son referencias que apuntan a puntos concretos en el historial de Git. Generalmente, el etiquetado se usa para capturar un punto en el historial que se utiliza para una publicación de versión marcada (por ejemplo, v1.0.1). Una etiqueta es como una rama que no cambia. A diferencia de las ramas, las etiquetas, tras crearse, no tienen más historial de confirmaciones.
- Crear un nuevo tag y asignarlo a un
commit
:git tag -a <name-tag> <id-commit>
. - Borrar un tag en el repositorio local:
git tag -d <name-tag>
. - Listar los tags de nuestro repositorio local:
**git tag
** ogit show-ref --tags
. - Publicar un tag en el repositorio remoto:
git push origin --tags
. - Borrar un tag del repositorio remoto:
git tag -d <name-tag>
ygit push origin :refs/tags/<name-tag>
.
Comandos para el manejo de ramas
**git branch <name-branch>
/git checkout -b <name-branch>
**: Ambos comandos (git branch
ygit checkout
) crean una nueva rama en el repositorio local.git push origin <name-branch>
: Este comando se encarga de enviar al repositorio remoto la rama especificada.
git clone <URL>
: git clone
es una utilidad de línea de comandos de Git que se utiliza para fijar como objetivo un repositorio existente con el fin de clonarlo o copiarlo.
Realizar una solicitud de incorporación de cambios

Las pull requests son una funcionalidad que facilita la colaboración entre desarrolladores que usan GitHub. Ofrecen una interfaz web intuitiva para debatir los cambios propuestos antes de integrarlos en el proyecto oficial.
Fork
Una ramificación es una copia de un repositorio. Bifurcar un repositorio te permite experimentar libremente con cambios sin afectar el proyecto original. Casi siempre las bifurcaciones se usan para proponer cambios al proyecto de otra persona o para usar el proyecto de otra persona como inicio de tu propia idea.
gitignore
, es un archivo de texto que le dice a Git qué archivos o carpetas ignorar en un proyecto. Un archivo local.gitignore
generalmente se coloca en el directorio raíz de un proyecto. También puedes crear un archivo global.- GitHub tiene un servicio de hosting gratuito llamado GitHub Pages, es posible tener un repositorio donde el contenido se vaya a GitHub y se vea online. De manera que, cualquier persona pueda verlo.
Se considera una buena practica tener un archivo [README.md](http://readme.md)
dentro del repositorio remoto con el cual las personas podrán conocer acerca de que se esta trabajando. Existen algunos editores Open source online para formato Markdown con el fin de facilitar la escritura del texto.
Git rebase (Mala practica)
Consiste en cambiar la base de tu rama de una confirmación a otra haciendo que parezca que has creado la rama desde una confirmación diferente. Internamente, Git lo hace creando nuevas confirmaciones y aplicándolas a la base especificada. Es muy importante entender que, aunque la rama parece la misma, se compone de nuevas confirmaciones por completo.
# Cambiamos a la rama que queremos traer los cambios
git checkout experiment
# Aplicamos rebase para traer los cambios de la rama que queremos
git rebase master
Git stash
El comando git stash
almacena temporalmente (o guarda en un stash
) los cambios que hayas efectuado en el código en el que estás trabajando para que puedas trabajar en otra cosa y, más tarde, regresar y volver a aplicar los cambios más tarde. Guardar los cambios en stashes
resulta práctico si tienes que cambiar rápidamente de contexto y ponerte con otra cosa, pero estás en medio de un cambio en el código y no lo tienes todo listo para confirmar los cambios.
Modo de acceso a los elementos en stashed
(stack
)
Una pila (stack en inglés) es una lista ordenada o estructura de datos que permite almacenar y recuperar datos, siendo el modo de acceso a sus elementos de tipo LIFO (del inglés Last In, First Out, «último en entrar, primero en salir»). Esta estructura se aplica en multitud de supuestos en el área de la informática debido a su simplicidad y capacidad de dar respuesta a numerosos procesos.

Comandos útiles para la utilización de git stash
**git stash**
: El comandogit stash
almacena de manera temporal los cambios realizado en el código según la rama en que se encuentre, posteriormente todos estos cambios podrán ser recuperados ya sea en la misma rama o en una diferente.**git stash save <"message-identifier">**
: En caso de haber realizado una cantidad considerable destash
, es posible identificarlos por medio de mensajes.**git stash list**
: Con finalidad de poder de poder visualizar la lista de los cambios guardados con el comandogit stash
podemos ejecutar el comandogit stash list
.git stash branch <new-branch>
: Con este comando podremos crear una rama nueva y aplicar de manera inmediatamente elstash
mas reciente.**git stash branch <new-branch> stash@{<num_stash>}**
: Crea una rama nueva y aplica de manera inmediata unstash
especificado.
git stash drop
: Con el comandogit stash drop
se eliminará el ultimostash
añadido.**git stash drop stash@{<num_stash>}**
: Si conoce el índice especifico delstash
que desea eliminar lo puede hacer este comando.**git stash clear**
: Por otro lado, si desea eliminar todos elementos enstashed
puede ejecutar el comandogit stash clear
.
**git stash pop**
: Al hacerpop
delstash
, se eliminan los cambios de este y se vuelven a aplicar en el código (branch
) en el que estás trabajando.git stash pop stash@{<num_stash>}
: Si desea aplicar los cambios de unstash
especifico debe conocer el índice delstash
y ejecutar el comando.
**git stash apply**
: El comandogit stash apply
aplicara en elbranch
en el cual se encuentre elHEAD
los cambios realizados en el ultimostash
. Sin embargo, no lo eliminara delstash
.git stash apply stash@{<num_stash>}
: Si desea aplicar los cambios de unstash
especifico y mantenerlo almacenado, debe conocer el índice delstash
y ejecutar el comando.
Consideraciones, Primero, el cambio más reciente al crear un stash
siempre recibirá el valor 0, aquellos archivos que se encontraban aumentaran su valor en una unidad. Segundo , git stash
solo tomara aquellos archivos que sean tracked
, si desea agregar un archivo nuevo primero deberá añadirlo al Staging Area
con git add
. Tercero, Al aplicar un stash
este no se elimina, se considera una buena práctica eliminarlo.
Git Clean
El comando git clean
opera en archivos sin seguimiento. Los archivos sin seguimiento son archivos que se han creado en el directorio de trabajo del repositorio, pero que no se han añadido al índice de seguimiento del repositorio con git add
.
**git clean -n**
: La opción--dry-run
realizará una ejecución de prueba (dry run
) degit clean
. Así se mostrará qué archivos se eliminarán sin eliminarlos realmente (Buena practica).**git clean -f**
: La opción-f or --force
inicia la eliminación real de archivos sin seguimiento del directorio actual.
Git cherry-pick
(mala practica)
git cherry-pick
es un potente comando que permite que las confirmaciones arbitrarias de Git se elijan por referencia y se añadan al actual HEAD
de trabajo. La ejecución de cherry-pick
es el acto de elegir una confirmación de una rama y aplicarla a otra.
git cherry-pick <hash>
:git cherry-pick
es una herramienta útil, pero no siempre es una práctica recomendada.
git commit --amend
El comando git commit --amend
es una manera práctica de modificar el commit
más reciente. Te permite combinar los cambios preparados con el commit
anterior en lugar de crear un commit
nuevo. También puede usarse para editar el anterior mensaje del commit
sin cambiar la instantánea. Sin embargo, el comando no se limita a alterar el commit
más reciente, sino que lo reemplaza por completo, por lo que el commit
corregido será una entidad nueva con su propia referencia.
Git nunca olvida, git reflog
Git realiza el seguimiento de las actualizaciones en el extremo de las ramas a través de un mecanismo denominado registros de referencias o “reflogs”. Muchos de los comandos de Git aceptan un parámetro para especificar una referencia o “ref”, que es un puntero a una confirmación. A través de este comando, podremos usar el comando git reset --hard <hash>
y restablecer el repositorio local a un commit
especifico aunque este haya sido eliminado.
Búsqueda especifica en archivos y commit
**git grep "<search-pattern>"**
: Busca por patrones específicos en lostracked files
.**git grep -n "<search-pattern>"
😗* Con la opción-n or -line-number
el comandogit grep
especifica en que línea del archivo se encuentra el patrón especificado.**git grep -c "<search-pattern>"
😗* Con la opción-c or -count
en lugar de mostrar las líneas coincidentes con el patrón especificado, muestra el numero de líneas que coinciden.
**git log -S "<search-pattern>"
😗* Con la opción-S
del comandogit log
se desplegaran loscommits
los cuales contengan el patrón de búsqueda especificado.
Comandos y recursos colaborativos
git shortlog
: Elgit shortlog
comando es una versión especial degit log
diseñado para crear anuncios de lanzamiento. Agrupa cada confirmación por autor y muestra la primera línea de cada mensaje de confirmación. Esta es una manera fácil de ver quién ha estado trabajando en qué.
Mary (2):
Fix a bug in the feature
Fix a serious security hole in our framework
John (3):
Add the initial code base
Add a new feature
Merge branch 'feature'
- **
git shortlog -s
**Con la opción-s or --summary
el comandogit shortlog
suprime la descripción de las confirmaciones realizadas por cada colaborador y proporciona solo un resumen del recuento de las confirmaciones. git shortlog -n
: Con la opción-n or --numbered
el comandogit shortlog
ordene la salida de acuerdo con el número de confirmaciones por autor en lugar del orden alfabético del autor.git shortlog --all
: Con la opción--all
el comandogit shortlog
muestra todas las confirmaciones realizadas por los colaboradores, incluso las confirmaciones eliminadas.git shortlog --no-merge
: Con la opción--no-merge
el comandogit shortlog
solo imprimirá las confirmaciones que tengan un solo padre. Esto es exactamente lo mismo que la opción--max-parents = 1
.git blame <file-name>
: Muestra cual autor fue el ultimo en modificar cada línea de un archivo especificogit blame <file-name> -L <start>,<end>
: Con la opción-L
el comandogit blame
muestra cual autor fue el ultimo en modificar cada línea de una archivo especifico en un rango especificado.
Espero te sirvan, deja un comentario si deseas! 💚💚
Curso Profesional de Git y GitHub