3

Notas para el Curso Profesional de Git y GitHub 💾💚💻

¡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 [email protected]

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.
https://s3-us-west-2.amazonaws.com/secure.notion-static.com/c3741a3c-a9d2-4edd-bb4a-750c6a1cd9b1/Untitled.png

Etapas de los archivos en git

Ctrl + o
Enter
Ctrl +x
Esc:wqEnter

git log [filename]: El comandogit 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 de git 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 Area
    • git diff <HASH> <HASH>: El comandogit diff al introducir el respectivo HASH 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 comando git merge permite tomar las líneas independientes de desarrollo creadas por git brancheintegrarlas en una sola rama.

Metodología para el manejo estándar de las ramas en githttps://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--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).
  • 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--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.

**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 con git add y git commit, el comando git push mandara los cambios realizados al repositorio remoto.
https://s3-us-west-2.amazonaws.com/secure.notion-static.com/c0e94d3d-6cee-4c1a-afa1-2fb55cd59303/Untitled.png
  • git merge: La fusióngit merge es la forma en que tiene Git vuelve a unir un historial bifurcado. El comando git merge permite tomar las líneas independientes de desarrollo creadas por git branch e integrarlas en una sola rama.
  • git pull: El comandogit pull ejecuta en primer lugar git fetch, que descarga el contenido del repositorio remoto especificado. Después, se ejecuta git 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 comandogit 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 comandogit remote remove origin, el cual elimina la conexión con el repositorio remoto (origin) establecida en el primer paso.

  1. Se debe guardar la URL del repositorio remoto con el comandogit remote.

    git remote add origin <URL>
    
  2. Verificar la validez de la URL introducida en el paso anterior a través del comandogit remote.

    git remote
    git remote -v
    
  3. Se deben extraer los archivos del repositorio remoto y posteriormente hacer un merge para crear un commit con los archivos de ambos repositorios. Es posible hacer uso de git fetch y git merge o simplemente escribir el comandogit pull con el flag --allow-unrelated-histories.

    git pull origin master --allow-unrelated-histories
    
  4. Por ultimo, se procede a hacer un git push para guardar los cambios del repositorio local en el repositorio remoto

    git push origin master
    

Recuerda que antes de hacerpush a tu repositorio remoto es una buen practica hacer ungit 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.

https://s3-us-west-2.amazonaws.com/secure.notion-static.com/ccb5047c-32d4-40a9-825f-6303ee7fa611/Untitled.png

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 "[email protected]"

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 commitgit tag -a <name-tag> <id-commit>.
  • Borrar un tag en el repositorio localgit tag -d <name-tag>.
  • Listar los tags de nuestro repositorio local**git tag** o git show-ref --tags.
  • Publicar un tag en el repositorio remotogit push origin --tags.
  • Borrar un tag del repositorio remotogit tag -d <name-tag> y git 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 y git 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

https://s3-us-west-2.amazonaws.com/secure.notion-static.com/4f8906b0-4094-4fcd-be29-4c6743835051/Untitled.png

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.

https://wac-cdn.atlassian.com/dam/jcr:4e576671-1b7f-43db-afb5-cf8db8df8e4a/01%20What%20is%20git%20rebase.svg?cdnVersion=1717
# 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 stashalmacena 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.

https://s3-us-west-2.amazonaws.com/secure.notion-static.com/ac9678df-db33-433e-9b91-68cc93921c3b/Untitled.png

Comandos útiles para la utilización de git stash

  • **git stash**: El comando git 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 de stash, 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 comando git 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 el stash mas reciente.
      • **git stash branch <new-branch> stash@{<num_stash>}**: Crea una rama nueva y aplica de manera inmediata un stashespecificado.
    • git stash drop: Con el comando git stash drop se eliminará el ultimostashañadido.
      • **git stash drop stash@{<num_stash>}**: Si conoce el índice especifico del stash que desea eliminar lo puede hacer este comando.
      • **git stash clear**: Por otro lado, si desea eliminar todos elementos en stashedpuede ejecutar el comandogit stash clear.
  • **git stash pop**: Al hacer pop del stash, 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 un stash especifico debe conocer el índice del stash y ejecutar el comando.
  • **git stash apply**: El comandogit stash apply aplicara en el branch en el cual se encuentre el HEAD los cambios realizados en el ultimostash. Sin embargo, no lo eliminara del stash.
    • git stash apply stash@{<num_stash>}: Si desea aplicar los cambios de un stashespecifico y mantenerlo almacenado, debe conocer el índice del stash 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 seantracked, 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) de git 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 actualHEAD de trabajo. La ejecución decherry-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 commitmás reciente. Te permite combinar los cambios preparados con el commitanterior en lugar de crear uncommitnuevo. 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 elcommit 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 comandogit 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 los tracked 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: El git shortlogcomando es una versión especial de git 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 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 --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 especifico
    • git 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! 💚💚

Escribe tu comentario
+ 2
Ordenar por:
1
4 años

Muchas gracias por tus apuntes, me han ayudado para repasar y reforzar los conocimientos vistos en el curso 😄