Skip to content

Instantly share code, notes, and snippets.

@nelsonsar
Forked from augustohp/vim-para-usuarios-git.md
Last active July 11, 2017 00:36
Show Gist options
  • Save nelsonsar/9769023 to your computer and use it in GitHub Desktop.
Save nelsonsar/9769023 to your computer and use it in GitHub Desktop.

VIM para usuários Git

A intenção desse post é melhorar, se possível, seu workflow com o Git se ele atualmente ele consiste de:

  1. Usar o Git através de uma shell de sua escolha.
  2. 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. :)

Preparando o Vim

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).

Cotidiano de versionamento

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.

Cancelando um commit/rebase

<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:

Usando o Normal Mode

  • <ESC>ggdG: Remove todo conteúdo no arquivo.
    • <ESC> para ganrantir que estamos no normal mode.
    • gg para mover o cursor para primeira linha.
    • dG para 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.
    • :%s para fazer uma substituição (s) no arquivo todo (%),
      • /^[^# ].* buscando (/) por coisas que não são comentários (^[^# ].*),
      • //g e substituindo por nada (//) todas as ocorrências encontradas (g).
Usando o Visual Mode

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.
    • gg para mover o cursor para a primeira linha.
    • v para entrar no Visual Mode.
    • G para que sua seleção vá até o final do arquivo.
    • d para apagar a sua seleção.

git rebase --interactive [-i]

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 de be2c94a e a555547 sob a5a8b80 e remoção de 95ceb0e.
    • 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: Remove be2c94a e 95ceb0e, faz squash de a555547 sob a5a8b80.
    • 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).
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment