A CLI do GitButler: Scott Chacon, GitButler

GGitButler
Computing/SoftwareSmall Business/StartupsInternet Technology

Transcript

00:00:00Bem-vindos. Vou fazer uma demonstração rápida, caso não conheçam o Git Butler. Ele é uma nova ferramenta de controle de versão
00:00:07na qual trabalhamos há alguns anos. Roubamos muita coisa do JJ.
00:00:10Então, se vocês usam o Jujitsu, pegamos muita coisa de vocês.
00:00:16Enfim, para quem não conhece, o Git Butler é uma ferramenta de controle de versão.
00:00:19Geralmente é uma interface gráfica,
00:00:21mas estamos trabalhando em uma CLI e queria mostrar algumas coisas dela, já que todos aqui trabalham com Git e
00:00:26o Git tem uma CLI interessante e...
00:00:29Temos alguns conceitos que também roubamos do Jujitsu.
00:00:33Mas há coisas novas que eu acho bem legais.
00:00:36Queria mostrar para vocês para pegar algumas ideias do que seria muito foda.
00:00:40Então, vou passar por esses pontos.
00:00:43Então...
00:00:46Existem algumas... a ferramenta de linha de comando se chama "but".
00:00:49Como ando contando piadas de tiozão, acho que o nome é apropriado.
00:00:52Você pode rodar "but status". É tipo um log resumido.
00:00:57Se vocês já usaram o Sapling ou o Jujitsu e viram o log deles,
00:01:00nós mostramos os arquivos modificados no disco,
00:01:05do seu diretório de trabalho em relação ao branch de destino.
00:01:08Mas também mostramos os commits que você tem, entende?
00:01:11Você também pode digitar "but status -F" e ele mostrará os arquivos modificados em cada commit.
00:01:18Se estiver rodando a interface do Git Butler, você consegue ver suas raias e tudo mais.
00:01:23Mas há muitas coisas legais no Git Butler que o Git não faz. Podemos fazer, por exemplo, esse log curto e bacana.
00:01:29E...
00:01:30Sabe,
00:01:32podemos fazer um log geral que indica se os commits são locais ou não. É parecido com um log curto
00:01:39em qualquer outra ferramenta. E podemos criar novos branches.
00:01:40Se eu olhar o "status", vejo que... estou fazendo um clone do Twitter aqui.
00:01:44Tenho alguns branches, um empilhado sobre o outro.
00:01:50Isso é algo que o Git até faz se você tiver o "update-ref"
00:01:52configurado, certo? Ele reescreve suas referências ao fazer um rebase ou algo assim.
00:01:56Mas nós fazemos isso de forma mais natural, entende?
00:02:00Nós atualizamos automaticamente suas refs e você pode mudar coisas e o rebase rastreará isso.
00:02:03Mas também podemos trabalhar com
00:02:09branches paralelos. Podemos ter mais de um branch aplicado ao mesmo tempo. O que vou fazer aqui... Ah,
00:02:11vou criar um novo branch e
00:02:23rodar novamente. Agora tenho esse novo branch que é paralelo aos outros que estou usando, certo?
00:02:26E o que posso fazer é entrar nesse branch e começar a atribuir e commitar coisas.
00:02:33Veremos isso a seguir.
00:02:39Outra coisa legal é que temos múltiplas áreas de staging.
00:02:41Cada pilha que você tem possui sua própria área de staging. Você pode usar
00:02:45"rub". "rub" é o comando. Você diz "rub KU" para este arquivo aqui e manda para "ZA".
00:02:51Ele atribui o arquivo àquela área de staging específica. Se eu quisesse atribuir algo a esta aqui,
00:02:58ele te dá esses códigos curtos, sabe? Então você diz: "Ok,
00:03:04este está atribuído aqui e este aqui".
00:03:12E se eu commitar, posso enviá-los para qualquer um desses branches ao mesmo tempo.
00:03:15Vamos dar uma olhada. Vemos que isso está commitado aqui, ou melhor, atribuído aqui, então posso dizer:
00:03:21"but commit -o"
00:03:27E ele commita aqui, viram?
00:03:30Agora este arquivo está neste commit. E o legal é que tudo isso é Git, certo? Então eu também posso
00:03:40fazer isso,
00:03:48ele realmente cria um commit de Git. Posso dar push naquele branch e tudo mais.
00:03:50Mas...
00:03:57Sim, posso atribuir a branches ou apenas dizer "but commit" e ele fará tudo o que não estiver atribuído ao alvo
00:03:59que eu definir. Posso escolher em qual branch quero commitar as coisas novas.
00:04:07E inventamos esse termo chamado "rubbing" (esfregar).
00:04:11Falei para muita gente sobre o Caleb, que ficou bebendo a noite toda e não está aqui agora.
00:04:14Se ele entrar, todos deveríamos levantar e aplaudi-lo.
00:04:18Mas ele veio com esse termo, "rubbing", que é basicamente pegar duas coisas, juntá-las e ver o que sai.
00:04:21Se vocês já jogaram Minecraft ou algo assim, conhecem a bancada de trabalho.
00:04:28É esse conceito: você
00:04:32pega isso e aquilo, junta e cria algo novo e mais interessante, certo?
00:04:34Existem várias coisas que você pode fazer na CLI do "but" para misturar as coisas com o comando "but rub".
00:04:38Vou mostrar alguns exemplos. Podemos atribuir coisas, como mostrei; você pode atribuir um arquivo modificado
00:04:45ou não commitado a um branch, mas também pode desatribuir. Existe esse modo especial "00"
00:04:52onde eu posso dizer "but rub"
00:05:01este commit inteiro, por exemplo,
00:05:05para o "00" e...
00:05:07Ele desfaz o commit. Essencialmente faz um "reset soft"
00:05:11daquele commit. Também posso emendar (amend) coisas, tipo "rub le r"
00:05:17"y"
00:05:24"RV"... caramba, preciso dos meus óculos de leitura. Tô ficando velho.
00:05:27"SW", que é o nosso... na verdade para
00:05:32"1 1 W". Vamos fazer esse.
00:05:35É "IW"? Obrigado.
00:05:38Ops.
00:05:41Isso é um "I"?
00:05:44Desculpem.
00:05:48E...
00:06:02Ele commita ali. Eu posso
00:06:04fazer "rub I".
00:06:10Posso descomitar coisas.
00:06:14Certo? Posso fazer squash. Se eu quiser juntar este commit com este, faço "but rub"
00:06:16"J e GE"
00:06:22E ele esmaga os commits. Posso descomitar, mover coisas de lugar...
00:06:25Basicamente qualquer coisa que você imagine que aconteceria ao combinar duas coisas, certo?
00:06:32Ele fará. E se você combinar algo com as mudanças não atribuídas, ele essencialmente desfaz a ação.
00:06:37Não lembro se isso aqui funciona mesmo...
00:06:42Você também pode mover arquivos entre commits. Tipo,
00:06:48"J 8 2"
00:06:53e
00:07:02ele basicamente tira o arquivo daquele commit,
00:07:03desfaz a alteração ali e a move para o commit de baixo, sacou?
00:07:07O interessante não é que isso seja impossível no Git, mas que é bem difícil de fazer. Tipo, desfazer
00:07:11commits individuais no meio da pilha, mover arquivos entre commits ou emendar um arquivo em um commit três níveis abaixo.
00:07:19Dá pra fazer no Git, tipo usando um
00:07:27commit temporário de "fixup" e "autosquash" ou algo assim.
00:07:31Mas é muito melhor poder apenas "esfregar" as coisas e mover o conteúdo para onde você quer,
00:07:34além de ter vários branches simultâneos.
00:07:40Outra coisa: você pode dividir commits facilmente. Temos também o comando "but new".
00:07:43Se eu quiser dizer
00:07:51"but new"
00:07:54"H e", então ele vai
00:07:56criar um novo commit vazio ali, sem nada dentro.
00:07:59Viram? É o estilo Jujitsu, onde você cria um commit vazio
00:08:03e depois pode "esfregar" arquivos para dentro dele. Eu poderia dizer:
00:08:08"Pegue este arquivo"
00:08:12"zero"
00:08:15Eu pego...
00:08:23Ele move o arquivo para este novo commit, e aí posso descrevê-lo (describe).
00:08:29O que era aquele "X you see"?
00:08:32Como eu poderia...
00:08:45"status -F". Ele mostra os arquivos em cada commit em vez de... o "but ST"
00:08:56O "but status" mostra apenas os commits, e
00:09:02o "but status -F" mostra os arquivos dentro de cada um, para que você possa movê-los com o "rubbing".
00:09:04Temos o "new" e o "describe", e a última coisa é a marcação (marking). Isso também é bem estilo JJ.
00:09:11Para quem usa o Jujitsu, você pode marcar um commit como alvo.
00:09:16Assim, tudo o que a ferramenta vir, ela colocará naquele commit. Você pode marcar...
00:09:21É uma coisa bem interessante. Posso dizer
00:09:25"but new -M" ou posso usar o "mark". Tipo "but mark"
00:09:29"Z a" e
00:09:33ele vai marcar isso. Vejam que ele já pegou o que não estava commitado e colocou naquela
00:09:35raia.
00:09:42Aí eu posso commitar as coisas ou também marcar
00:09:44um commit específico.
00:09:47Ah, aquilo ali é um branch, desculpe.
00:09:56Ele marca um commit específico e, se eu der um "echo new",
00:09:58ele pega aquilo e commita automaticamente naquele commit, entende?
00:10:07Isso é interessante porque é uma pilha de branches com vários commits e qualquer coisa que eu faça agora
00:10:15está automaticamente emendando um commit três posições abaixo na pilha, viram?
00:10:21É como o JJ faz, onde você dá um "jj new" e começa a trabalhar.
00:10:26Ele vai apenas emendando automaticamente o último commit que você fez,
00:10:31exceto que aqui você pode marcar basicamente qualquer commit e
00:10:33continuar trabalhando nele, e depois desmarcá-lo quando quiser.
00:10:36Certo?
00:10:41Enfim, essas são algumas das coisas divertidas em que estamos trabalhando.
00:10:44Acho muito bom poder trabalhar desse jeito.
00:10:48Outra coisa que também "roubamos" do JJ é o log de operações (oplog).
00:10:52Já temos isso há um bom tempo.
00:10:56Se você usa o Git Butler, tem uma aba que mostra todas as operações realizadas.
00:10:59Mas cada vez que rodo algo, ele gera um histórico de operações
00:11:03e posso ver tudo o que o Git Butler fez. Posso restaurar qualquer uma ou dizer
00:11:06tipo,
00:11:12"undo" (desfazer).
00:11:13Ops, se eu digitar certo... Posso dar "undo" e ele desfaz a operação, voltando meu diretório e meu status
00:11:14exatamente para onde estavam antes. Ou posso dizer
00:11:20"restore"
00:11:22para qualquer um desses hashes (SHAs).
00:11:24Opsie.
00:11:26E...
00:11:29ele redefine meu diretório de trabalho, meus branches e tudo o que eu tinha para o estado anterior.
00:11:33É curioso fazer uma demo assim, porque posso criar um cenário
00:11:38que eu sei que funciona, e depois restaurar e começar o cenário do zero de novo.
00:11:44Mas obviamente é ótimo poder dizer: "Quer saber? Eu não queria ter feito isso" ou "Entrei numa
00:11:50zona de conflito". Aí é só desfazer e continuar trabalhando.
00:11:54Então, é isso. Ah, e todos os comandos têm saída em JSON. Você pode usar "but -J"
00:11:58ou "--json" em qualquer comando e ele dará os mesmos dados, mas em formato JSON.
00:12:06Para quem quer criar scripts, é muito melhor do que a saída "porcelain" do Git.
00:12:11Você pode simplesmente ler os dados ou usar o "jq" para achar uma entrada específica e
00:12:15conseguir criar scripts para a CLI de forma bem mais amigável.
00:12:21É isso. Muito obrigado!
00:12:24Então é isso. Muito obrigado!

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