Quando eu faço um diff do git, ele mostra as linhas que foram adicionadas:
+ this line is added
linhas que foram removidas:
- this line is removed
mas também mostra muitas linhas que não são modificadas:
this line is not modified
this line is also not modified
Isso resulta no diff real do git parecido com este:
+ this line is added
this line is not modified
- this line is removed
this line is not modified
Posso pedir ao git para mostrar apenas as linhas que foram modificadas e ignorar todos os outros códigos que não foram modificados? Eu escrevi um método que removerá todas as linhas que não têm um sinal de "+" ou "-" na frente delas, mas tenho certeza de que deve haver uma maneira mais simples de fazer isso.
No meu git diff, estou interessado apenas em ver as linhas que foram modificadas.
Desde já, obrigado.
git diff | egrep "^(\+|-) "
.git config --global diff.context 0
para tê-lo definido globalmenteOutro hack (em un * x) para mostrar apenas as linhas que começam com
+
e-
:O código acima faz o seguinte:
git diff -U0
: escolha 0 linhas de contexto+
ou-
--- a/
ou+++ b/
Cor
Para mostrar diferenças coloridas, tente o seguinte:
^\e\[[^m]*m[-+]
procura o início da linha (^
), o caractere de escape (\e
) seguido pelo[
qual juntos iniciam a sequência de escape e, em seguida, qualquer caractere que não seja um "m" (números, ponto-e-vírgula ou nada), seguido por um " m "que termina a sequência de escape.\e[0m
(redefinir),\e[m
(também redefinir),\e[1m
(negrito ativado),\e[31m
(vermelho),\e[32m
(verde),\e[9;31m
(riscar + vermelho),\e[31;9m
(vermelho + riscar),\e[1;4;9;31m
(negrito + sublinhado + riscar + vermelho). As cores padrão do git usam vermelho e verde, mas podem ser reconfiguradas.--color
é o mesmo que--color=always
.--- a/
ou+++ b/
a aparecer no início da linha foi removida para acomodar as seqüências de escape e isso pode levar a um caso extremo.Notas Adicionais:
-R
,--src-prefix
,--dst-prefix
,--no-prefix
, etc.grep -E -v '^(\+\+\+ b/|--- a/|@@ |diff --git|index )'
, mas acho a versão do grep duplo mais fácil de entender.fonte
git diff
linhas do tipo "cabeçalho" que começam com@@
, mas o que sãogit diff
linhas que começam com---
ou+++
? Eu não estava ciente desses.+++
) ou exclusões (---
). Vejo isso aqui agora: git-scm.com/docs/git-diff#_combined_diff_format .--- a/filename
parece indicar o "arquivo à esquerda" ou o arquivo como era antes e+++ b/filename
parece indicar o "arquivo à direita" ou o arquivo como está agora com suas alterações. Estou tão acostumado a usar ogit difftool
meld , que mostra belas comparações lado a lado, que nunca me acostumei a olhargit diff
, então ainda me parece estranho, e nunca olhei essas nuances antes.Após o comentário mais recente de Chris, o principal problema com o pós-processamento é que você deseja manter as linhas começando,
-|+
mas também deseja filtrar as que começam com---|+++
. Se você estiver armazenando arquivos de correção no seu repositório (eu faço, no Pydoop ), por outro lado, você deseja manter as linhas que começam com--|++
, para que o regexp se torne um pouco envolvido:O regexp usa uma aparência negativa: consulte a resposta de Peter Boughton para esta pergunta para obter uma explicação detalhada.
Se você fizer isso com frequência, convém configurar um alias para o git:
fonte
-P
ou--perl-regexp
é usado para interpretar o padrão como uma repressão regular do Perl, mas nem sempre é implementado. Não funcionou para mim no OSX. gnu.org/software/grep/manual/grep.html#grep-ProgramsEu acho que, para casos simples, a regex pode ser muito mais curta e fácil de lembrar, com a ressalva de que isso não funcionará se você tiver alterações de linha onde a própria linha começa com
+
ou-
O regex diz que a linha deve começar com
+
ou-
, e o caractere imediatamente seguinte não deve ser nenhum deles. Eu obtive os mesmos resultados, se eu escapei do+
aqui ou não, aliás ...Exemplo:
Digamos que eu mude
C
paraX
,E
paraY
eG
paraZ
.Como eu disse acima, porém, isso é apenas para a maioria dos casos. Se você canalizar essa saída para um arquivo
dout
, tente o mesmo regex, ele não funcionará.De qualquer forma, espero que ajude no seu caso
fonte
- name: No pdb
em um arquivo yaml.Esta resposta manterá as cores vermelho / verde originais para facilitar a leitura. Forneci algumas variações na sintaxe:
Explicação:
git diff --color
é necessário para evitar git desabilitem a cor quando ele é tubulação.grep --color=never
é para evitar grep remover a cor original e destacando o texto correspondente.\e[31m
) ou verdes (\e[32m
).$'...'
(sintaxe ANSI-C entre aspas) ou-P
(sintaxe perl) devegrep
ser interpretada\e
ou\033
como umESC
caractere.fonte
$''
parte me ajudou especialmente. stackoverflow.com/a/61929887/4561887Como usar
awk
para mostrar apenas as linhas+
e-
, respondendo por qualquer forma de cor ou texto,git diff
pode estar gerando:Nenhuma das outras respostas aqui (incluindo minha outra resposta ) fará exatamente o que você deseja 100% corretamente. Esta resposta, no entanto, será. Aqui está um liner que você pode copiar e colar no seu terminal. Acabei de criar várias linhas para facilitar a leitura - você pode copiar e colar da mesma maneira para que eu possa torná-lo legível! Ele se baseia na
awk
linguagem de programação:Aqui estão suas características. Todos esses recursos, quando considerados em conjunto, resolvem as deficiências de todas as outras respostas aqui:
^(\033\[(([0-9]{1,2};?){1,10})m)?
git config
configurações . É por isso que o regex acima tem;?
e{1,10}
nele: se detectar o início de uma cor ou código de formatação de texto, ele irá corresponder a até 10 seqüências de estes códigos ANSI combinados.NÃO inclui também linhas que começam com
@@
a palavradiff
, como a resposta aceita . Se você deseja essas linhas (que, francamente, acho úteis) :), faça o seguinte:ou
Ele mostra a saída da mesma maneira exata que
git diff
faria: noless
pager com saída em cores opcional (-R
), e somente se o texto for> 1 página (-F
), e mantendo a página atual do texto na tela quando vocêq
usar (-X
) .Ele também tem o benefício de ser poderoso e facilmente configurável, pois usa a linguagem de programação awk.
Se você estiver interessado em aprender o awk , veja alguns recursos:
gawk
awk
Manual (GNU ): https://www.gnu.org/software/gawk/manual/html_node/index.html#SEC_Contentsgit diffn
e comentários: https://github.com/ElectricRCAircraftGuy/eRCaGuy_dotfiles/blob/master/useful_scripts/git-diffn.shgit diffn
também, que égit diff
com números de linha, veja aqui: Git diff com números de linha (log do Git com números de linha)Como bônus, também
git diffc
encerrei o item acima para ser usado como , o que significa "git diff para mostrar SOMENTE 'mudanças'". O uso é idêntico agit diff
; basta usargit diffc
! Ele suporta TODAS as opções. A cor está ativada por padrão. Para desligá-lo, basta usargit diffc --no-color
ougit diffc --color=never
. Vejaman git diff
para detalhes.Desde que eu terminei
git diffn
(uma ferramenta para mostrargit diff
com números e linhas) ontem à noite, a escritagit diffc
foi trivial. Achei melhor fazê-lo agora enquanto o conhecimento está fresco na minha cabeça.Instalar
git diffc
:Siga as instruções no final desta resposta aqui , exceto em todos os lugares que você vê
git-diffn
nas instruções, use em seugit-diffc
lugar. Isso inclui também nowget
comando. Baixar e instalargit diffc
é fácil: são apenas alguns comandos.fonte
Aqui está outra maneira mais simples de encontrar apenas as linhas que foram modificadas e, portanto, começam com uma única
+
ou-
, mantendo a saída colorida:-U0
diz para incluir 0 linhas de contexto em torno das linhas alteradas - ou seja: incluem apenas os próprios linhas alteradas. Vejaman git diff
.-E
for grep permite trabalhar com expressões regulares estendidas$''
sintaxe aparentemente permite a citação ANSI, que interpreta corretamente o caractere ESC (escape ou 0x1b) corretamente. Veja aqui .^
corresponde ao início da linha,\e
corresponde ao caractere Escape, que é o início de um código de cores no terminal,\[
corresponde ao próximo caractere no código de cores, que é[
, e a(this|that)
sintaxe corresponde a "this" ou "that" , onde "this" é32m+
, que é uma linha verde + e31m-
é uma linha vermelha.\e[32m
é verde e\e[31m
vermelho.+
mostra as linhas marcadasgit diff
como adicionadas, é claro, e-
mostra as linhas marcadasgit diff
como excluídas.--color=never
é necessário na 2ªgrep
expressão para impedir que ela destaque suas correspondências, o que de outra forma danificaria os códigos de cores vindosgit diff
da esquerda.+
também deve ser escapado,\+
porque, caso contrário,+
é um caractere de expressão regular especial (regex) que especifica uma ou mais ocorrências do elemento anterior . Veja aqui: https://en.wikipedia.org/wiki/Regular_expression#Basic_concepts .Referências:
Palavras-chave:
git-filechange-search.sh
- um script que permite procurar um arquivo por um nome de variável ou função e descobrir quais confirmações contêm alterações nesse nome de variável ou função. Ex. use :./git-filechange-search.sh path/to/my/file.cpp variable_name
encontrará todas as confirmações com alterações em file.cpp que contêmvariable_name
nelas. Isso é útil para ver onde e quando determinados recursos foram alterados. É como se fosse uma pesquisa que pudesse observar seções de um arquivo exibidas aogit blame
longo do tempo.fonte