00:00:00Bienvenidos. Haré una demostración rápida por si no conocen Git Butler. Git Butler es una nueva herramienta de control de versiones
00:00:07en la que hemos trabajado un par de años. Le hemos robado un montón de porquerías a JJ.
00:00:10Así que, si usan Jujutsu, les hemos quitado muchísimas cosas.
00:00:16En fin, si no han usado Git Butler, es una herramienta de control de versiones.
00:00:19Generalmente es una interfaz gráfica (GUI),
00:00:21pero estamos trabajando en una CLI y quería mostrarles algo de eso, ya que todos trabajan con Git y
00:00:26Git tiene una interfaz de comandos interesante y...
00:00:29tenemos algunos conceptos que también robamos de Jujutsu.
00:00:33Pero hay cosas nuevas que creo que son bastante geniales.
00:00:36Quería mostrárselas para obtener algunas ideas sobre qué cosas serían súper interesantes.
00:00:40Así que bien, repasaré estos puntos.
00:00:43Entonces...
00:00:46Hay un par de cosas. La herramienta de línea de comandos se llama "but".
00:00:49Como he estado contando chistes de papás, siento que el nombre es algo apropiado.
00:00:52Pueden ejecutar "but status". Es algo así como un registro (log) corto.
00:00:57Si han usado Sapling o Jujutsu y ejecutan el log,
00:01:00verán los archivos modificados en el disco.
00:01:05Desde su directorio de trabajo respecto a la rama de destino.
00:01:08Pero también mostraremos los commits que tienen, ¿vale?
00:01:11También pueden poner "but status -F" y mostrará los archivos modificados en cada commit.
00:01:18Si ejecutan la GUI de Git Butler, pueden ver sus carriles (lanes) y cosas así.
00:01:23Pero hay muchas cosas geniales en Git Butler que Git no puede hacer. Por ejemplo, este log corto...
00:01:29...tan agradable.
00:01:30Y, ya saben,
00:01:32podemos generar un log general que indique si los commits son locales o no; es similar a un "shortlog"
00:01:39en cualquier otra herramienta. Y podemos crear nuevas ramas.
00:01:40Si pido el "status", puedo ver... estoy haciendo un clon de Twitter aquí.
00:01:44Tengo un par de ramas, una apilada sobre la otra.
00:01:50Esto es algo que Git puede hacer si usas "update-ref"
00:01:52adecuadamente; eso reescribirá tus referencias al hacer un rebase o algo parecido.
00:01:56Pero nosotros lo hacemos de forma más natural, ¿cierto?
00:02:00Actualizamos automáticamente tus referencias y, si cambias algo, el rebase hará el seguimiento.
00:02:03Pero también podemos manejar
00:02:09ramas paralelas; podemos tener más de una rama aplicada a la vez. Lo que haré aquí... oh,
00:02:11es crear una rama nueva y
00:02:23ejecutarlo de nuevo. Tengo esta nueva rama paralela a las otras en las que trabajo, ¿ven?
00:02:26Y lo que puedo hacer es entrar en esa rama y empezar a asignar y confirmar (commit) cosas.
00:02:33Eso lo veremos a continuación.
00:02:39Otra cosa genial que podemos hacer es tener múltiples áreas de preparación (staging areas).
00:02:41Cada pila que tienes tiene su propia área de preparación, así que puedes usar...
00:02:45"rub". "rub" es el comando. Puedes decir algo como "rub KU" para este archivo, ¿ven? Y decir: ponlo en "ZA".
00:02:51Y se asigna a esa área de preparación específica. Si quisiera asignar algo a esto...
00:02:58te da estos códigos cortos, ¿ven? Así que puedes decir: vale,
00:03:04este se asigna aquí y este otro allá.
00:03:12Y si los confirmo, puedo hacer el commit en cualquiera de estas ramas al mismo tiempo.
00:03:15Veamos esto. Vemos que está confirmado o asignado aquí, así que puedo decir:
00:03:21"but commit -o"
00:03:27y se confirma aquí, ¿lo ven?
00:03:30Ahora este archivo está en este commit. Y lo bueno es que todo esto sigue siendo Git, así que puedo decir
00:03:40esto...
00:03:48y realmente crea un commit de Git. Puedo empujar (push) esa rama y demás.
00:03:50Pero...
00:03:57sí, puedo asignar a ramas o simplemente usar "but commit" y hará el commit de todo lo no asignado a la rama
00:03:59que sea el objetivo. Puedo elegir a qué rama quiero confirmar las cosas nuevas.
00:04:07Se nos ocurrió este término llamado "rubbing" (frotar/mezclar).
00:04:11Le he hablado a varios sobre Caleb, que ha estado bebiendo toda la noche y no está aquí.
00:04:14Si entra ahora, todos deberíamos levantarnos y darle un aplauso.
00:04:18Pero a él se le ocurrió este término, "rubbing", que es básicamente tomar dos cosas, juntarlas y ver qué sale.
00:04:21Si han jugado Minecraft o algo así y conocen la mesa de crafteo,
00:04:28ya conocen el concepto:
00:04:32tomas esto y aquello, lo juntas y creas algo nuevo y más interesante, ¿verdad?
00:04:34Hay muchísimas cosas que puedes hacer con la CLI de "but" para mezclar cosas con "but rub".
00:04:38Mostraré un par de cosas distintas: podemos asignar contenido, como ya mostré, puedes asignar un archivo
00:04:45modificado o sin confirmar a una rama, pero también puedes desasignar. Hay un modo especial, "00",
00:04:52donde puedo decir "but rub"...
00:05:01por ejemplo, todo este commit a "00".
00:05:05Y eso deshace el commit, ¿ven? Básicamente hace un "reset soft"
00:05:07de ese commit. También puedo enmendar (amend) cosas, puedo decir "rub le r"...
00:05:11y...
00:05:17Vaya, necesito mis gafas de lectura. Ya estoy bastante viejo.
00:05:24A "SW", que es nuestro... perdón, en realidad a
00:05:27"11W". Hagamos ese.
00:05:32¿Es "IW"? Gracias.
00:05:35¡Ups!
00:05:38¿Es eso una "I"?
00:05:41Lo siento.
00:05:44Y...
00:05:48lo confirma ahí. Puedo hacer
00:06:02"rub I"...
00:06:04¿puedo deshacer commits?
00:06:10Sí, puedo aplastar (squash) cosas. Si quiero juntar este commit y este otro, uso "but rub"
00:06:14"J e GE"
00:06:16y aplasta esos commits. Puedo deshacer commits, mover cosas...
00:06:22básicamente lo que creas que pasaría al combinar dos cosas.
00:06:25Hará eso, y si combinas algo con los cambios no asignados, básicamente lo deshará, ¿cierto?
00:06:32Incluso puedes... no recuerdo si esto funciona realmente o no...
00:06:37también puedes mover archivos, así que...
00:06:42"J 8 2"
00:06:48Y...
00:06:53básicamente toma el archivo de ese commit y luego
00:07:02lo deshace de ese commit y lo mueve al commit de abajo, ¿ven?
00:07:03Lo interesante no es que sea imposible en Git, sino que es relativamente difícil de hacer.
00:07:07Mover archivos entre commits o enmendar un archivo en un commit de tres niveles más abajo...
00:07:11se puede hacer en Git, como con un
00:07:19commit temporal de "fixup" y un "autosquash" o algo así.
00:07:27Pero es muy agradable poder simplemente "frotar" las cosas y mover el contenido a donde quieras
00:07:31y tener múltiples ramas simultáneamente.
00:07:34Otra cosa que puedes hacer es dividir commits con relativa facilidad. También tenemos este comando "but new".
00:07:40Si quisiera decir...
00:07:43"but new"
00:07:51"H e", entonces
00:07:54creará un nuevo commit en blanco que no tiene nada.
00:07:56Exacto. Es al estilo de Jujutsu, donde puedes crear un commit nuevo vacío.
00:07:59Y luego puedo "frotar" archivos en él si quisiera. Podría decir:
00:08:03Toma este archivo.
00:08:08Cero.
00:08:12Tomo...
00:08:15Mueve este archivo a este nuevo commit y luego puedo decir "describe".
00:08:23¿Qué era eso? "X y c".
00:08:29¿Cómo podría...?
00:08:32"status -F". Muestra los archivos en cada commit en lugar de... o sea, "but ST".
00:08:45"but status" solo te muestra los commits y
00:08:56"but status -F" muestra los archivos dentro de cada uno, para poder moverlos con el "rubbing".
00:09:02Bien, tenemos "new" y "describe", y lo último es "marking" (marcar); esto también es muy al estilo JJ.
00:09:04Si alguien usa Jujutsu, sabe que puedes marcar un commit como objetivo (target).
00:09:11Entonces, todo lo que vea lo pondrá en ese commit. Puedes marcar...
00:09:16es algo bastante interesante, la verdad. Puedo decir:
00:09:21"but new -M" o puedo marcar directamente diciendo "but mark"
00:09:25"Z a" y...
00:09:29marcará esto. Pueden ver que ya tomó lo que no estaba confirmado y lo puso en ese
00:09:33carril (lane) y...
00:09:35luego puedo confirmar cosas o también marcar
00:09:42un commit específico.
00:09:44Oh, eso es una rama, lo siento.
00:09:47Así que marca un commit específico y luego, si hago algo como "echo new"...
00:09:56entonces lo toma y lo confirma automáticamente en ese commit, ¿ven?
00:09:58Esto es interesante porque es una rama apilada con varios commits, y cualquier cosa que haga ahora
00:10:07está enmendando automáticamente un commit tres niveles abajo en la pila, ¿vale?
00:10:15Es como lo hace JJ cuando usas "JJ new" y empiezas a trabajar:
00:10:21simplemente enmienda automáticamente el último commit que hiciste,
00:10:26excepto que aquí puedes marcar básicamente cualquier commit y
00:10:31seguir trabajando, y el sistema intentará aplicarlo a ese commit hasta que lo desmarques.
00:10:33¿Vale?
00:10:36En fin, estas son algunas de las cosas divertidas en las que trabajamos.
00:10:41Me parece muy agradable poder trabajar de esta manera.
00:10:44Lo otro que hacemos, también robado de JJ, es un "oplog" (registro de operaciones).
00:10:48Esto es algo que tenemos desde hace tiempo.
00:10:52Si han usado Git Butler, hay una pestaña que dice "estas son todas las operaciones que realizamos".
00:10:56Cada vez que ejecuto algo, se crea un historial de operaciones
00:10:59y puedo ver todo lo que Git Butler ha hecho y restaurar cualquiera de ellas o decir
00:11:03algo como...
00:11:06"undo".
00:11:12Ups, si lo escribo bien... puedo decir "undo" y deshace la operación, devolviendo mi directorio y mi estado
00:11:13a como estaban antes. O puedo decir
00:11:14"restore"
00:11:20a cualquiera de estos hashes (shas).
00:11:22¡Upsie!
00:11:24Y...
00:11:26restablece mi directorio de trabajo, mis ramas y todo lo que tenía a su estado anterior.
00:11:29Esto es interesante para hacer una demo, porque puedo crear un escenario
00:11:33que sé que funciona y luego restaurarlo para empezar el escenario de nuevo.
00:11:38Pero obviamente es genial poder decir: "¿sabes qué? En realidad no quería hacer eso" o si me metí en un
00:11:44área de conflicto o lo que sea. Solo lo deshaces y sigues trabajando.
00:11:50Y eso es todo. Ah, y lo otro es que todos los comandos tienen salida JSON, así que puedes usar "but -J"
00:11:54o "--json" con cualquier comando y te dará los mismos datos, pero en formato JSON.
00:11:58Si quieres automatizar algo con scripts, es mucho mejor que lidiar con la salida "porcelain" de Git.
00:12:06Puedes procesarlo con "jq" para buscar una entrada específica o algo así y
00:12:11poder programar scripts para la CLI de forma mucho más limpia.
00:12:15Eso es todo. Muchas gracias.
00:12:21Y poder automatizar la CLI con scripts de forma un poco más limpia.
00:12:24Eso es todo. Muchas gracias.