Como obter diff trabalhando como git-diff?


148

Eu gosto da formatação de saída git diff. A cor e a +/ -representação das alterações entre as linhas são mais fáceis de ler do que o GNU diff.

Eu posso executar git diffusando --no-indexflag fora de um repositório git e funciona bem. No entanto, parece estar faltando a --excludeopção para excluir arquivos ou subdiretórios de uma recursiva diff.

Existe uma maneira de obter o melhor dos dois mundos? (opções de cores e +/ -formato git diffe --excludeopção de GNU diff).

Eu experimentei colordiff, mas ainda prefiro o formato de saídagit diff


1
Para fazer o azul para adições verde, alterações newtextno /etc/colordiff. Eu acho que o git usa verde?
Rudie

1
Eu nunca tinha ouvido falar da bandeira --no-index até agora. Eu apenas o usei para comparar a saída do git show com a diferença de dois arquivos - obrigado por isso!
AJM-Reinstate-Monica

Respostas:


175

Eu não sei como fazer cores, mas isso fará o +/-melhor que <e >.

diff -u file1 file2

6
Legal, isso combinado com o colordiff me deixa perto o suficiente do que eu quero. Acho que preciso rolar mais para baixo na página de manual da próxima vez ... Obrigado!
Mzzzzzz

13
Uma maneira simples de obter colorização com diff -u, também é canalizar a saída para tig, o comando git repo espectador: diff -u file1 file2 | tig.
Samuel Lampa 02/09

3
Instale a colordiffpartir do seu repositório apt / yum / pacman e use-o.
iBug 29/07

Necessários para permitir pacotes extras para Enterprise Linux (EPEL) na Amazon Linux para instalar colordiff: docs.aws.amazon.com/AWSEC2/latest/UserGuide/...
Pat Myron

1
Além disso colordiff, você também pode obter cores vimdefinindo cdiff() { diff -u $@ | vim -R -; }.
Syrtis Major

94

Você também pode usar git diff --no-index -- A B(via página de manual ).


1
+1, mas infelizmente isso não funciona se um dos arquivos for um link simbólico.
Emil Lundberg

2
+1 Isso é muito útil, pois mostra como fazer um relatório git onde dois arquivos rastreados Ae Bdiferem em comparação um com o outro, em vez de onde cada arquivo foi modificado em relação à sua última revisão respectiva.
23415 J. Katzwinkel

@EmilLundberg: funciona para mim com links simbólicos no git 1.9.1 no Linux. Não sei se as versões anteriores estão quebradas.
kkm

3
git diff --no-indexé ótimo, mas como o OP apontou, ele não possui a --excludebandeira, portanto é frequentemente de utilidade muito limitada.
Ken Williams

25
  1. Instale o colordiff .

  2. Atualize seu ~ / .colordiffrc (copiando / etc / colordiffrc primeiro, se necessário):

    # be more git-like:
    plain=off
    newtext=darkgreen
    oldtext=darkred
    diffstuff=darkcyan
    
  3. Use colordiff -u file1 file2para dois arquivos ou colordiff -ruN path1 path2para comparar recursivamente caminhos.

Não é exatamente o mesmo, mas é muito próximo.


18

Isto é o que eu sugiro e é bem próximo

diff -u FILE1 FILE2 | colordiff | less -R
  • colordiff: Você terá que instalar este
  • -R: indica menos para mostrar cores em vez dos códigos brutos.

Eu finalmente usei -wporque não queria ver diferenças de espaço em branco.

diff -w -u FILE1 FILE2 | colordiff | less -R

Edit: Como sugerido por @Ciprian Tomoiaga no comentário, você pode tornar isso uma função e colocá-lo em seu ~/.bashrcarquivo também.

function gdiff () { diff -u $@ | colordiff | less -R; }

4
Para se ter uma única função do bash para este complemento ao .bashrc:function gdiff () { diff -u $@ | colordiff | less -R; }
Ciprian Tomoiagă

4

O GNU difftem uma --coloropção desde a versão 3.4 no final de 2016, de acordo com esta resposta no Unix SE. Isso ao lado -udeve ser suficiente para imitar a saída de git diff:

diff -u --color=always file1 file2 | less -r

--colordeve ser alwaysquando usado em um tubo, autoirá desligar a cor nos tubos.

Eu só tentei isso com o Git Bash no Windows, onde less -Rapenas coloriria a primeira linha de um pedaço. less -rconsertou para mim nesse caso.


3

Usando apenas bash, diff, tput, e less, podemos aproximar de perto a saída git diff. Haverá algumas diferenças notáveis, porém, devido à miopia dos diffprogramadores.

Coloque a seguinte definição de função Bash em algum arquivo obtido automaticamente pela sua conta de usuário e você poderá acessar a função na linha de comando:

function gdiff()
{
    local REG=`tput op`
    local GRP=`tput setaf 6`
    local ADD=`tput setaf 2`
    local REM=`tput setaf 1`

    local NL=$'\n'
    local GRP_LABEL="${GRP}@@ %df,%dn +%dF,%dN @@${REG}"

    local UNCH_GRP_FMT=''

    [[ "${1}" == '@full' ]] && {

        UNCH_GRP_FMT="${GRP_LABEL}${NL}%="
        shift
    }

    diff \
        --new-line-format="${ADD}+%L${REG}" \
        --old-line-format="${REM}-%L${REG}" \
        --unchanged-line-format=" %L${REG}" \
        --new-group-format="${GRP_LABEL}${NL}%>" \
        --old-group-format="${GRP_LABEL}${NL}%<" \
        --changed-group-format="${GRP_LABEL}${NL}%<%>" \
        --unchanged-group-format="${UNCH_GRP_FMT}" \
            "${@}" | less -FXR
}

Esta função funciona da seguinte maneira:

  1. Por fim, diffé chamado com várias opções de formatação para especificar como as alterações nos arquivos serão exibidas.
  2. tputé usado para inserir códigos de cores ANSI nessas opções de formatação. Observe que, ao usar terminais não-ANSI, talvez seja necessário substituí-lo tput setafpor tput setf.
  3. A saída de diffé canalizada para less. -Rpermite que as cores ANSI sejam preservadas. -Ximpede lessde limpar a tela ao sair. -Fimpede a lessoperação como pager se a saída couber em uma tela.
  4. Se o primeiro parâmetro for @full, a função exibirá todas as linhas inalteradas, além das linhas adicionadas e removidas.

Observe as seguintes diferenças entre essa abordagem e git diff:

  1. git diffrelata três linhas de contexto em torno de cada alteração. Infelizmente, diffparece reclamar e sair se você quiser especificar o número de linhas de contexto e ao mesmo tempo especificar opções de formatação. (Pelo menos no Mac OS X Yosemite). Obrigado diffprogramadores. Portanto, você pode solicitar nenhuma linha de contexto ao redor de cada alteração, que é o comportamento padrão, ou pode solicitar que todas as linhas inalteradas no arquivo também sejam relatadas, especificando @fullcomo o primeiro parâmetro.
  2. Como as linhas de contexto são diferentes git diff, os números de linhas relatados por esta função também variam dos informados por git diff.
  3. Você pode ver a presença de alterações de linha única relatadas, que é o comportamento correto, mas irritante quando o arquivo alterado contém a inserção de linhas vazias únicas. Eu acho que git difflida melhor com isso, através de suas linhas de contexto. Você pode tentar passar opções diferentes diffpara lidar melhor com espaços em branco, se preferir.


2

Coloque isso em seu .bashrcou .zshrc:

diff() { git diff --no-index "$1" "$2" | colordiff; }

requirments: gite colordiffdeve ser instalado com antecedência.

uso: diff file1 file2

exemplo: por $diff .tmux.conf .zshrc.pre-oh-my-zsh

exemplo de função diff


0

A outra opção é fazer isso de fora do repositório para que o git saiba diferenciar os arquivos. por exemplo. uma função shell algo como:

gdiff() {
    (
        dir=`pwd`
        cd ./$(git rev-parse --show-cdup)/..
        git diff  $dir/$1 $dir/$2
    )
}

0

Use colordiff :

Instalação:

sudo apt-get install colordiff

Uso:

colordiff -u file_one file_two

Dá exatamente a mesma diferença mostrada por git diff.


0

Se você não tiver colordiffou git diff, poderá obter cores vim.

cdiff() { diff -u $@ | vim -R -; }

ou simplesmente

cdiff() { diff -u $@ | view -; }

0

Como o morcego tem uma coloração agradável, testei se isso também funciona diffe surpreendentemente funcionou muito bem fora da caixa.

$ diff file1 file2 | bat ou $ diff -u file1 file2 | bat

Então, suponho que você possa fazer uma função como esta abaixo para ser mais eficiente:

function bdiff () { diff -u $@ | bat;}


-2

Eu acho que a configuração:

[color]
     ui = true

combinado com a --relative=<path>opção do comando "diff" faria o que você queria. Você tentou ?


3
Isto é para o diferencial git. Ele estava pedindo para as diffopções do programa
tr33hous
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.