La CLI de GitButler: Scott Chacon, GitButler

GGitButler
Computing/SoftwareSmall Business/StartupsInternet Technology

Transcript

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.

Description

GitButler's CEO (and GitHub cofounder) Scott Chacon talks about the upcoming GitButler command line interface and the very cool things that it can do, including easy amending, splitting, using multiple staging areas, having stacked and parallel branches and more.

Community Posts

View all posts