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