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!