Visualizando todos os `git diffs` com vimdiff

209

Eu configurei git diffpara quebrar o vimdiff, usando " Git Diff com Vimdiff " como guia, e está funcionando conforme o esperado, a menos que haja muitos arquivos com alterações.

Quando há vários arquivos com alterações e eu corro git diff, ele abre o primeiro arquivo e, após encerrar a primeira instância do vimdiff, recebo a seguinte mensagem:

external diff died, stopping at filename

Esse é um comportamento completamente diferente do que estou acostumado. Eu tinha uma configuração semelhante no passado com o SVN e, ao diferenciar vários arquivos, revisava o primeiro arquivo, depois escrevia e encerrava o uso, :wqe o próximo arquivo com diferenças era aberto.

Este não é o caso do Git. Eu tentei :n[ext], mas fazer isso não preenche a janela esquerda com o arquivo original, para que possa ser diferente da versão modificada.

chuckg
fonte

Respostas:

337
git config --global diff.tool vimdiff
git config --global difftool.prompt false
git config --global alias.d difftool

Digitar git dproduz o comportamento esperado; digitar :wqno vim alterna para o próximo arquivo no conjunto de alterações.

chuckg
fonte
22
Apenas meus dois centavos: eu tenho um dfapelido diffe um dtapelido para difftool. Além disso, digitar :qano Vim passará para o próximo conjunto de alterações sem salvar nada.
JC Yamokoski
2
Esta solução é ótima, exceto que, ao salvar as alterações, você deve digitar ": w!" em vez de: w
Asenar 26/09
2
@jonyamo A definição de alias deve sempre ser baseada na frequência com que estamos usando alguns comandos. Eu estou frequentemente usando do git diffque git difftool. Então, eu tenho um alias dpara 'diff' e 'dt' to difftool '. Usabilidade é importante do que criar aliases com padrão.
precisa saber é o seguinte
Como fazer o "git diff" usar o vimdiff ?, essa resposta me faz usar um alias. Se eu alias para "diff" não funciona.
Rombus 4/16/16
6
@Asenar "Esta solução é ótima, exceto que ao salvar as alterações, você deve digitar em :w!vez de :w". Isso ocorre porque o git chama vimdiffcom a -Ropção Você pode substituí-lo por git config --global difftool.vimdiff.cmd 'vimdiff "$LOCAL" "$REMOTE"'. Isso abrirá o vimdiff no modo gravável.
wisbucky
103

Você pode tentar git difftool, ele foi projetado para fazer essas coisas.

Primeiro, você precisa configurar a ferramenta diff para vimdiff

git config diff.tool vimdiff

Então, quando você quiser diferenciar, basta usar em git difftoolvez de git diff. Funcionará como você espera.

checa
fonte
1
Quase lá! Modificado um pouco, é exatamente o que estou procurando. +1 embora!
chuckg
1
O vimdiff mergetool foi atualizado recentemente: git.kernel.org/?p=git/… (e alguns outros commits, mas esse é o maior). Não tenho certeza de quando será a próxima versão de manutenção, mas se você estiver disposto a construir a partir do git.git, as atualizações serão suas!
Cascabel 29/10
21
Git accepts kdiff3, tkdiff, meld, xxdiff, emerge, vimdiff, gvimdiff, ecmerge,
and opendiff as valid diff tools. You can also set up a custom tool. 

git config --global diff.tool vimdiff
git config --global diff.tool kdiff3
git config --global diff.tool meld
git config --global diff.tool xxdiff
git config --global diff.tool emerge
git config --global diff.tool gvimdiff
git config --global diff.tool ecmerge
Nanhe Kumar
fonte
3
Você responde pelo mergetool, não pelo difftool. Mas ainda é uma resposta útil. +1.
dotancohen
@dotancohen Muito obrigado, eu nunca percebi que por erro bobo agora eu posso editar minha resposta.
Nanhe Kumar
1
@NanheKumar, @dotancohen, substituindo mergecom diffas respostas acima irá fazer o truque, ou seja git config --global diff.tool vimdiff .
Will
2

Para pessoas que desejam usar outra ferramenta diff não listada no git, digamos com nvim. Aqui está o que eu acabei usando:

git config --global alias.d difftool -x <tool name>

No meu caso, eu definir <tool name>a nvim -de invocar o comando diff com

git d <file>
peixe-gato-salgado
fonte