Agilidade e eficiência no git com oh-my-zsh
Published: 2019-05-28 20:17:37


Já dizia o FBI, _Winners don't use GUI_. Se você gosta daqueles negócio de git kraken, sublime merge, etc, tudo coloridinho e bonitinho, esse artigo não é pra você. Aqui só fica quem é hackudo com força, nerdão dos terminal, que quando garoto abria o cmd do windows e ficava digitando qualquer coisa na telinha preta até ter que formatar o windows pois apagou a system32 por acidente.

Você tá cansado de digitar os comandinho do git tudo, amiguinho? Seu workflow é orientado a git mas você não aguenta mais abrir o terminal pra ficar criando branch, dando comitinho e pushzinho? É um saco, né, digitar um monte de tralha e apertar tab várias vezes até achar a branch que você quer. Eu te entendo, eu também sofria disso. Sofria, pois agora com os poderes cabulosos do oh-my-zsh, meus problemas acabaram! Os seus ainda não, mas vão acabar assim que você ler esse artigo.

Primeiramente, instale o [oh-my-zsh](https://github.com/robbyrussell/oh-my-zsh) na sua máquina. Ele é lindo e você nunca mais vai querer trocar. Depois, leia com atenção os poderes que os plugins de [git](https://github.com/robbyrussell/oh-my-zsh/blob/master/plugins/git/git.plugin.zsh) e [git-flow](https://github.com/robbyrussell/oh-my-zsh/tree/master/plugins/git-flow) dele possuem:


### `gcd && ggpull`
Atalho para `git checkout develop && git checkout origin git_current_branch`, ou seja, acabou uma feature? Publicou, foi lá e fez o PR? Foi aceito, mergeado? Ótimo. Manda esse comando que sua develop já vai refletir a `develop` remota. Dependendo do seu fluxo essa pode ser a forma mais eficaz (caso você possa ir lá e aceitar o seu próprio PR por qualquer razão) ou não (precisa de um code review, precisa que alguém aceite o PR, etc.) antes de começar a trabalhar em outra feature.

### `gapa [&& gc]`
Atalho para `git add --patch` (ou simplesmente `-p`). Olha, se você se sente confortável usando `git commit -a`, beleza. Mas eu sugiro que você dê uma olhada em como funciona o `--patch` ou `-p`, porque ele te dá um nível de controle incrível do que vai pra stage ou não. Depois que eu me acostumei a usar as letrinhas do comando, só uso isso agora. Ou dou `gapa` ou dou `gc -p` (`git commit -p`, infelizmente o plugin de git do ohmyzsh não tem plugin nativo para `git commit -p`, e `gcp` já se refere à `git cherry-pick`)

### `gcb nome-da-branch`
Atalho para `git checkout -b nome-da-branch`. A agilidade que esse comando te dá é ótima. Nunca mais digitar `git checkout branch` e perceber que esqueceu a flag, daí reescrever o comando ou apertar setinha pra cima, colocar o cursor no lugar certo, digitar -b e dar enter. Com esse comando, não tem erro. Curto, prático e eficaz.

### `gcam "mensagem do commit"`
Atalho para `git commit -am ""mensagem do commit"`. OK, eu não aconselho você a usar esse comando, mas caso você viva la vida loka, full XGH, boladão sem freio, go fast break things, manda bala. Confesso que já usei muito, mas graças a Ancient Apparition me livrei desse mal que me afligia.

### `/ggpu(sh|ll)/`
Atalho para `git push origin git_current_branch` e `git pull origin git_current_branch`, respectivamente. Esse, assim como o `gcb`, foi um dos comandos que mais fiquei feliz de aprender. Nunca mais precisar digitar as 2 primeiras letras do nome da branch e ficar apertando tab até achá-las! Nunca mais se perder! Hooray, agilidade!

### `gcm`
Um dia eu fui um jovem plebeu que commitava coisas na master. Daí eu passei a criar branches a partir da master. Hoje o git frô me apresentou a solução e o caminho da luz para muitos problemas que me assolavam. Mas caso você ainda necessite ir até a `master` frequentemente, `gcm` é a forma mais ágil para isso.

### `ggu`
Atalho para `git pull --rebase origin git_current_branch` Se você é do #TeamRebase, esse comando é seu novo amorzinho. `ggu` e pronto. Tá na mão, garotchenho.

### `gl` e `gp`
Atalhos para `git pull` e `git push`. Versatilidade com rapidez. Depois de `gl` e `gp`, você pode argumentar à vontade com seu comando e ter o melhor dos dois mundos na ponta dos seus dedos.

### `gdba`
Atalho para `git branch --no-color --merged | command grep -vE "^(\*|\s*(master|develop|dev)\s*$)" | command xargs -n 1 git branch -d` Rapaz, use esse comando com *cuidado*. Ou não, como a gente bem, sabe, deu merda no git? cd ..... Esse comando joga fora toda a louça descartável que tá na pia, seu preguiçoso! Nem pra jogar os copinhos descartáveis fora, tsc tsc... Todas as branches que já foram mergeadas, exceto master, develop e dev (me corrigam se estiver errado), são apagadas, mas apenas em local. Ou seja, adeus pilha de branches velhas em local!

### `gc!`
Atalho para `git commit -v --amend`. Um clássico. Digitei a mensagem errada e só percebi depois que saí? `gc!`, corrige, salva e sai. Quanto mais disléxico, mais útil.

### `glo`
Atalho para `git log --oneline --decorate`. Ver todos os commits em oneline, com hash, merge e _corzinha_.  Inclusive, eu sugiro que você teste e dê uma boa olhada em todos os possíveis atalhos para `git log`. Definitivamente vale a pena o tempo investido.

### `gsta` e `gstaa`
Atalho para `git stash push` e `git stash apply`. Respectivamente, coloca tudo na stash mais recente, e pega a stash mais recente e aplica de volta ao projeto. Muito útil quando você tem problemas pra trocar de branch _because you left some unstaged changes_

### `gwch`
Atalho para `git whatchanged -p --abbrev-commit --pretty=medium`. `git whatchanged` é bem parecido com ´git log´ mas vai mostrando os arquivos que foram alterados em cada commit. A flag `-p` faz com que as alterações dentro do código sejam exibidas também. `--abbrev-commit` mostra a hashzinha e `--pretty=medium` é uma formatação de commit. Uso ele mais raramente, mas é bom saber que existe quando preciso.

### Seus próprios aliases
Eu absolutamente encorajo (e confesso que devia fazer mais também) seus próprios atalhos usando os comandos do zsh. Tem qualquer sequência de comandos que você digita frequentemente? Vai lá e faz um `alias` pra eles juntos. Sabe aqueles `git log` ou `git status` customizados que você adora usar? `alias` neles. Você pode fazer no arquivo do seu shell (`.zshrc`) ou no seu git, usando [`git config`](https://git-scm.com/book/en/v2/Git-Basics-Git-Aliases). Eu prefiro deixar nos meus dotfiles, pois fica mais fácil de carregar pra lá e pra cá. Por exempl, eu gosto de `git log --oneline --decorate --no-merges`, então deixo um `alias gl=comando` lá no fim do meu ´.zshrc´
Faça os seus também, cada keystroke a menos que você dá, é menos uma keystroke que leva para você se tornar um legítimo hack3rboy.


# Ah, mas o git flow?

Que bom que perguntou. A gente tem agilidade pro git flow também, que também é agilidade. Recursive agilidade. Caraca.

Você precisa instalar o [plugin do git flow](https://github.com/robbyrussell/oh-my-zsh/tree/master/plugins/git-flow) no seu zsh.

Olha, esse dá pra gravar todo na cabeça simplesmente entendendo como funciona o esquema de abreviação deles.
Os comandos básicos:

`g` => `git`

`fl` => `flow`

Os tipos de branch:

`f` => `feature`

`h` => `hotfix`

`r` => `release`

Os comandos específicos do gitflow:

`s` => `start`

`f` => `finish`

`p` => `publish`

Logo, se eu quiser dar um `git flow feature start nome-da-branch`, é só eu dar `g` + `fl` + `f` + `s`, ou seja, `gflfs`. Memela na pepela, meus camaradas.

### Agilidade na prática
`git flow` já deixa as coisas super simples para produzir algo na sua codebase. Olha só como, depois de ter os atalhos na ponta da língua, as coisas ficam ágeis para subir uma feature.

- Primeiro, `gflfs nome-da-feature` para iniciar a feature.
- Depois, codar.
- Terminou? `gapa && gc` (ou `gc -p`).
- Fez o commit? Tudo certo? `gflfp` publica em remote automaticamente, tudo certinho.
- Sua branch remota foi aprovada e mergeada na develop remota? `gcd && ggpull`, e sua local já tá atualizada.

Pimba. Mais fácil que isso, só um clone seu fazendo isso por você.

E aí, tem alguma coisa pra adicionar? Futucou o git.plugin.zsh e achou alguma coisa útil que você usa bastante mas não tá no artigo? Deixa nos comentários, que quem achar esse artigo depois, vai ler ele com `merge` do seu conhecimento.