Quando faço a git diff
ou a git log -p
, como obtenho os números das linhas do (s) arquivo (s) de origem alinhados com a saída?
Tentei pesquisar man git-diff | grep "line numbers"
e pesquisar no Google, mas não obtive nada rapidamente.
Quando faço a git diff
ou a git log -p
, como obtenho os números das linhas do (s) arquivo (s) de origem alinhados com a saída?
Tentei pesquisar man git-diff | grep "line numbers"
e pesquisar no Google, mas não obtive nada rapidamente.
Respostas:
git diff
Atualmente não há opções para exibir os números das linhas verticalmente ao lado com git diff
.
Essa informação está disponível nos (c) cabeçalhos de bloco para cada mudança no diff, porém, está apenas no formato de diff unificado :
@@ -start,count +start,count @@
O estado original do arquivo é representado com -
, e o novo estado é representado com +
(eles não significam adições e exclusões no cabeçalho do pedaço. start
Representa o número da linha inicial de cada versão do arquivo e count
representa quantas linhas estão incluídas , começando do ponto inicial.
diff --git a/osx/.gitconfig b/osx/.gitconfig
index 4fd8f04..fcd220c 100644
--- a/osx/.gitconfig
+++ b/osx/.gitconfig
@@ -11,7 +11,7 @@ <== HERE!
[color "branch"]
upstream = cyan
[color "diff"]
- meta = yellow
+ meta = cyan
plain = white dim
old = red bold
new = green bold
O cabeçalho do pedaço
@@ -11,7 +11,7 @@
diz que a versão anterior do arquivo começa na linha 11 e inclui 7 linhas:
11 [color "branch"]
12 upstream = cyan
13 [color "diff"]
14 - meta = yellow
14 + meta = cyan
15 plain = white dim
16 old = red bold
17 new = green bold
enquanto a próxima versão do arquivo também começa na linha 11 e também inclui 7 linhas.
Como você provavelmente pode dizer, o formato de diff unificado não torna fácil descobrir os números das linhas (pelo menos se você não for uma máquina). Se você realmente deseja números de linha que possam ler, você precisará usar uma ferramenta de comparação que os exibirá para você.
--unified=0
ou -U0
, no entanto.
git diffn
, uma substituição drop-in (invólucro) git diff
que mostra números de linha e tem compatibilidade total com todos os usos e opções de git diff
: stackoverflow.com/questions/24455377/…
Aqui estão mais duas soluções, expandindo o código de Andy Talkowski.
Texto simples:
git diff | gawk 'match($0,"^@@ -([0-9]+),[0-9]+ [+]([0-9]+),[0-9]+ @@",a){left=a[1];right=a[2];next};\
/^(---|\+\+\+|[^-+ ])/{print;next};\
{line=substr($0,2)};\
/^-/{print "-" left++ ":" line;next};\
/^[+]/{print "+" right++ ":" line;next};\
{print "(" left++ "," right++ "):"line}'
Texto colorido, supondo que \033[66m
seja o formato dos códigos de cores:
git diff --color=always | \
gawk '{bare=$0;gsub("\033[[][0-9]*m","",bare)};\
match(bare,"^@@ -([0-9]+),[0-9]+ [+]([0-9]+),[0-9]+ @@",a){left=a[1];right=a[2];next};\
bare ~ /^(---|\+\+\+|[^-+ ])/{print;next};\
{line=gensub("^(\033[[][0-9]*m)?(.)","\\2\\1",1,$0)};\
bare~/^-/{print "-"left++ ":" line;next};\
bare~/^[+]/{print "+"right++ ":" line;next};\
{print "("left++","right++"):"line;next}'
O código altera as linhas que começam com -
e +
para -1:-
e +1:+
, respectivamente, e as linhas que começam com nada para
(5,6):
. Os números são os números das linhas do respectivo arquivo.
git diff
mantém o alinhamento cuidadosamente. Este código está acima da minha cabeça no momento, então você estaria disposto a corrigi-lo? Em outras palavras, quando uma linha diz +240:+
e a próxima diz (241,257):
, você precisa adicionar alguns espaços extras à linha superior para fazer seu código manter o alinhamento e recuo adequados com o código da linha inferior. Talvez isso pudesse ser feito facilmente com impressão?
printf
.
git diffn
. Veja aqui: stackoverflow.com/a/61997003/4561887 . Obrigado @PFudd, por sua resposta. Estudei e usei para aprender, então comecei do zero e escrevi git diffn
. Uma vez formatado para que eu pudesse ler seu código (obrigado @EdMorton), pude aprender algumas coisas excelentes que me ajudaram.
Aqui está um script que tenta consertar isso - não testei com raiva, mas parece ok. Ele se baseia nos registros que git diff produz e usa awk para manter contagens de linha.
# Massage the @@ counts so they are usable
function prep1() {
cat | awk -F',' 'BEGIN { convert = 0; }
/^@@ / { convert=1; }
/^/ { if ( convert == 1 ) { print $1,$2,$3;
} else { print $0;
}
convert=0;
}'
}
# Extract all new changes added with the line count
function prep2() {
cat | awk 'BEGIN { display=0; line=0; left=0; out=1;}
/^@@ / { out=0; inc=0; line=$4; line--; display=line; left=line; }
/^[-]/ { left++; display=left; inc=0; }
/^[+]/ { line++; display=line; inc=0; }
/^[-+][-+][-+] / { out=0; inc=0; }
/^/ {
line += inc;
left += inc;
display += inc;
if ( out == 1 ) {
print display,$0;
} else {
print $0;
}
out = 1;
inc = 1;
display = line;
}'
}
git diff $1 | prep1 | prep2
Você pode usar git difftool
para fazer a comparação com um editor externo que exibirá os números das linhas. Veja como fazer isso com vim / vimdiff:
Defina vimdiff como difftool do git:
git config --global diff.tool vimdiff
Configure ~/.vimrc
para mostrar automaticamente os números de linha ao usar o vimdiff:
if &diff
set number
endif
Execute git difftool, que usará vimdiff com números de linha:
git difftool
Uma maneira rápida é usar git diff -U0
. Isso definirá as linhas de contexto como 0, o que fará com que os valores @@ correspondam às linhas realmente alteradas. Por padrão, os valores @@ incluem 3 linhas de contexto antes / depois, o que não é conveniente para humanos.
Exemplo:
git diff # default
@@ -10,8 +10,8 @@
É difícil calcular os números das linhas alteradas porque a linha 10 se refere à primeira linha do contexto anterior. O número da linha real da primeira linha alterada é 10 + 3 = 13. Para calcular o número de linhas alteradas, você também deve subtrair o contexto antes e depois: 8-3-3 = 2.
git diff -U0
@@ -13,2 +13,2 @@
Como você pode ver, definir context = 0 torna os valores @@ mais fáceis de ler. Você pode ver que as linhas alteradas começam na linha 13 e há 2 linhas alteradas.
Isso não é perfeito, pois mostra apenas o número da linha de cada bloco. Se você quiser ver os números de cada linha, use o difftool para um editor externo. Consulte https://stackoverflow.com/a/50049752
Eu gosto de usar git difftool
com fusão como o meu difftool. É mais fácil de olhar do que git diff
, tem uma bela comparação de interface de usuário lado a lado e mostra os números das linhas em cada lado.
Recentemente, escrevi git diffn
nos últimos dias para ser um substituto imediato para git diff
a linha de comando. Dê uma chance. Veja minha outra resposta aqui .
A partir de 24 de maio de 2020, você pode usar a ferramenta de terceiros git diffn
(divulgação completa: eu a escrevi) para essa finalidade. É um invólucro leve git diff
, escrito na awk
linguagem de programação baseada em padrão / ação. Aqui está um exemplo de resultado da execução git diffn
:
Aqui está uma demonstração:
git diffn
:Crie este arquivo:
hello_world.c:
#include <stdio.h>
int main()
{
printf("Hello World\n");
return 0;
}
Comprometa:
git add hello_world.c
git commit -m "add hello_world.c"
Altere para isto e salve o arquivo:
hello_world.c:
// Basic hello world example
#include <stdio.h>
int main(int argc, char *argv[])
{
printf("Hello Gabriel\n");
int i = 700;
printf("i = %i\n", i);
return 0;
}
Agora execute:
git diff
Aqui está o resultado do git diff
primeiro para fins de comparação:
$ git diff
diff --git a/hello_world.c b/hello_world.c
index e01704a..e971b73 100644
--- a/hello_world.c
+++ b/hello_world.c
@@ -1,8 +1,12 @@
+// Basic hello world example
+
#include <stdio.h>
-int main()
+int main(int argc, char *argv[])
{
- printf("Hello World\n");
-
+ printf("Hello Gabriel\n");
+
+ int i = 700;
+ printf("i = %i\n", i);
return 0;
-}
\ No newline at end of file
+}
E uma captura de tela para mostrar a cor. Observe que a seção destacada em vermelho está simplesmente mostrando espaços em branco vazios (espaços neste caso) que podem ser excluídos:
Agora, aqui está o resultado de git diffn
. Observe que ele mostra todos os números de linha perfeitamente!
-
sinal na extrema esquerda E à direita do :
para ajudá-lo a ver melhor - se seus olhos gostam de escanear para a direita do cólon ou para baixo na extremidade esquerda da tela.+
sinal tanto na extrema esquerda quanto à direita de :
.,
.Saída de git diffn
:
$ git diffn
diff --git a/hello_world.c b/hello_world.c
index e01704a..e971b73 100644
--- a/hello_world.c
+++ b/hello_world.c
@@ -1,8 +1,12 @@
+ 1:+// Basic hello world example
+ 2:+
1, 3: #include <stdio.h>
2, 4:
- 3 :-int main()
+ 5:+int main(int argc, char *argv[])
4, 6: {
- 5 :- printf("Hello World\n");
- 6 :-
+ 7:+ printf("Hello Gabriel\n");
+ 8:+
+ 9:+ int i = 700;
+ 10:+ printf("i = %i\n", i);
7, 11: return 0;
- 8 :-}
\ No newline at end of file
+ 12:+}
E uma captura de tela para mostrar a cor. Observe que os dois pontos NÃO são coloridos ou estilizados para corresponder ao texto ao redor à esquerda e à direita. Este é um comportamento intencional e projetado para agir como um separador visual entre os números de linha adicionados à esquerda e a git diff
saída original à direita.
Do topo degit-diffn.sh
:
DESCRIÇÃO:
git-diffn.sh
um substituto git diff
instantâneo para o qual também mostra a linha 'n' números! Use-o exatamente como git diff
, exceto que você verá esses belos números de linha também para ajudá-lo a entender suas alterações.
uma vez que é apenas um wrapper leve baseado em linguagem awk git diff
, ele aceita TODAS as opções e parâmetros que git diff
aceita. Exemplos:
git diffn HEAD~
git diffn HEAD~3..HEAD~2
funciona com qualquer uma das suas git diff
configurações de cor, mesmo se você estiver usando cores personalizadas
Veja minha resposta aqui para saber como definir cores de diff personalizadas, bem como para ver uma captura de tela da saída de cor personalizada de git diffn
: Como você personaliza a cor do cabeçalho diff no git diff?
Aqui estão alguns exemplos de git config
comandos da minha resposta acima para definir git diff
cores e atributos personalizados (formatação de texto):
git config --global color.diff.meta "blue"
git config --global color.diff.old "black red strike"
git config --global color.diff.new "black green italic"
git config --global color.diff.context "yellow bold"
entrada git diffn
, a saída de cores está ativada por padrão; se quiser desabilitar a cor de saída, você deve usar --no-color
ou --color=never
. Veja man git diff
para detalhes. Exemplos:
git diffn --color=never HEAD~
git diffn --no-color HEAD~3..HEAD~2
gawk
. Se assim for, tente este : brew install gawk
.Opção 1 (minha recomendação): baixe todo o repo e, em seguida, crie um link simbólico para o programa para que você possa receber atualizações facilmente fazendo um a git pull
partir do repo sempre que quiser.
Primeiro, cd
para onde você deseja instalar isso. Então corra:
git clone https://github.com/ElectricRCAircraftGuy/eRCaGuy_dotfiles.git
cd eRCaGuy_dotfiles/useful_scripts
mkdir -p ~/bin
ln -si "${PWD}/git-diffn.sh" ~/bin/git-diffn
Feito! Agora basta fazer a etapa final abaixo!
Opção 2 (para quem quer apenas 1 arquivo): baixe apenas um arquivo uma vez.
mkdir -p ~/bin
cd ~/bin
wget https://raw.githubusercontent.com/ElectricRCAircraftGuy/eRCaGuy_dotfiles/master/useful_scripts/git-diffn.sh
chmod +x git-diffn.sh
mv git-diffn.sh git-diffn
Feito! Agora basta fazer a etapa final abaixo!
Passo final:
Agora feche e reabra o seu terminal, ou re-fonte com . ~/.bashrc
, e pronto!
git diffn
agora funcionará como um substituto exato para o git diff
!
Podes tentar
git blame
no arquivo. Ele mostra o committer, o id do commit e o número da linha para cada linha no arquivo.
git blame
mostrará apenas o estado atual do arquivo com os números das linhas.
git blame
de forma alguma responde à pergunta; Estou muito perplexo com os votos positivos aqui
git diff --unified=0 | grep -Po '^\+\+\+ ./\K.*|^@@ -[0-9]+(,[0-9]+)? \+\K[0-9]+(,[0-9]+)?(?= @@)'