Digamos que eu crie um patch com git format-patch
. O arquivo é basicamente um diff unificado com alguns metadados. Se eu abrir o arquivo no Vim, posso ver quais linhas foram modificadas, mas não consigo ver quais caracteres nas linhas alteradas diferem. Alguém conhece uma maneira (no Vim, ou algum outro software livre que roda no Ubuntu) para visualizar diferenças por caracteres?
Um exemplo de contador em que a diferença por caractere é visualizada é ao executar vimdiff a b
.
atualização Fri Nov 12 22:36:23 UTC 2010
O diffpatch é útil para o cenário em que você está trabalhando com um único arquivo.
atualização quinta-feira 16 de junho 17:56:10 UTC de 2016
Confira diff-realce no git 2.9 . Esse script faz exatamente o que eu estava procurando originalmente.
git diff --color-words
é muito útil apenas para ver quais palavras mudam dentro das linhas, em vez da saída diff unificada usual. Ele é baseado em palavras e não em caracteres, portanto, se não houver muito espaço em branco no conteúdo que você está difundindo, a saída poderá ser menos organizada. (Editado: Opa, eu vejo que eu mal o que você está pedindo - no entanto, talvez este comentário seria útil para alguém.)Respostas:
Dadas as suas referências ao Vim na pergunta, não tenho certeza se esta é a resposta que você deseja :), mas o Emacs pode fazer isso. Abra o arquivo que contém o diff, verifique se você está dentro
diff-mode
(se o arquivo for nomeadofoo.diff
oufoo.patch
isso acontecer automaticamente; caso contrário, digiteM-xdiff-mode
RET ), vá para o pedaço que você está interessado e bateu C-c C-bpararefine-hunk
. Ou percorra o arquivo com um pedaço de cada vez M-n; isso fará o refinamento automaticamente.fonte
git log master.. -p | emacs -
M-!
para executar o comando e capturar a saída em um buffer.No git, você pode mesclar sem confirmar. Mesclar seu patch primeiro e depois:
Observe o ponto após o sinal de igual.
fonte
git diff --color-words=.
.git diff --color-words=.
egit diff --color-words .
funciona de maneira diferente. Melhor égit diff --color-words .
.git diff --color-words .
é realmente o mesmo quegit diff --color-words -- .
! Ou seja, o.
é interpretado como um caminho. Você pode verificar commkdir x y; echo foo > x/test; git add x/test; git commit -m test; echo boo > x/test; cd y; git diff --color-words=.; git diff --color-words .; git diff --color-words -- .
.Aqui estão algumas versões com menos saída ruidosa que
git diff --word-diff-regex=<re>
e que requerem menos digitação que, mas são equivalentes agit diff --color-words --word-diff-regex=<re>
,.Simples (destaca as alterações de espaço):
Simples (destaca alterações de caracteres individuais; não destaca alterações de espaço):
Mais complexo (destaca as alterações de espaço):
Em geral:
onde
<re>
é um regexp que define "palavras" com o objetivo de identificar alterações.Eles são menos barulhentos, pois colorem as "palavras" alteradas, enquanto o uso apenas
--word-diff-regex=<re>
envolve "palavras" correspondentes com-/+
marcadores coloridos .fonte
--color-words
, sem a=.
parte.git diff --color-words='\w'
funcionaria melhor com diacríticos (git v1.7.10.4)--word-diff=plain
adicionalmente a ter[-
e-]
deletar cercas{+
e+}
cercar adições. Como o manual adverte, no entanto, ocorrências reais desses delimitadores na fonte são não escapou de qualquer formaO regex acima ( de Thomas Rast ) faz um trabalho decente ao separar fragmentos diff no nível de pontuação / caractere (embora não seja tão barulhento quanto
--word-diff-regex=.
).Publiquei uma captura de tela da saída resultante aqui .
Atualizar:
Este artigo tem algumas ótimas sugestões. Especificamente, a
contrib/
árvore do repositório git possui umdiff-highlight
script perl que mostra destaques refinados.Início rápido para usá-lo:
fonte
--color-words=[^[:space:]]|([[:alnum:]]|UTF_8_GUARD)+'
'
ao início do valor lá. caso contrário, eu tenho um erro. Além disso, eu simplesmente usando--color-words
eu recebo exatamente o mesmo comportamento que usar esse regexp.foo.bar
afoo.qux
que você vai ver a diferença.git diff --color-words='[^[:space:]]|([[:alnum:]]|UTF_8_GUARD)+'
./usr/local/share/git-core/contrib/diff-highlight/diff-highlight
. Isso parece sugerir que o git de Homebrew instala todo o contrib/usr/local/share/git-core/contrib/
. Então, finalmente, o seguinte trabalhou para mimgit diff --color=always | /usr/local/share/git-core/contrib/diff-highlight/diff-highlight
Se você não tem nada contra instalar o NodeJS, existe um pacote chamado "diff-so-fancy" ( https://github.com/so-fancy/diff-so-fancy ), que é muito fácil de instalar e funciona perfeitamente:
Edit: Acabei de descobrir que é realmente um invólucro para o diff-destaque oficial ... Pelo menos é mais fácil de instalar para perlofóbicos como eu e a página do GitHub está bem documentada :)
fonte
Não conheço a ferramenta de diferença por caractere, mas existe uma ferramenta por diferença de palavra: wdiff.
consulte exemplos As 4 principais ferramentas de diferença de arquivos no UNIX / Linux - Diff, Colordiff, Wdiff, Vimdiff .
fonte
wdiff old_file new_file | cdiff
*vimdiff
, depois dentro do vim:windo wincmd K
para mudar para o layout vertical da janela (um abaixo do outro) lado a lado. Esse layout é muito melhor para arquivos com linhas longas.wdiff2
,mdiff
e a ferramenta on-line do Google .Depois de um pouco de pesquisa, percebo que essa pergunta surgiu duas vezes recentemente na lista de discussão principal do Vim. O plugin NrrwRgn foi mencionado nas duas vezes (crie duas regiões estreitas e as diferencie). Usar o NrrwRgn, como descrito por Christian Brabandt, parece mais uma solução alternativa do que uma solução, mas talvez isso seja bom o suficiente.
Experimentei o NrrwRgn e, junto com: diffthis, foi realmente útil para ilustrar diferenças por caractere em partes de um único arquivo. Mas foram necessárias muitas teclas. Meu Vimscript está bastante enferrujado, mas provavelmente pode ser roteirizado. Talvez o NrrwRgn possa ser aprimorado para fornecer a funcionalidade desejada.
Pensamentos?
fonte