A intenção desse post é melhorar, se possível, seu workflow com o Git se ele atualmente ele consiste de:
- Usar o Git através de uma shell de sua escolha.
- Usar o VIM como editor padrão no Git.
Se você usa alguma ferramenta gráfica (tig também conta), eu não quero saber. Se você usa o Git numa shell em conjunto com outro editor, procuro ansiosamente seu comentário me convencendo a trocar. :)
Embora o VIM vai funcionar bem do jeito que ele estiver configurado/instalado no seu sistema, com algumas configurações as coisas podem ficar BEM mais bacanas:
- Syntax highlight (
syntax on) - Use only spaces (
set expandtab) - Search highlight (
set hlsearch)
Você pode definir isso tanto direto no seu VIM (por exemplo, :set expandtab) ou no seu .vimrc (arquivo usado pelo VIM para carregar suas configurações pessoais, localizado na pasta home do usuário).
Vou explicar e dar exemplos agrupando eles por tarefa no Git. Quem sabe, algum dia, isso vire um catálogo?
Algumas coisas pra ter em mente:
- Se não mencionado, a posição do cursor é a coluna 0 (zero) da linha 0 (zero).
- Todos os comandos são case-sensitive.
- Nenhuma configuração no VIM é necessária, a não ser que seja especificado.
- Está implícita a saída do VIM com
:x. - Experimente combinações diferentes. O objetivo é mostrar alternativas práticas e não a melhor solução.
<Sua commit message vai aqui>
# Please enter the commit message for your changes. Lines starting
# with '#' will be ignored, and an empty message aborts the commit.
# On branch master
# Your branch is ahead of 'upstream/master' by 47 commits.
# (use "git push" to publish your local commits)
#
# Changes to be committed:
# modified: bin/install.sh
# modified: composer.json
#
Para cancelar uma mensagem de commit (ou rebase) no Git, salvar uma mensagem vazia; pra isso extem algumas alternativas:
<ESC>ggdG: Remove todo conteúdo no arquivo.<ESC>para ganrantir que estamos no normal mode.ggpara mover o cursor para primeira linha.dGpara apagar (d) até o fim do arquivo (G).
<ESC>:%s/^[^# ].*//g: Apaga tudo que não for comentário.<ESC>para garantir que estamos no normal mode.:%spara fazer uma substituição (s) no arquivo todo (%),/^[^# ].*buscando (/) por coisas que não são comentários (^[^# ].*),//ge substituindo por nada (//) todas as ocorrências encontradas (g).
O Visual mode é ativado quando você pressiona a tecla v (sempre minúscula). O Visual mode é uma maneira fácil de você entender os keystrokes já que a seleção será destacada pelo VIM.
ggvGd: Remove todo conteúdo do arquivo.ggpara mover o cursor para a primeira linha.vpara entrar no Visual Mode.Gpara que sua seleção vá até o final do arquivo.dpara apagar a sua seleção.
Um rebase interativo retorna pra você uma lista dos commits (ordenados de forma decrescente, ou seja, seu commit mais recente é o último da lista) e o que fazer com eles, já dentro do VIM. Você vê algo mais ou menos isso:
pick a5a8b80 Adiciona teste do bug de loop na autenticação.
pick be2c94a Remove código morto.
pick a555547 Corrige o bug de loop na autenticação.
pick 95ceb0e Implementa cache de resultados de API externas.
# Rebase ef59748..95ceb0e onto ef59748
#
# Commands:
# p, pick = use commit
# r, reword = use commit, but edit the commit message
# e, edit = use commit, but stop for amending
# s, squash = use commit, but meld into previous commit
# f, fixup = like "squash", but discard this commit's log message
# x, exec = run command (the rest of the line) using shell
#
# These lines can be re-ordered; they are executed from top to bottom.
#
# If you remove a line here THAT COMMIT WILL BE LOST.
#
# However, if you remove everything, the rebase will be aborted.
#
# Note that empty commits are commented out
Vamos supor que queremos criar um único commit contendo a correção e remover a implementação de cache do nosso branch.
Seguem algumas opções pra fazer isso e suas explicações:
jces<ESC>j.jdd: squash debe2c94aea555547soba5a8b80e remoção de95ceb0e.j: Move o cursor para linha de baixo.ce: Apaga e inicia o modo de inserção (c) até o final da palavra sob o cursor (e).s: Digitamos a letra "s", atalho de squash.<ESC>: Sai do modo de inserção para o modo normal.j: Move o cursor para linha de baixo..: Repete o último comando até o fim da inserção (ce).j: Move o cursor para linha de baixo.dd: Remove a linha atual (a555547).
jdddtkrsjdG: Removebe2c94ae95ceb0e, faz squash dea555547soba5a8b80.j: Move o cursor para linha de baixo.dd: Remove a linha atual (be2c94a).dtk: Remove (d) até o caracter imediatamente antes (t) de "k" (k).rs: Substitui (r) o caractere atual ("k") por "s".j: Move o cursor para linha de baixo.dG: 'Remove (d) até o fim do arquivo (G).