Git blame - ¿confirmaciones anteriores?


Me encanta el comando git blame, es muy útil para rastrear a personas que no son propietarias de escribir código. :-)

Sin embargo, ¿es posible ver quién editó una línea específica antes de el commit reportado por git blame, por ejemplo, un historial de commits para una línea dada?

Por ejemplo, corro lo siguiente (en el proyecto superb uncrustify):

$ git blame -L10,+1 src/options.cpp
^fe25b6d (Ben Gardner 2009-10-17 13:13:55 -0500 10) #include "prototypes.h"

¿Cómo puedo averiguar quién editó esa línea antes de confirmar fe25b6d? ¿Y quién lo editó antes de que cometer? Estoy seguro esto sería posible, pero mi git-fu es débil.

Author: Harvey, 2011-02-24

12 answers

git blame -L10,+1 fe25b6d^ -- src/options.cpp

Puede especificar una revisión para que git blame mire hacia atrás a partir de (en lugar del valor predeterminado de HEAD); fe25b6d^ es el padre de fe25b6d.

 306
Author: Amber,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-02-23 22:55:18

Puedes usar git log-L para ver la evolución de un rango de líneas.

Por ejemplo:

git log -L 15,23:filename.txt

Significa "trazar la evolución de las líneas 15 a 23 en el archivo llamado filename.txt".

 129
Author: navneet35371,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-09-04 11:12:01

Basándose en la respuesta anterior, este bash one-liner debería darte lo que estás buscando. Muestra el historial de culpas de git para una línea en particular de un archivo en particular, a través de las últimas 5 revisiones:

LINE=10 FILE=src/options.cpp REVS=5; for commit in $(git rev-list -n $REVS HEAD $FILE); do git blame -n -L$LINE,+1 $commit -- $FILE; done

En la salida de este comando, puede ver que el contenido de la línea cambia, o el número de línea mostrado puede incluso cambiar, para una confirmación en particular.

Esto a menudo indica que la línea se agregó por primera vez, después de esa confirmación en particular. También podría indica que la línea se movió desde otra parte del archivo.

 17
Author: Will Sheppard,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-09-27 13:25:04

Es posible que desee comprobar hacia fuera:

git gui blame <filename>

Te da una buena visualización gráfica de cambios como "git blame" pero con enlaces clicables por línea, para moverte a confirmaciones anteriores. Coloca el cursor sobre los enlaces para obtener una ventana emergente con los detalles de la confirmación. No mis créditos... lo encontramos aquí:

Http://zsoltfabok.com/blog/2012/02/git-blame-line-history /

git gui es una interfaz gráfica Tcl/Tc para git. Sin ningún otro params se inicia una aplicación gráfica bastante simple pero útil para confirmación de archivos, trozos o incluso líneas simples y otros comandos similares como amend, revert, push... Es parte de la suite de git Stock. En windows se incluye en el instalador. En debian-No conozco otros sistemas * nix - tiene que ser instalado por separado:

apt-get install git-gui

De los documentos:

Https://git-scm.com/docs/git-gui

DESCRIPCIÓN

Una interfaz gráfica de usuario basada en Tcl/Tk para Git. git gui se centra en permitiendo a los usuarios haga cambios en su repositorio haciendo nuevos confirmaciones, modificación de las existentes, creación de ramas, ejecución local merges, and fetching/pushing to remote repositories.

A diferencia de gitk, git gui se centra en la generación de commits y un solo archivo anotación y no muestra el historial del proyecto. Sin embargo, sí suministra acciones de menú para iniciar una sesión de gitk desde git gui.

Se sabe que Git gui funciona en todos los sistemas UNIX populares, Mac OS X y Windows (bajo ambos Cygwin y MSYS). En la medida de lo posible se siguen las pautas específicas de la interfaz de usuario, haciendo que git gui sea interfaz bastante nativa para los usuarios.

COMANDOS

Culpa

Inicie un visor de culpas en el archivo especificado en la versión dada (o directorio de trabajo si no se especifica).

Navegador

Inicie un explorador de árbol que muestre todos los archivos en la confirmación especificada. Los archivos seleccionados a través del navegador se abren en el blame viewer.

Citool

Inicie git gui y haga los arreglos para hacer exactamente una confirmación antes de salir y regresar al shell. La interfaz está limitada a solo commit acciones, reduciendo ligeramente el tiempo de inicio de la aplicación y simplificando la barra de menú.

Versión

Muestra la versión actual de git gui.

 17
Author: Holger Böhnke,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-04-04 11:00:32

La respuesta de Amber es correcta, pero la encontré poco clara; La sintaxis es:

git blame {sha1} -- {path/to/file}

Nota: el -- se utiliza para separar el árbol-ish sha1 de las rutas de archivo relativas. 1

Por ejemplo:

git blame master -- index.html

Todo el crédito a Amber por conocer todas las cosas! :)

 16
Author: ThorSummoner,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 12:18:29

También Hay recursive-blame. Se puede instalar con

npm install -g recursive-blame
 10
Author: Thomas W,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-09-04 10:46:15

Una solución única para este problema es usar git log:

Git log-p-M follow follow st stat path path/to / your / file

Como explicó Andre aquí

 7
Author: Mannu,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-05-29 07:21:19

Si está utilizando JetBrains IDE Idea (y derivados) puede seleccionar varias líneas, haga clic derecho para el menú contextual, luego Git -> Show history para la selección. Verá una lista de confirmaciones que afectaban a las líneas seleccionadas:

introduzca la descripción de la imagen aquí

 2
Author: warvariuc,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-12-18 07:17:52

Basándose en la respuesta de Will Shepard, su salida incluirá líneas duplicadas para confirmaciones donde no hubo ningún cambio, por lo que puede filtrarlas de la siguiente manera (usando esta respuesta)

LINE=1 FILE=a; for commit in $(git rev-list HEAD $FILE); do git blame -n -L$LINE,+1 $commit -- $FILE; done | sed '$!N; /^\(.*\)\n\1$/!P; D'

Tenga en cuenta que eliminé el argumento REVS y esto vuelve a la confirmación de root. Esto se debe a la observación anterior de Max Nanasy.

 1
Author: DavidN,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 12:34:53

Basándome en la respuesta de DavidN y quiero seguir el archivo renombrado:

LINE=8 FILE=Info.plist; for commit in $(git log --format='%h%%' --name-only --follow -- $FILE | xargs echo | perl -pe 's/\%\s/,/g'); do hash=$(echo $commit | cut -f1 -d ','); fileMayRenamed=$(echo $commit | cut -f2 -d ','); git blame -n -L$LINE,+1 $hash -- $fileMayRenamed; done | sed '$!N; /^\(.*\)\n\1$/!P; D'

Ref: muestra muy bien el historial de cambio de nombre del archivo en git log

 1
Author: Bill Chan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 12:10:46

Utilizo este pequeño script bash para ver un historial de culpas.

Primer parámetro: archivo a mirar

Parámetros posteriores: Pasado a git blame

#!/bin/bash
f=$1
shift
{ git log --pretty=format:%H -- "$f"; echo; } | {
  while read hash; do
    echo "--- $hash"
    git blame $@ $hash -- "$f" | sed 's/^/  /'
  done
}

Puede proporcionar parámetros de culpa como -L 70,+10 pero es mejor usar la búsqueda de expresiones regulares de git blame porque los números de línea normalmente "cambian" con el tiempo.

 0
Author: stangls,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-02-16 16:28:39

Construir en stangls ' s respuesta, puse este script en mi RUTA (incluso en Windows) como git-bh:

Eso me permite buscar todas las confirmaciones donde estaba involucrada una palabra:

git bh path/to/myfile myWord

Script:

#!/bin/bash
f=$1
shift
csha=""
{ git log --pretty=format:%H -- "$f"; echo; } | {
  while read hash; do
    res=$(git blame -L"/$1/",+1 $hash -- "$f" 2>/dev/null | sed 's/^/  /')
    sha=${res%% (*}
    if [[ "${res}" != "" && "${csha}" != "${sha}" ]]; then
      echo "--- ${hash}"
      echo "${res}"
      csha="${sha}"
    fi
  done
}
 0
Author: VonC,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 12:02:48