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
- Use only spaces
- Search highlight
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.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
).
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 debe2c94a
ea555547
soba5a8b80
e 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
: Removebe2c94a
e95ceb0e
, faz squash dea555547
soba5a8b80
.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
).
Você tem uma lista de commits pra fazer cherry-pick
, como usar o vim pra te ajudar nisso?
Como usar o vim pra administrar sua lista (crescente) de stash
s.
Durante um rebase ou merge vários arquivos podem gerar conflitos, como o VIM pode te ajudar.
Como usar o VIM para estudar as mudanças e o histórico do projeto.