📝 Git Tips es un listado de casos de uso, ejemplos y consejos prácticos y fáciles de entender sobre Git y Gitflow.
Git fue diseñado por Linus Torvalds y creado pensando en la eficiencia y la confiabilidad del mantenimiento de versiones de aplicaciones cuando estas tienen un gran número de archivos de código fuente.
Git nos permite trabajar en proyectos de software independientemente del lenguaje que utilicemos y del número de personas que trabajen en él. Podrás gestionar todos los estados de progresión de cada proyecto creando ramas para desarrollar nuevas características concretas para la resolución de bugs, para desplegar en entornos concretos entre otras tareas.
Por otro lado, Gitflow no es más que una guía o workflow introducido por Vincent Driessen con el que conseguimos estandarizar el flujo de trabajo dentro del proyecto y del equipo y de esta forma poder trabajar de forma ordenada según el tipo de tarea que estemos llevando a cabo en nuestro proyecto y podemos clasificarlas en ramas principales y ramas de soporte.
Estado 1 -> Working Directory (Directorio de trabajo local)
Estado 2 -> Staging Area (Area de preparación local)
Estado 3 -> Local Repository (Repositorio local o directorio Git)
El flujo de trabajo básico en Git es algo así:
1.- Modificas una serie de archivos en tu directorio de trabajo.
2.- Preparas los archivos, añadiéndolos a tu área de preparación.
3.- Confirmas los cambios, lo que toma los archivos tal y como están en el área de preparación y almacena esa copia instantánea de manera permanente en tu directorio de Git.
Es importante que accedas y te leas detenidamente la información de Fundamentos de Git antes de comenzar a realizar todos los casos de uso que verás a continuación.
Configura un nombre de usuario:
git config --global user.name "JoseJPR"
Configura un email:
git config --global user.email "me@josejpr.com"
Muestra la configuración de tu git:
git config --list
Inicias un repositorio local:
git init
Añade archivos al Estado 2:
git add archivo.txt
Si tenemos dos o mas archivos podemos utilizar el flag --all para añadirlos todos con un solo comando:
git add --all
Muestra que archivos están añadidos al Estado 2 y cuales no:
git status
Imagina que has modificado el archivo.txt (has añadido un "Hola"), podrás revertir estos cambios con (Es igual a git checkout -- archivo.txt):
git restore archivo.txt
Imagina que has creado un repositorio remoto y quieres agregar la referencia al repositorio local:
git remote add origin https://github.com/JoseJPR/practicas-git
Quizas a futuro te sea necesario revisar el listado de los repositorios remotos tienes asignados a tu repositorio local:
git remote -v
Imagina que quieres alojar tu código en el repositorio remoto (siendo master la rama remota):
git push origin master
Imagina que quieres obtener el código desde el repositorio remoto (siendo master la rama remota):
git pull origin master
Ver ramas locales:
git branch
Ver ramas remotas:
git branch -r
Ver ramas locales y remotas:
git branch -a
Imagina que has creado un archivo nuevo llamado "archivo-nuevo.txt" y nunca ha sido añadio al Estado 2.
Elimina ese archivo y todos los que haya en el workspace que no hayan pasado nunca a Estado 2:
git clean -f
Muestra información de los archivo que serán eliminados:
git clean -n
Imagina que tienes el archivo "archivo-test.txt" en Estado 1. Tendrás que realizar un borrado de sistema rm -r (Mac o Ubuntu) del (Win):
rm -r archivo-test.txt
del archivo-test.txt
Imagina que tienes el archivo "archivo-test.txt" en Estado 2. Elimina el archivo del espacio de trabajo y del Estado 2:
git rm -f archivo-test.txt
Imagina que tienes el archivo "archivo-test.txt" en Estado 3. Elimina el archivo del espacio de trabajo, colocará una modificación (archivo eliminado) en el Estado 2 y estará a la espera de ser commiteado este cambio al Estado 3:
git rm archivo-test.txt
Imagina que has eliminado el archivo "archivo-test.txt" que estaba en Estado 2:
git restore archivo-test.txt
Imagina que has eliminado el archivo "archivo-test.txt" que estaba en Estado 3. Recupera el archivo eliminado y lo coloca en Estado 2:
git restore --staged archivo-test.txt
Recupera el archivo eliminado y lo situa de nuevo en Estado 3:
git restore archivo-test.txt
Imagina que necesitas quitar todos los archivos que has añadido al Estado 2 y los restablece al Estado 1:
git reset HEAD
Imagina que tienes que hacer lo anterior pero sólo con el archivo "archivo-test.txt":
git reset HEAD archivo-test.txt
Imagina que quieres volver a un estado anterior teniendo en cuenta un commit concreto.
Visualiza el listado de commits de la rama actual:
git log
Revierte nuestro estado actual al que teníamos en el commit seleccionado:
git revert {id del commit}
Añade todos los archivos revertidos:
git add *
Realizamos un nuevo commit dejando constancia:
git commit -m "Hemos revertido hasta el commit xxx"
Imagina que tenemos dos archivos, uno llamado "archivo-test.txt" y queremos renombrarlo a "archivo-test-2.txt":
git mv archivo-test.txt archivo-test-2.txt
Esto realmente lo que hace es:
mv archivo-test.txt archivo-test-2.txt && git add archivo-test-2.txt && git rm archivo-test.txt
Para mostrar el listado de ramas que tenemos utiliza:
git branch
Para crear una rama utiliza:
git branch nueva-rama
Para eliminar una rama utiliza:
git branch -d nueva-rama
Para modificar el nombre de una rama utiliza:
git branch -m antiguo-nombre-rama nuevo-nombre-rama
Si hacemos git log veremos todos los commits de la rama actual y podremos obtener el identificador de un commit anterior.
Imagina que tienes un commit con identificador "49f3733f9786b8d0a1d88f19ac429164d21e45ff", para viajar a ese commit utiliza:
git checkout 49f3733f9786b8d0a1d88f19ac429164d21e45ff
Imagina que quieres volver al último commit de la rama, utilizaremos la misma sentencia pero añadiendo el nombre de la rama, por ejemplo "main":
git checkout main
Imagina que necesitas moverte desde la rama "main" a la rama "develop":
git checkout develop
Imagina que necesitas crear una nueva rama con el nombre "nueva-rama" y quieres moverte en el mismo comando:
git checkout -b nueva-rama
Imagina que estás trabajando con dos ramas, una "develop" y otra "feature-nuevo" y quieres llevar todos tus cambios desde "feature-nuevo" a la rama "develop".
Tienes que situarte en la rama develop:
$git checkout develop
Tienes que traerte todos los cambios a develop:
git merge feature-nuevo
Imagina que tienes varios cambios que estas realizando en tu rama pero un compañero te comenta que necesita que te cambies de rama para revisarle un desarrollo pero NO quieres realizar commits de tus cambios. Existe algo que se llama stash, una pila de cambios, que puedes utilizar para almacenar temporalmente cambios.
Para almacenar cambios en stash utiliza:
git stash
Para obtener los cambios de la pila, uno a uno utiliza:
git stash pop
Para limpiar todos los cambios que estén en stash utiliza:
git stash clear
Para ver el listado de elementos en stash utiliza:
git stash list
Podemos crear Tags ligeros o tags con metadatos.
Para crear un tag ligero utiliza:
git tag nombre_del_tag
Para crear tags con metadatos añadidos utiliza:
git tag -a v1.0.0 -m "Comentario del TAG"
Para crear tags con metadatos añadidos de un commit concreto utiliza:
git tag -a v1.0.1 -m "Comentario del TAG" 49f3733f9786b8d0a1d88f19ac429164d21e45ff
Para ver el listado de tags utiliza:
git tag
Para moverte a un tag concreto utiliza:
git checkout nombre_del_tag
Para eliminar un tag concreto utiliza:
git tag -d nombre_del_tag
Si necesitas subir un tag a tu repositorio remoto utiliza:
git push origin master --tags
Imagina que necesitas listar los repositorios remotos agregados a tu local:
git remote
Puedes visualizar más información, por ejemplo la url del repositorio remoto utilizando:
git remote -v
Imagina que quieres trabajar con github o gitlab, necesitas asignar un repositorio remoto a tu repositorio local:
git remote add origin https://github.com/JoseJPR/practicas-git
git remote add external https://github.com/JoseJPR/practicas-git-2
Podemos utilizar origin o upstream ya que son convención pero podemo utilizar el nombre local que queramos por ejemplo:
git remote add external https://github.com/JoseJPR/practicas-git
git remote add external https://github.com/JoseJPR/practicas-git-2
Es posible tener dos repositorios remotos asignados a uno local, solo tienes que ejecutar la sentencia git remote add y agregar los dos, uno por cada ejecución de la sentencia, por ejemplo:
git remote add origin https://github.com/JoseJPR/practicas-git
git remote add external https://github.com/JoseJPR/practicas-git-2
Con git fetch puedes actualizar los metadatos de nuestro repositorio en estado 3 origin/x en local y nos descargamos los archivos:
git fetch
Imagina que necesitas obtener los cambios a tu repositorio local en estado 1, tienes que hacer un merge utilizando:
git merge origin/x
Con git pull te ahorras un paso ya que hace los dos en uno, descarga metadatos y archivos y los mergea con nuestra rama local:
git pull
Imagina que has trabajado en tu código, finalizas un feature y quieres alojar lo cambios en el repositorio remoto.
Tienes que agrear los archivos que han sufrido cambios, imagina que ha cambiado el contenido de "archivo-test.txt":
git add archivo-test.txt
git commit -m "Updated archivo 5"
git push
Imagina que necesitas ver las diferencias en el código de un commit concreto con identificador "49f3733f9786b8d0a1d88f19ac429164d21e45ff":
git show 49f3733f9786b8d0a1d88f19ac429164d21e45ff
Imagina que necesitas ver las diferencias en el código de un tag concreto con identificador "v.10.0.0":
git show v.10.0.0
Si quieres ver diferencias entre dos commits utiliza:
git diff 727bcbd6dfe00f623f708faa6f0ea7d9803c1aa7 0beef0be4883917a7f6704d7f1ac8403108a87ab
Imagina que necesitas ver el listado de commits agrupado por usuarios:
git shortlog
Imagina ver un resumen del numero de commit:
git shortlog --summary --numbered
Imagina que quieres ver a que tag corresponde el actual commit:
git describe
El resultado será algo como "v.1.0.0-1-g2b31eb2", "v.1.0.0" es el nombre del tag, "1" es el numero de commit tras la creación del tab "g2b31eb2" es un identificador unico de git.
Imagina que necesitas saber que persona realizó un cambio concreto en un archivo de tu proyecto, en este ejemplo en el archivo "README.md":
git blame README.md
Imagina que solo quieres saber que ocurrio entre dos lineas de un archivo concreto, por ejemplo lineas 1 y 10:
git blame -L 1,10 README.md
Imagina que necesitas encontrar en cuantos archivos existe la palabra "console":
git grep console
Si necesitas ver también la línea en la que existe la palabra:
git grep -n console
Si necesitas ver el número de veces que existe en el proyecto:
git grep -c console