¡Apuntes para el Curso Profesional de Git y GitHub 💾💚💻! Notion: https://enchanting-digit-d82.notion.site/Curso-Profesional-de-Git-y-GitHub-30c863cffd264452baca02b1215fd0a7
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 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 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.
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]
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.
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:wqEnter
git log [filename]
: El comandogit log
muestra una lista de todas las confirmaciones realizadas en un repositorio para un archivo en especifico.
**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 Areagit 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”.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 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/
git
git checkout
: En términos de Git, “checkout
” (extraer) es el acto de cambiar entre diferentes versiones de una entidad objetivo.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.
--cached
le permite eliminar un archivo de un repositorio de Git sin eliminarlo en su sistema de archivos.--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
.
--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.--hard
borra 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.
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.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.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
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
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.
Se debe guardar la URL del repositorio remoto con el comandogit remote
.
git remote add origin <URL>
Verificar la validez de la URL introducida en el paso anterior a través del comandogit remote
.
git remote
git remote -v
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
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
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.
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>
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.
commit
: git tag -a <name-tag> <id-commit>
.git tag -d <name-tag>
.**git tag
** o git show-ref --tags
.git push origin --tags
.git tag -d <name-tag>
y git push origin :refs/tags/<name-tag>
.**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.
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.
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.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.
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
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.
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.
git stash
**git stash**
: El comando git 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 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 stash
especificado.git stash drop
: Con el comando git stash drop
se eliminará el ultimostash
añ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 stashed
puede 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 stash
especifico 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 commit
más reciente. Te permite combinar los cambios preparados con el commit
anterior en lugar de crear uncommit
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 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 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.
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.git shortlog
: El git shortlog
comando 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 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! 💚💚
Wow, que increíble tutorial sobre Git, me encantó la parte de los Git Tags
Qué es branch
Muchas gracias por tus apuntes, me han ayudado para repasar y reforzar los conocimientos vistos en el curso 😄