Skip to content

Instantly share code, notes, and snippets.

@augustohp
Last active March 20, 2024 20:09
Show Gist options
  • Save augustohp/9490600 to your computer and use it in GitHub Desktop.
Save augustohp/9490600 to your computer and use it in GitHub Desktop.
Post: VIM para usuários Git

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
  • Use only spaces
  • Search highlight

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:

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

git rebase --interactive [-i]

Um rebase interativo retorna pra você uma lista dos commits 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).

Uma lista de cherry-picks

Você tem uma lista de commits pra fazer cherry-pick, como usar o vim pra te ajudar nisso?

Administrando sua coleção de stashs

Como usar o vim pra administrar sua lista (crescente) de stashs.

Resolvendo conflitos

Durante um rebase ou merge vários arquivos podem gerar conflitos, como o VIM pode te ajudar.

Navegando pelo histórico

Como usar o VIM para estudar as mudanças e o histórico do projeto.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment