Quando digito "git diff", gostaria de ver um diff lado a lado, como com "diff -y", ou gostaria de exibir o diff em uma ferramenta de diff interativa como "kdiff3". Como isso pode ser feito?
163
Quando digito "git diff", gostaria de ver um diff lado a lado, como com "diff -y", ou gostaria de exibir o diff em uma ferramenta de diff interativa como "kdiff3". Como isso pode ser feito?
Respostas:
Embora o Git tenha uma implementação interna do diff, você pode configurar uma ferramenta externa.
Existem duas maneiras diferentes de especificar uma ferramenta de comparação externa:
GIT_EXTERNAL_DIFF
eoGIT_DIFF_OPTS
ambiente variáveis.git config
Veja também:
git diff --help
Ao fazer a
git diff
, o Git verifica as configurações das variáveis de ambiente acima e seu.gitconfig
arquivo.Por padrão, o Git passa os sete argumentos a seguir para o programa diff:
Normalmente, você só precisa dos parâmetros do arquivo antigo e do novo arquivo. É claro que a maioria das ferramentas diff usa apenas dois nomes de arquivos como argumento. Isso significa que você precisa escrever um pequeno script wrapper, que aceita os argumentos que o Git fornece ao script e os entrega ao programa externo do git de sua escolha.
Digamos que você coloque seu wrapper-script em
~/scripts/my_diff.sh
:você precisa tornar esse script executável:
você precisará informar ao Git como e onde encontrar seu script de wrapper diff personalizado. Você tem três opções de como fazer isso: (prefiro editar o arquivo .gitconfig)
Usando
GIT_EXTERNAL_DIFF
,GIT_DIFF_OPTS
Por exemplo, no seu arquivo .bashrc ou .bash_profile, você pode definir:
Usando
git config
use "git config" para definir onde seu script wrapper pode ser encontrado:
Editando seu
~/.gitconfig
arquivovocê pode editar seu
~/.gitconfig
arquivo para adicionar estas linhas:Nota:
De maneira semelhante à instalação da ferramenta diff personalizada, você também pode instalar uma ferramenta de mesclagem personalizada, que pode ser uma ferramenta de mesclagem visual para ajudar a visualizar melhor a mesclagem. (veja a página progit.org)
Consulte: http://fredpalma.com/518/visual-diff-and-merge-tool/ e https://git-scm.com/book/en/v2/Customizing-Git-Git-Configuration
fonte
meld
,?meld
versão pode ser configurada para fazer uma comparação de diretório, onde posso escolher para quais arquivos quero ver a comparação? Atualmente, ele executa ummeld
comando separado para cada arquivo, e eu tenho que sairmeld
para ver o próximo arquivo. Prefiromeld
me mostrar uma lista de diretórios de arquivos alterados, como se comporta quandomeld
é usado no Mercurial.Experimente o git difftool
Use em
git difftool
vez degit diff
. Você nunca voltará.UPDATE para adicionar um exemplo de uso:
Aqui está um link para outro stackoverflow que fala sobre
git difftool
: Como visualizo a saída 'git diff' com minha ferramenta / visualizador preferido de diff?Para versões mais recentes do
git
, odifftool
comando suporta muitas ferramentas externas diff prontas para uso. Por exemplo,vimdiff
é suportado automaticamente e pode ser aberto na linha de comando:Outras ferramentas de diff externas suportadas são listadas
git difftool --tool-help
aqui, é um exemplo de saída:fonte
This message is displayed because 'diff.tool' is not configured.
. Talvez atualize a resposta com o mínimo de como configurar essa coisa, para que ela exiba diferenças lado a lado no terminal, o que o OP pediu? As ferramentas da GUI são bastante inúteis no servidor remoto onde você se conecta usando o ssh.git difftool
comvimdiff
nem sempre se alinham os dois arquivos / buffers corretamente.git difftool -y
para evitar tkdiff prontagit difftool
no Windows e Linux: stackoverflow.com/a/48979939/4561887Você também pode tentar
git diff --word-diff
. Não é exatamente lado a lado, mas de alguma forma melhor, então você pode preferir à sua real necessidade lado a lado.fonte
git diff --word-diff=color
--word-diff=color
me dá um erro de opção inválida. Em qual versão foi introduzida?git diff --color-words
funciona.git diff --color-words
é o caminho a seguir nas versões modernas do git.ydiff
Anteriormente chamada
cdiff
, essa ferramenta pode exibir diferenças lado a lado , incremental e colorida .Em vez de fazer
git diff
, faça:Isso será iniciado
ydiff
no modo de exibição lado a lado para cada um dos arquivos com diferenças.Instale com:
-ou-
Para
git log
, você pode usar:-w0
detecta automaticamente a largura do seu terminal. Veja aydiff
página do repositório do GitHub para detalhes e demonstração.Testado no Git 2.18.0, ydiff 1.1.
fonte
git diff | cdiff -s
ao icdiff?ydiff -s
partir de um espaço de trabalho git / svn / hg, você não precisacd <git repo>
e , em seguida, executeydiff -ls <path/to/file>
Você pode fazer um lado a lado
diff
usandosdiff
o seguinte:Onde
HEAD^
está um exemplo que você deve substituir pelo que você quer diferenciar.Encontrei esta solução aqui, onde há algumas outras sugestões também. No entanto, essa resposta é a pergunta do OP de maneira sucinta e clara.
Veja o man git-difftool para uma explicação dos argumentos.
Levando os comentários em consideração, você pode criar um
git sdiff
comando útil escrevendo o seguinte script executável:Salve como
/usr/bin/git-sdiff
echmod -x
. Então você poderá fazer isso:fonte
tput cols
em vez disso, por exemplo:git difftool -x "sdiff -s -w $(tput cols)"
.então simplesmente:
fonte
Se você quiser ver diferenças lado a lado em um navegador sem envolver o GitHub, poderá desfrutar do git webdiff , um substituto para
git diff
:Isso oferece várias vantagens sobre os difftools da GUI tradicional, como
tkdiff
no sentido de oferecer realce de sintaxe e mostrar diferenças de imagem.Leia mais sobre isso aqui .
fonte
Eu uso colordiff .
No Mac OS X, instale-o com
No Linux, é possível
apt get install colordiff
ou algo assim, dependendo da sua distribuição.Então:
Ou crie um alias
Então você pode usá-lo
Eu o chamei de "diffy" porque
diff -y
é o diff lado a lado no unix. Colordiff também adiciona cores mais agradáveis. Na opção-ydw
,y
é para o lado a lado,w
é para ignorar espaços em branco ed
é para produzir a diferença mínima (geralmente você obtém um melhor resultado como diferença)fonte
-y
para ignorar oLaunch 'colordiff' [Y/n]:
prompt.git alias diffy "difftool --extcmd=\"colordiff -ydw\""
? Não deveria sergit config --global alias.diffy "difftool --extcmd=\"colordiff -ydw\""
?Para unix, combinando just
git
e o built-indiff
:Obviamente, você pode substituir HEAD por qualquer outra referência git e provavelmente deseja adicionar algo como
-W 170
o comando diff.Isso pressupõe que você está apenas comparando o conteúdo do diretório com uma confirmação anterior. Comparar entre dois commits é mais complexo. Se o seu shell for,
bash
você pode usar "substituição de processo":onde
REF1
eREF2
são referências git - tags, ramificações ou hashes.fonte
Eu pessoalmente gosto muito de icdiff !
Se você estiver em
Mac OS X
comHomeBrew
, apenas façabrew install icdiff
.Para obter os rótulos dos arquivos corretamente, além de outros recursos interessantes, tenho no meu
~/.gitconfig
:E eu uso como:
git difftool
fonte
Essa pergunta apareceu quando eu estava procurando uma maneira rápida de usar o git builtin para localizar diferenças. Meus critérios de solução:
Encontrei esta resposta para obter cores no git.
Para obter diferenças lado a lado em vez de diferenças de linha, ajustei a excelente resposta do mb14 nesta pergunta com os seguintes parâmetros:
Se você não gostar do extra [- ou {+, a opção
--word-diff=color
pode ser usada.Isso ajudou a obter uma comparação adequada com o texto json e xml e o código java.
Em resumo, as
--word-diff-regex
opções têm uma visibilidade útil, juntamente com as configurações de cores, para obter uma experiência colorida do código-fonte lado a lado em comparação com o diferencial de linha padrão, ao navegar por arquivos grandes com pequenas alterações de linha.fonte
Vários outros já mencionaram o cdiff para diferenciar lado a lado do git, mas ninguém deu uma implementação completa dele.
Setup cdiff:
Edite ~ / .gitconfig inserindo estas linhas:
O pager desativado é necessário para que o cdiff funcione com o Diff, ele é essencialmente um pager de qualquer maneira, portanto está ótimo. A ferramenta Difftool funcionará independentemente dessas configurações.
O alias show é necessário porque o git show suporta apenas ferramentas diff externas via argumento.
O '#' no final do comando externo diff é importante. O comando diff do Git anexa um $ @ (todas as variáveis diff disponíveis) ao comando diff, mas queremos apenas os dois nomes de arquivos. Então, chamamos esses dois explicitamente com US $ 2 e US $ 5 e, em seguida, ocultamos o $ @ por trás de um comentário que, de outra forma, confundiria sdiff. Resultando em um erro parecido com:
Comandos Git que agora produzem diferenças lado a lado:
Uso de Cdiff:
Agora você tem diff lado a lado via git diff e difftool. E você tem o código-fonte cdiff python para personalização de usuários avançados, caso precise.
fonte
Aqui está uma abordagem. Se você passar por menos, a largura xterm é definida como 80, o que não é tão quente. Mas se você prosseguir com o comando, por exemplo, COLS = 210, poderá utilizar o xterm expandido.
fonte
Abra Intellij IDEA , selecione uma confirmação única ou múltipla na janela da ferramenta "Controle de Versão", procure os arquivos alterados e clique duas vezes neles para inspecionar as alterações lado a lado de cada arquivo.
Com o iniciador de linha de comando incluído, você pode trazer o IDEA para qualquer lugar com um simples
idea some/path
fonte
Há muitas boas respostas neste tópico. Minha solução para esse problema foi escrever um script.
Nomeie esse 'git-scriptname' (e torne-o executável e coloque-o no PATH, como qualquer script), e você pode invocá-lo como um comando normal do git executando
A funcionalidade real é apenas a última linha. Aqui está a fonte:
fonte
Esta pode ser uma solução um tanto limitada, mas executa o trabalho usando o
diff
comando do sistema sem ferramentas externas:--suppress-common-lines
(se o seudiff
suportar a opção).diff
marcadores usuais--width=term-width
; no Bash pode obter a largura como$COLUMNS
output cols
.Isso também pode ser envolvido em um script git helper para maior comodidade, por exemplo, uso como este:
fonte