Cuando hago un git diff, muestra líneas que se han agregado:
+ this line is added
líneas que se han eliminado:
- this line is removed
pero también muestra muchas líneas que no se modifican:
this line is not modified
this line is also not modified
Esto da como resultado que el git diff real se vea así:
+ this line is added
this line is not modified
- this line is removed
this line is not modified
¿Puedo pedirle a git que muestre solo las líneas que han sido modificadas e ignore el resto del código que no ha sido modificado? He escrito un método que eliminará todas las líneas que no tengan un signo "+" o "-" delante de ellas, pero estoy seguro de que debe haber una forma más sencilla de hacerlo.
En mi git diff, solo estoy interesado en ver las líneas que se han modificado.
Gracias por adelantado.
git diff | egrep "^(\+|-) "
.git config --global diff.context 0
tenerlo configurado globalmenteOtro truco (en un * x) para mostrar solo las líneas que comienzan con
+
y-
:El código anterior hace lo siguiente:
git diff -U0
: elija 0 líneas de contexto+
o-
--- a/
o+++ b/
Color
Para mostrar diferencias de color, intente lo siguiente:
^\e\[[^m]*m[-+]
busca el inicio de la línea (^
), luego el carácter de escape (\e
) seguido por el[
cual juntos comienzan la secuencia de escape, luego cualquier carácter que no sea una "m" (números, punto y coma o nada), seguido de un " m "que finaliza la secuencia de escape.\e[0m
(restablecer),\e[m
(también restablecer),\e[1m
(en negrita),\e[31m
(rojo),\e[32m
(verde),\e[9;31m
(tachar + rojo),\e[31;9m
(rojo + tachar),\e[1;4;9;31m
(negrita + subrayado + tachado + rojo). Los colores git predeterminados usan rojo y verde, pero se pueden reconfigurar.--color
es el mismo que--color=always
.--- a/
o+++ b/
para aparecer al comienzo de la línea se ha eliminado para acomodar las secuencias de escape y esto podría conducir a un caso límite.Notas adicionales:
-R
,--src-prefix
,--dst-prefix
,--no-prefix
, etc.grep -E -v '^(\+\+\+ b/|--- a/|@@ |diff --git|index )'
, pero creo que la versión de doble grep es más fácil de entender.fuente
git diff
líneas de tipo "encabezado" que comienzan con@@
, pero ¿cuáles son lasgit diff
líneas que comienzan con---
o+++
? No estaba al tanto de esos.+++
) o eliminaciones (---
). Veo eso aquí ahora: git-scm.com/docs/git-diff#_combined_diff_format .--- a/filename
parece denotar el "archivo de la izquierda", o el archivo como era antes, y+++ b/filename
parece denotar el "archivo de la derecha", o el archivo como está ahora con sus cambios. Estoy tan acostumbrado a usargit difftool
con meld , que muestra hermosas comparaciones de lado a lado, que nunca me acostumbré a mirargit diff
, por lo que todavía me parece extraño, y nunca antes había visto estos matices.Siguiendo el último comentario de Chris, el principal problema con el postprocesamiento es que desea mantener las líneas que comienzan
-|+
pero también quiere filtrar las que comienzan---|+++
. Si está almacenando archivos de parche en su repositorio (lo hago, en Pydoop ), por otro lado, desea mantener las líneas que comienzan--|++
, por lo que la expresión regular se involucra un poco:La expresión regular usa una mirada negativa hacia adelante: vea la respuesta de Peter Boughton a esta pregunta para una explicación detallada.
Si hace esto a menudo, es posible que desee configurar un alias git para ello:
fuente
-P
o--perl-regexp
se usa para interpretar el patrón como una expresión regular de Perl, pero no siempre se implementa. No me funcionó en OSX. gnu.org/software/grep/manual/grep.html#grep-ProgramsCreo que para casos simples, la expresión regular puede ser mucho más corta y fácil de recordar, con la advertencia de que esto no funcionará si tiene cambios de línea donde la línea comienza con
+
o-
La expresión regular dice que la línea debe comenzar con
+
o-
, y el carácter que sigue inmediatamente no debe ser ninguno de esos. Obtuve los mismos resultados si escapé+
o no aquí, por cierto ...Ejemplo:
Digamos que cambio
C
aX
,E
aY
yG
aZ
.Sin embargo, como dije anteriormente, esto es solo para la mayoría de los casos. Si canaliza esa salida a un archivo
dout
, intente la misma expresión regular, no funcionará.De todos modos, espero que eso ayude en tu caso
fuente
- name: No pdb
en un archivo yaml.Esta respuesta conservará los colores rojo / verde originales para facilitar la lectura. Proporcioné algunas variaciones en la sintaxis:
Explicación:
git diff --color
necesita para evitar que git desactive el color cuando se está canalizando.grep --color=never
objetivo es evitar que grep elimine el color original y resalte la cadena coincidente.\e[31m
) o verde (\e[32m
).$'...'
(sintaxis de comillas ANSI-C) o-P
(sintaxis perl) es dejargrep
de interpretar\e
o\033
como unESC
carácter.fuente
$''
parte me ayudó especialmente. stackoverflow.com/a/61929887/4561887Cómo usar
awk
para mostrar solo las líneas+
y-
, teniendo en cuenta cualquier color o formato de texto,git diff
se puede generar:Ninguna de las otras respuestas aquí (incluida mi otra respuesta ) hará exactamente lo que quieres 100% correctamente. Esta respuesta, sin embargo, lo hará. Aquí hay un 1-liner que puede copiar y pegar en su terminal. Acabo de hacer varias líneas para facilitar la lectura: puede copiarlo y pegarlo de la misma manera, ¡así que podría hacerlo legible! Se basa en el
awk
lenguaje de programación:Aquí están sus características. Todas estas características, cuando se toman juntas, resuelven las deficiencias de cualquier otra respuesta aquí:
^(\033\[(([0-9]{1,2};?){1,10})m)?
git config
configuración . Es por eso que la expresión regular anterior tiene;?
y{1,10}
en ella: si detecta el inicio de un código de formato de color o texto, coincidirá con hasta 10 secuencias de estos códigos ANSI combinados.NO incluye líneas que comienzan con
@@
la palabradiff
, como lo hace la respuesta aceptada . Si desea esas líneas (que francamente, creo que son útiles :)), haga esto en su lugar:o
Muestra la salida de la misma manera que lo
git diff
haría: en elless
buscapersonas con salida de color opcional (-R
), y solo si el texto es> 1 página (-F
), y al mismo tiempo que retiene la página de texto actual en la pantalla cuandoq
usa (-X
) .También tiene la ventaja de ser potente y fácil de configurar, ya que utiliza el lenguaje de programación awk.
Si está interesado en aprender awk , aquí hay algunos recursos:
gawk
(GNUawk
) manual: https://www.gnu.org/software/gawk/manual/html_node/index.html#SEC_Contentsgit diffn
y los comentarios allí: https://github.com/ElectricRCAircraftGuy/eRCaGuy_dotfiles/blob/master/useful_scripts/git-diffn.shgit diffn
también, que esgit diff
con números de línea, consulte aquí: Git diff con números de línea (Git log con números de línea)Como
git diffc
beneficio adicional, también envolví lo anterior para usarlo , lo que significa "git diff para mostrar SOLO 'cambios'". El uso es idéntico agit diff
; solo usegit diffc
en su lugar! Es compatible con TODAS las opciones. El color está activado por defecto. Para apagarlo, simplemente usegit diffc --no-color
ogit diffc --color=never
. Verman git diff
para más detalles.Desde que acabo de terminar
git diffn
(una herramienta para mostrargit diff
con líneas y números) anoche, escribirgit diffc
fue trivial. Pensé que sería mejor hacerlo ahora mientras el conocimiento está fresco en mi cabeza.Instalar en pc
git diffc
:Siga las instrucciones al final de esta respuesta aquí , excepto en todas partes que vea
git-diffn
en las instrucciones, usegit-diffc
en su lugar. Eso incluye en elwget
comando también. Descargar e instalargit diffc
es fácil: solo son unos pocos comandos.fuente
Aquí hay otra forma más simple de encontrar solo líneas que se hayan modificado y, por lo tanto, comenzar con una sola
+
o-
, mientras se conserva la salida de color:-U0
dice que incluya 0 líneas de contexto en torno a las líneas cambiadas - es decir: incluir sólo las propias líneas cambiadas. Verman git diff
.-E
for grep le permite trabajar con expresiones regulares extendidas$''
sintaxis aparentemente permite las citas ANSI, que interpreta correctamente el carácter ESC (escape o 0x1b) correctamente. Ver aquí .^
coincide con el comienzo de la línea,\e
coincide con el carácter de escape, que es el comienzo de un código de color en el terminal,\[
coincide con el siguiente carácter en el código de color, que es[
, y luego la(this|that)
sintaxis coincide con "this" o "that" , donde "esto" es32m+
, que es una línea verde +, y31m-
es una línea roja.\e[32m
es verde y\e[31m
es rojo.+
muestra líneas marcadasgit diff
como agregadas, por supuesto, y-
muestra líneas marcadas porgit diff
como eliminadas.--color=never
se requiere en la segundagrep
expresión para evitar que resalte sus coincidencias, lo que de otro modo arruinaría los códigos de color que provienen degit diff
la izquierda.+
debe escaparse\+
porque, de lo contrario,+
es un carácter especial de expresión regular (expresión regular) que especifica una o más ocurrencias del elemento anterior . Ver aquí: https://en.wikipedia.org/wiki/Regular_expression#Basic_concepts .Referencias
Relacionado:
git-filechange-search.sh
- un script que le permite buscar en un archivo una variable o nombre de función y descubrir qué confirmaciones contienen cambios con esa variable o nombre de función. Ex. uso:./git-filechange-search.sh path/to/my/file.cpp variable_name
encontrará todos los commits con cambios en file.cpp que contienenvariable_name
en ellos. Esto es útil para ver dónde y cuándo se modificaron ciertas características. Es como si fuera una búsqueda que pudiera observar secciones de un archivo que se muestran a través delgit blame
tiempo.fuente