2

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 鈥渁 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 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**聽o聽git 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>聽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> [email protected]{<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 [email protected]{<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 [email protected]{<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 [email protected]{<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 鈥渞eflogs鈥. Muchos de los comandos de Git aceptan un par谩metro para especificar una referencia o 鈥渞ef鈥, 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
1

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