Git worktree: trabajar en dos ramas sin interrumpir lo que estamos haciendo

Estamos a medias con un cambio y aparece un error que hay que corregir en otra rama. Si cambiamos de rama en la misma carpeta, Git puede pedirnos que guardemos o apartemos lo que teníamos sin terminar. Con git worktree podemos abrir una segunda carpeta del mismo repositorio y dejar la primera tal como está.

Crear una segunda carpeta de trabajo

Nos situamos en la carpeta del proyecto y comprobamos en qué rama estamos. En este ejemplo la carpeta se llama proyecto y la nueva quedará al lado, como proyecto-arreglo:

git status
git branch --show-current
git worktree add -b arreglo-urgente ../proyecto-arreglo HEAD

La opción -b crea la rama arreglo-urgente; ../proyecto-arreglo es la carpeta nueva y HEAD indica que parte del último commit de la rama actual. Si el arreglo debe partir de main y estamos en otra rama, cambiamos HEAD por main. Conviene comprobarlo antes: los cambios que aún no hemos guardado en un commit no aparecen por arte de magia en la carpeta nueva.

Entramos en ella y trabajamos con normalidad. También podemos lanzar comandos desde la carpeta original con git -C:

git -C ../proyecto-arreglo status
git -C ../proyecto-arreglo branch --show-current
git worktree list

git worktree list muestra las dos rutas y la rama activa en cada una. Podemos tener el editor abierto en ambas, pero cada carpeta tiene sus propios archivos de trabajo y su propio índice de Git. La historia y las ramas pertenecen al mismo repositorio: un commit hecho en arreglo-urgente queda disponible desde la carpeta original, aunque no modifica por sí solo los archivos que allí tenemos abiertos.

Qué comparte y qué no comparte

Esto no equivale a clonar el proyecto otra vez. Git comparte sus objetos y referencias, mientras cada worktree conserva su copia de los archivos y su rama activa. Por eso no nos dejará tener normalmente la misma rama abierta en las dos carpetas: evita que editemos la misma rama desde dos sitios sin darnos cuenta.

Esquema de dos carpetas Git worktree que comparten historial y ramas, pero mantienen archivos e índice separados
Las dos carpetas comparten el historial de Git, pero cada una conserva sus archivos y cambios sin guardar.

Lo que no está versionado tampoco se duplica automáticamente. Si el proyecto necesita un .env, dependencias instaladas o una base de datos local, habrá que prepararlos en la segunda carpeta según el proyecto. Y una segunda carpeta no aísla servicios: si ambas aplicaciones apuntan a la misma base de datos o intentan escuchar en el mismo puerto, pueden molestarse entre sí.

Volver a una sola carpeta

Cuando terminemos el arreglo, guardamos los cambios en un commit y lo incorporamos a la rama que corresponda con el flujo habitual del proyecto. Después revisamos que no quede nada sin guardar en proyecto-arreglo y retiramos sólo ese worktree:

git -C ../proyecto-arreglo status
git worktree remove ../proyecto-arreglo
git worktree list

El comando remove se niega a borrar una carpeta con cambios pendientes; no añadimos --force para quitarnos el aviso. Retirar el worktree tampoco borra la rama. Si queremos eliminarla, primero verificamos que el cambio se haya integrado y luego decidimos si procede hacerlo.

La documentación de Git recoge más opciones, como abrir una rama que ya existe o mover un worktree. Para una interrupción puntual, con add, list y remove suele bastar. Y si estamos empezando con Git, antes podemos ver cómo subir nuestro primer proyecto a GitHub.

Si os ha salvado de apartar un cambio a medias, contadnos en qué proyecto lo habéis usado.

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *