Como devo usar o git diff para longas filas?

235

Estou executando o git-diff em um arquivo, mas a alteração está no final de uma longa fila.

Se eu usar as teclas do cursor para mover para a direita, ele perde o código de cores - e pior ainda, as linhas não se alinham - dificultando o rastreamento da alteração.

Existe uma maneira de evitar esse problema ou simplesmente fazer com que as linhas sejam quebradas?

Estou executando o Git 1.5.5 via mingw32.

Peter Boughton
fonte
6
Você pode tentar 'git diff --color-words', não resolve o problema da rolagem, mas as alterações de palavras são cercadas pelo contexto em uma única linha!
Kevinf
7
Usando "dobrar" parece funcionar muito bem:git diff --color-words | fold
Amy
@ Amy Eu tentei usar, foldmas remove a cor. Desde que você especifica, --color-wordseu assumo que você conseguiu passar as cores para fold. Quão?
Nero gris

Respostas:

120

A exibição da saída de git diffé manipulada por qualquer pager que você estiver usando.

Geralmente, no Linux, lessseria usado.

Você pode dizer ao git para usar um pager diferente configurando a GIT_PAGERvariável de ambiente. Se você não se importa com a paginação (por exemplo, seu terminal permite rolar para trás), tente explicitamente definir GIT_PAGERcomo vazio para pará-lo usando um pager. No Linux:

$ GIT_PAGER='' git diff

Sem um pager, as linhas serão quebradas.

Se o seu terminal não suporta saída colorida, você também pode desativar isso usando o --no-colorargumento ou colocando uma entrada na seção de cores do seu arquivo de configuração do git.

$ GIT_PAGER='' git diff --no-color
SpoonMeiser
fonte
1
Posso confirmar que a configuração de GIT_PAGER como em branco faz com que as linhas sejam quebradas. Ele também insere símbolos, dificultando a leitura, mas, se necessário, posso encontrar um pager diferente, ainda assim uma resposta válida. :) Obrigado.
Peter Boughton
1
Que símbolos são acrescentados que dificultam a leitura? Talvez eu consiga editar minha resposta para resolver esse problema também.
SpoonMeiser 30/09/08
Principalmente "<- [m" para cada nova linha (onde <- era um único caractere de seta), mas também marcadores onde (acho) cada cor teria começado, como "<- [1m" e "<- [32m".
22878 Peter Boughton
1
O argumento --no-color ajuda em tudo? Não tenho certeza sobre os caracteres da nova linha.
SpoonMeiser 01/10/08
Sim, obrigado, isso impede que todo o conteúdo indesejado apareça, portanto os da nova linha também devem ter relação com cores.
Peter Boughton
229

Ou, se você usar menos como pager padrão, basta digitar -Senquanto visualiza o diff para reativar o agrupamento em menos.

alguem45
fonte
60
ponta relacionada, utilizar --word-diffpara ver um destacando de palavras alteradas codificados por cor
Josh Diehl
5
apenas uma nota para este desde que eu vi algumas pessoas estavam tendo problemas com ele, -S é diferente de -S (certifique-se que você está acertando shift + s)
Longda
2
@ JoshDiehl: Espero que você não se importe ... Acho que a --word-diffparte merece ter sua própria resposta, pois me parece muito ajudar a resolver o problema subjacente: descobrir o que mudou em uma longa linha. Então, eu fiz isso um: stackoverflow.com/a/19253759/313756
lindes
1
Nota: isso parece não funcionar no OS X (independentes).
DilithiumMatrix
@zhermes Funciona para mim no Mavericks, com menos 418. Verifique se você está digitando -Scom S maiúsculo, não -s. Menos exibe uma mensagem “Dobrar linhas longas (pressione RETURN)” na parte inferior após digitar -Se, em seguida, pressionar Retornar ativa a quebra.
Rory O'Kane 14/10
115

Você também pode usar git configpara configurar o pager para quebrar.

$ git config core.pager 'less -r' 

Define a configuração do pager para o projeto atual.

$ git config --global core.pager 'less -r' 

Define o pager globalmente para todos os projetos

Shoan
fonte
3
com msysgit (1.8.1.msysgit.1) ele trabalhou para mim usando aspas duplas -git config --global core.pager "less -r"
kerim
Isso me deixou envolvida permanentemente com o git diff no OS X. obrigado!
21414 Thompson Comer
Funciona, mas não entendo o porquê. Alguém pode explicar? man less, -rnão diz nada sobre a embalagem.
Ciro Santilli escreveu
@ ThomsonComer '-r' refere-se à exibição de caracteres de controle no OS X ... Como você conseguiu isso?
DilithiumMatrix
49

Com total crédito a Josh Diehl em um comentário a esta resposta , no entanto, sinto que isso deveria ser uma resposta em si mesma, acrescentando-a:

Uma maneira de lidar com as diferenças nas linhas longas é usar um diff orientado a palavras. Isso pode ser feito com:

git diff --word-diff

Nesse caso, você obterá uma saída diff significativamente diferente, que mostra especificamente o que mudou dentro de uma linha.

Por exemplo, em vez de obter algo parecido com isto:

diff --git a/test-file.txt b/test-file.txt
index 19e6adf..eb6bb81 100644
--- a/test-file.txt
+++ b/test-file.txt
@@ -1 +1 @@
-this is a short line
+this is a slightly longer line

Você pode obter algo parecido com isto:

diff --git a/test-file.txt b/test-file.txt
index 19e6adf..eb6bb81 100644
--- a/test-file.txt
+++ b/test-file.txt
@@ -1 +1 @@
this is a [-short-]{+slightly longer+} line

Ou, com colorização, em vez disso:

resultado de apenas <code> git diff </code>

Você pode obter o seguinte:

resultado de <code> git diff --word-diff </code>

Agora, se você estiver comparando uma linha muito longa, ainda poderá ter problemas com a situação do pager que descreveu originalmente e que foi abordada, aparentemente para satisfação, em outras respostas. Espero que isso ofereça uma nova ferramenta, no entanto, para identificar mais facilmente o que mudou na linha.

lindes
fonte
6
Existem algumas opções para --word-diff: color, plaine porcelain. Além disso, pode-se alterar o regex para os limites de palavras --word-diff-regex. O padrão parece ser \S+. ( v2.1.1 )
Michael - Onde está Clay Shirky
3
--color-wordsparece ser uma abreviação --word-diff=color, o que é bom quando você está apenas visualizando o diff, não o compartilhando.
CivFan 04/12/2015
Ah, isso é interessante e potencialmente muito útil. Obrigado por compartilhar!
Darragh Enright
1
Eu gosto --word-diff=porcelainmais do que --word-diffporque porcelainalinhará as alterações em linhas separadas, enquanto --word-diffcolocá- las em linha. Linhas separadas permitem ver as diferenças mais facilmente quando as diferenças são sutis.
19419 wisbucky
1
Mudança de vida para arquivos LaTeX!
6005
30

Para usar menos como pager e tornar a quebra automática de linha permanente, basta ativar a opção dobrar linhas longas:

git config --global core.pager 'less -+S'

Dessa forma, você não precisa digitá-lo enquanto usa menos.

Felicidades

Daniel Montezano
fonte
Trabalhou para mim no OS X 10.9.5. Obrigado!
Jay Taylor
Da mesma forma, se você quiser DESATIVAR a quebra de linha ao ler as diferenças do Git, a configuração é semelhante:git config --global core.pager 'less -S
Topher Hunt
19

Apenas pesquisei este aqui. GIT_PAGER='less -r'funciona para mim

peixe cantando
fonte
9
Ainda melhor (para mim): less -R(Na verdade, eu uso less -eiFRSX, que problemas de cor resolve e linha-wrap também.)
cdunn2001
2
menos -R é como -r, mas apenas seqüências de escape de "cor" ANSI são exibidas no formato "bruto". Ao contrário de -r, a aparência da tela é mantida corretamente na maioria dos casos. (homem menos)
richk 26/09/14
19

Mac OSX: Nenhuma das outras respostas, exceto o '-S' de alguém45, enquanto menos está funcionando, funcionou para mim. Foi necessário o seguinte para tornar a quebra de linha persistente:

git config --global core.pager 'less -+$LESS -FRX'
John Lemberger
fonte
Isso funcionou para mim também, mas não entendo o porquê. O que o -+$LESSparâmetro está fazendo? A menos que o git o defina, minha variável de ambiente LESS nem está definida.
Jakar
3
@jakar: então não faz nada. Em alguns ambientes, $LESSé definido com algum valor (por exemplo, por um .loginou um .profileou algo), e acho que essa opção apenas adiciona os padrões e depois os acrescenta -FRX.
precisa
Isso não funcionou para mim no OS X Mavericks, $LESSé indefinido.
DilithiumMatrix
naught101 está correto que + - $ LESS inclui simplesmente as configurações em .login ou .profile (se houver). Está funcionando bem no Mavericks para mim, mas você pode omiti-lo, se causar problemas.
31714 John Lemberger
5

Quando você estiver usando "git diff" e estiver mostrando várias páginas (você vê ":" no final da página), nesse caso, você pode digitar "-S" e pressionar Enter (S deve ser maiúsculo). irá alternar entre dobrar linhas longas.

Amin
fonte
esta é a maneira mais fácil do que ter que mexer com qualquer configuração
chharvey
4

Ninguém apontou isso até agora. É bem simples de lembrar e nenhuma configuração extra precisa ser feita na configuração do git

git diff --color | less -R
infoclogged
fonte
De longe, a mais simples de todas as respostas nesta página. Meu ambiente - Oracle Linux 7.6. git diff --color | less -FRpara pequenas alterações quando não precisa de rolagem
Rakesh N
3

Você pode simplesmente canalizar a saída do git diff para mais:

git diff | more
AnonTidbits
fonte
3

Não é uma solução perfeita, mas gitke git-guipode mostrar tanto esta informação, e ter barras de rolagem.

Peter Boughton
fonte
1

liste a configuração atual / padrão:

  $ git config --global core.pager  
    less -FXRS -x2

atualize e deixe de fora o -S como:

  $ git config --global core.pager 'less -FXR -x2'

-S: Faz com que as linhas maiores que a largura da tela sejam cortadas em vez de dobradas.

user5870226
fonte
-1

Quando estou com problemas, costumo recorrer ao DiffMerge. Excelente ferramenta diff que possui destaque de diff em linha. Além disso, nas versões mais recentes, eles adicionaram um modo para ter um modo horizontal.

Eu não consegui configurar o git para usá-lo. Então, eu tenho que me esforçar para obter as duas versões do arquivo primeiro.

webmat
fonte