revisar - Git diff con números de línea(registro de Git con números de línea)
ver historial de cambios en git (7)
No se pueden obtener números de línea legibles por humanos con git diff
Actualmente no hay ninguna opción para hacer que los números de línea se muestren verticalmente en el lado con git diff
.
Formato unificado-diff
Esa información está disponible en los encabezados (c) hunk para cada cambio en el diff, está solo en formato unificado-diff :
@@ -start,count +start,count @@
El estado original del archivo se representa con -
, y el nuevo estado se representa con +
(no significa adiciones y eliminaciones en el encabezado del hunk. start
representa el número de línea de inicio de cada versión del archivo, y count
representa cómo muchas líneas están incluidas, comenzando desde el punto de inicio.
Ejemplo
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
El encabezado de hunk
@@ -11,7 +11,7 @@
dice que la versión anterior del archivo comienza en la línea 11 e incluye 7 líneas:
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
mientras que la próxima versión del archivo también comienza en la línea 11, y también incluye 7 líneas.
El formato unificado-diff no es realmente para consumo humano
Como probablemente sepa, el formato de diff unificado no facilita la determinación de los números de línea (al menos si no es una máquina). Si realmente quieres números de línea que puedas leer, necesitarás usar una herramienta diferente que los mostrará por ti.
Lectura adicional
Cuando hago un git diff
o un git log -p
, ¿cómo obtengo los números de línea de los archivos fuente con la salida?
Traté de buscarlo man git-diff | grep "line numbers"
man git-diff | grep "line numbers"
y traté de buscar en Google, pero no obtuve nada rápidamente.
Aquí hay dos soluciones más, ampliando el código de Andy Talkowski.
Texto sin formato:
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 coloreado, suponiendo que / 033 [66m es el formato de los códigos de color:
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}''
El código cambia las líneas que comienzan con ''-'' o ''+'' a ''-1: -'' o ''+1: +'', y las líneas que comienzan con '''' a ''(5,6):''. Los números son los números de línea del archivo respectivo.
Aquí hay una secuencia de comandos que intenta arreglar esto, no lo prueba con ira, pero parece estar bien. Se basa en los registros que git diff produce y usa awk para mantener los conteos de líneas.
# 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
Me gusta usar git difftool
con git difftool
como mi difftool. Es más fácil de ver que git diff
, tiene una buena comparación de interfaz gráfica de usuario al lado y muestra los números de línea.
Puede usar git difftool
para hacer la diferencia con un editor externo que mostrará los números de línea. He aquí cómo hacerlo con vim / vimdiff:
Establecer vimdiff como difftool de git:
git config --global diff.tool vimdiff
Configure
~/.vimrc
para mostrar automáticamente los números de línea cuando use vimdiff:if &diff set number endif
Ejecute git difftool, que usará vimdiff con los números de línea:
git difftool
Puedes probar
git blame
en el archivo. Le muestra el committer, commit id y el número de línea para cada línea en el archivo.
Una forma rápida es usar git diff -U0
. Eso establecerá las líneas de contexto en 0, lo que hará que los valores @@ coincidan con las líneas cambiadas reales. Por defecto, los valores de @@ incluyen 3 líneas de antes / después del contexto, lo cual no es conveniente para humanos.
Ejemplo:
git diff # default
@@ -10,8 +10,8 @@
Esto es difícil de calcular los números de línea de las líneas modificadas porque la línea 10 se refiere a la primera línea del contexto anterior. El número de línea real de la primera línea modificada es 10 + 3 = 13. Para calcular el número de líneas cambiadas, también debe restar el contexto antes y después: 8-3-3 = 2.
git diff -U0
@@ -13,2 +13,2 @@
Como puede ver, establecer context = 0 hace que los valores @@ sean más fáciles de leer para los humanos. Puede ver que las líneas modificadas comienzan en la línea 13 y hay 2 líneas cambiadas.
Esto no es perfecto, ya que solo muestra el número de línea para cada bloque. Si desea ver los números de línea para cada línea, utilice difftool para un editor externo. Ver share