Saltar a contenido

Comandos de git

Esta sección describe algunos de los comandos más interesantes de git

Git stash (reserva)

La orden git stash nos permite salvar momentáneamente el espacio de trabajo cuando tenemos que cambiar de rama o preparar la rama actual para sincronizar cambios.

Las operaciones más importantes que podemos hacer con git stash son:

git stash save

Es equivalente a poner solo git stash pero nos permite realizar más acciones como:

git stash save "Tu mensaje"
git stash save -u

El parámetro -u permite que se almacen también los ficheros sin seguimiento previo (untracked en inglés, aquellos ficheros que no se han metido nunca en el repositorio).

git stash list

Permite mostrar la pila del stash.

$ git stash list
stash@{0}: On main: Stash con mensaje
stash@{1}: WIP on main: 4ab21df First commit

git stash apply

Esta orden coge el stash que está arriba en la pila y lo aplica al espacio de trabajo actual. En este caso siempre es stash@{0}. El stash permanece en la pila.

Se puede indicar como parámetro un stash en concreto.

git stash pop

Funciona igual que git apply con la diferencia de que el stash sí se borra de la pila.

git stash show

Muestra un resumen de los ficheros que se han modificado en ese stash.

$ git stash show
A.txt | 1 +
B.txt | 3 +++
2 file changed, 4 insertions(+)

Para ver los cambios podemos usar el parámetro -p

$ git stash show -p
--- a/A.txt
+++ b/A.txt
@@ -45,6 +45,7 @@ nav:
+ This is a change

Por defecto siempre muestra la cabeza de la pila. Igual que en casos anteriores podemos indicar un stash en concreto.

$ git stash show stash@{1}

git stash branch

Permite crear una nueva rama a partir del último stash. Además, el mismo es borrado de la pila. Se puede especificar uno en concreto si lo queremos, como en el resto de comandos.

git stash branch nombre-de-nueva-rama stash@{1}

git stash clear

Este comando borrar todos los stash de la pila. Es destructiva y no se puede deshacer.

git stash drop

Permite borrar un stash en concreto (o el último si no se indica ninguno). Como con clear, borrarlo implica que no se puede recuperar.

Git worktree

Uno de los problemas más habituales es tener que tocar una rama distinta a la que tenemos actualmente. Eso implica que si estamos en medio de un trabajo tendríamos que hacer un commit o un stash, lo cual a veces es bastante molesto.

Con git worktree podemos crear un directorio de trabajo que contenga otra rama distinta, de forma temporal. No supone otro clon del repositorio porque ambos usan el mismo.

git worktree add

Esta función es la que crea el espacio de trabajo temporal. Imaginemos que estamos en una rama llamada develop:

$ git worktree add ../project-main main
$ git worktree add -b fix ../project-fix main

La primera orden crea un directorio llamado project-main que contiene el estado de main. La segunda, que contiene el parámetro -b equivale a crear una nueva rama llamada fix, que se crea desde main (suponemos que no existe fix).

git worktree list

Muestra el listado de directorios y espacios de trabajo.

$git worktree list
/home/sergio/taller-de-git  3b63b4b [main]
/home/sergio/fix           3b63b4b [fix]

git worktree remove

Borrar un espacio de trabajo. Hay que indicar el nombre entre corchetes que aparece en el listado

$ git worktree delete fix

git worktree prune

Una cuestión importante, es que las ramas que estén desplegadas en otro espacio de trabajo, se encuentran bloqueadas y no se pueden desbloquear en otro distinto.

Esto significa que si estamos trabajando en la rama developer, creamos otro worktree en otro directorio de la rama main, no podemos hacer pasar a main. No es posible tener la misma rama en varios espacios de trabajo.

Si se ha borrado el directorio a mano (en vez de usando remove), eso no implica que el bloqueo desparezca. Con esta orden podemos hacer que git compruebe que los espacios de trabajo secundario se comprueben de nuevo para ver si siguen existiendo y se elimine el bloqueo.

Git blame

Lo ideal en un equipo de desarrollo es que el código pase por todas las manos para así mejorar su calidad.

Con git blame podemos saber quién fue el último en modificar una línea concreta de código, en qué commit y en qué fecha lo hizo.

$ git blame ejemplo.php
33cdd02c (Sergio Gómez 2020-01-20 16:58:52 +0100  8)   name: "material"
33cdd02c (Sergio Gómez 2020-01-20 16:58:52 +0100  9)   language: "es"