¡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 addagrega archivos nuevos o modificados en su directorio de trabajo al área de preparación de Git.git addes un comando importante; sin él, ningúngit commitharía nada. A veces,git addpuede tener la reputación de ser un paso innecesario en el desarrollo. Pero en realidad,git addes una herramienta importante y poderosa.git addte 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 statussolo genera información, no modifica las confirmaciones ni los cambios en su repositorio local. Una característica útil degit statuses que proporcionará información útil según su situación actual.**git show <file>**: El comandogit showmuestro todos los cambios realizados en la ultima confirmación realizada a ese archivo.**git diff <file>**: El comandogit diffmuestra las diferencias entre la versión del archivo en el Working Directory y el Staging Areagit diff <HASH> <HASH>: El comandogit diffal introducir el respectivoHASHde 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 --remotesel comandogit branchenumera las ramas de seguimiento remoto.**git branch -a😗* Con la opción-a or --allel comandogit branchenumera 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 mergepermite tomar las líneas independientes de desarrollo creadas porgit brancheintegrarlas 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 rmelimina 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
--cachedle permite eliminar un archivo de un repositorio de Git sin eliminarlo en su sistema de archivos. - La opción
--forcepermite 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 resetes 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,--mixedy--hard.- Con la opción
--softborramos 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
--hardborra 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 addygit commit, el comandogit pushmandara los cambios realizados al repositorio remoto.

git merge: La fusióngit mergees la forma en que tiene Git vuelve a unir un historial bifurcado. El comandogit mergepermite tomar las líneas independientes de desarrollo creadas porgit branche integrarlas en una sola rama.git pull: El comandogit pullejecuta en primer lugargit fetch, que descarga el contenido del repositorio remoto especificado. Después, se ejecutagit mergepara 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
mergepara crear uncommitcon los archivos de ambos repositorios. Es posible hacer uso degit fetchygit mergeo 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 pushpara 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 branchygit 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.gitignoregeneralmente 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 stashalmacena 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 stashpodemos ejecutar el comandogit stash list.git stash branch <new-branch>: Con este comando podremos crear una rama nueva y aplicar de manera inmediatamente elstashmas reciente.**git stash branch <new-branch> stash@{<num_stash>}**: Crea una rama nueva y aplica de manera inmediata unstashespecificado.
git stash drop: Con el comandogit stash dropse eliminará el ultimostashañadido.**git stash drop stash@{<num_stash>}**: Si conoce el índice especifico delstashque desea eliminar lo puede hacer este comando.**git stash clear**: Por otro lado, si desea eliminar todos elementos enstashedpuede ejecutar el comandogit stash clear.
**git stash pop**: Al hacerpopdelstash, 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 unstashespecifico debe conocer el índice delstashy ejecutar el comando.
**git stash apply**: El comandogit stash applyaplicara en elbranchen el cual se encuentre elHEADlos cambios realizados en el ultimostash. Sin embargo, no lo eliminara delstash.git stash apply stash@{<num_stash>}: Si desea aplicar los cambios de unstashespecifico y mantenerlo almacenado, debe conocer el índice delstashy 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-runrealizará 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 --forceinicia 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-pickes 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-numberel comandogit grepespecifica en que línea del archivo se encuentra el patrón especificado.**git grep -c "<search-pattern>"😗* Con la opción-c or -counten 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-Sdel comandogit logse desplegaran loscommitslos cuales contengan el patrón de búsqueda especificado.
Comandos y recursos colaborativos
git shortlog: Elgit shortlogcomando es una versión especial degit logdiseñ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 --summaryel comandogit shortlogsuprime 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 --numberedel comandogit shortlogordene 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--allel comandogit shortlogmuestra todas las confirmaciones realizadas por los colaboradores, incluso las confirmaciones eliminadas.git shortlog --no-merge: Con la opción--no-mergeel comandogit shortlogsolo 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-Lel comandogit blamemuestra 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
COMPARTE ESTE ARTÍCULO Y MUESTRA LO QUE APRENDISTE



