Como obter git diff com contexto completo?


115

Como criar remendo adequado para revisão no cadinho?

git diff branch master --no-prefix > patch

Isso gera apenas 3 linhas de contexto. Então eu faço o seguinte

git diff --unified=2000 branch master --no-prefix > patch

Esperançosamente, todos os arquivos terão menos de 2.000 linhas. Existe uma maneira de dizer ao git para incluir todas as linhas no arquivo para patch sem ter que especificar o máximo de linhas?


3
Postei a opção -U <infinity> para mostrar o arquivo inteiro, como uma pergunta separada stackoverflow.com/questions/28727424/…
Aleksandr Levchuk

Respostas:


55

Eu sei que isso é antigo, mas também não gosto de soluções codificadas, então testei isto:

git diff -U$(wc -l MYFILE)

Usar -U parece ser a única maneira de abordar o problema, mas usar uma contagem de linha promete que funcionará até mesmo para uma pequena alteração em um arquivo muito grande.


1
<não é necessário. git diff -U$(wc -l MYFILE) MYFILE
balki

2
Obrigado @balki, tentei sua sugestão e percebi que <pre> $ (wc -l MYFILE) </pre> se expande para a contagem de linhas seguida pelo nome do arquivo, portanto, o segundo uso do nome do arquivo também pode ser omitido. Estou atualizando minha resposta para refletir isso.
Esdras

4
É um diff, existem duas versões do arquivo. E se a versão que não está no disco fosse duas vezes mais longa? Não é -U com um número muito grande realmente mais seguro?
Eloff de

@Eloff, é verdade, a melhor maneira seria maximizar os comprimentos, já que números realmente grandes ainda têm o problema oposto. Esta solução pressupõe que nenhuma exclusão contínua maior que o tamanho do arquivo atual no disco foi feita.
Esdras

3
git diff -U$(wc -l MYFILE | awk '{print $1}') MYFILEé uma resposta melhor que analisa corretamente a saída de wcobtendo apenas o número de linhas sem espaços em branco, não depende da saída não citada de um subshell para criar dois argumentos e funciona no macOS / BSD.
anishpatel

95

Isso parece funcionar muito bem:

git diff --no-prefix -U1000

Com a ressalva:

A -Ubandeira especifica linhas de contexto. Pode ser necessário aumentar isso se houver mais de 1000 linhas entre as alterações.


16
A -Uopção que você sugere é a mesma --unified=usada pelo autor da pergunta. A única diferença é que você especifica menos linhas de contexto, 1000, do que o autor da pergunta, 2000. @balki queria saber como aumentar o número para o infinito, mas você sugere cortar o número pela metade. Por quê?
LS

4
@LS: sim, eu percebo agora, mas esqueci isso alguns anos atrás. Ainda assim, é um pouco mais aparente o que está acontecendo do que na pergunta e parece ajudar a pessoa estranha que chega aqui.
c24w

Obrigado por isso, também funciona muito bem com git show!
Shakeel de

@ c24w Concordo, ainda me dá o que eu quero ver na tela.
Chef Faraó

1
A --no-prefixopção elimina os prefixos de destino “/ a /” e “/ b /” que aparecem por padrão. (página vinculada)
luckydonald

10

Observação: o anúncio git1.8.1rc1 (8 de dezembro de 2012) inclui:

Uma nova variável de configuração " diff.context" pode ser usada para fornecer o número padrão de linhas de contexto na saída do patch, para substituir o padrão codificado de 3 linhas.

então isso poderia ajudar, aqui, a gerar um contexto mais completo.


7
No entanto, isso não tem a opção de dizer "Todas as linhas do arquivo"
balki

3
Eu suspeito que colocar um grande número, que simularia "todas as linhas"
VonC

7
"Eu suspeito que colocar um número grande, que simularia" todas as linhas "" ... exceto quando não funciona e então as coisas quebram. Tudo é sinônimo de infinito, e um número muito grande é apenas isso - um número, não infinito.
Trenton

4

Tive inspiração e adicionei um apelido git.

$ cat ~/.gitconfig | fgrep diff
        df = "!git diff -U$(wc -l \"$1\" | cut -d ' ' -f 1) \"$1\""
$ git df <file>

Atualizar:

Acabei de encontrar "git df" às vezes não funciona, devido à mudança de diretório ao executar git alias. (Veja git aliases operam no diretório errado ). Portanto, esta é a versão atualizada:

$ cat ~/.gitconfig | fgrep df
        df = "! [ \"$GIT_PREFIX\" != \"\" ] && cd \"$GIT_PREFIX\"; ~/bin/git_df.sh"
$ 
$ cat ~/bin/git_df.sh
#!/bin/bash
for FILE in $@; do
    git diff -U$(wc -l "${FILE}" | cut -d ' ' -f 1) "${FILE}"
done
exit 0


0

Soluções aceitas anteriormente não funcionam para mim ao visualizar um arquivo / confirmação específico (a -Uopção parece mexer com a análise de rev / caminho), mas --inter-hunk-context=funciona neste caso em git version 2.24.0:

git diff \
    --no-prefix \
    --inter-hunk-context=2000 \
    master -- \
        path/to/file.py

Se você não sabe o tamanho do arquivo, é claro que pode encontrá-lo em wc -lvez de codificá-lo:

git diff \
    --no-prefix \
    --inter-hunk-context=$(wc -l path/to/file.py) \
    master -- \
        path/to/file.py
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.