¿Cómo encuentro la confirmación de git más reciente que modificó un file?

Quiero encontrar la confirmación más reciente que modificó un file fuente.

Puedo usar git blame para ver todas las dates de confirmaciones por cada línea, pero es difícil ver exactamente qué compromiso fue el último en tocar el file.

¿Cómo puedo encontrar la última confirmación que tocó un file dado en mi repository de git?

git log admite mirar el historial de files específicos (y directorys), para que pueda escribir esto:

 git log my/file.c 

Si realmente solo desea enumerar el compromiso más reciente, por ejemplo para usarlo en un script, puede usar -n 1 :

 git log -n 1 --pretty=format:%H -- my/file.c 

--pretty=format:%h le dice a git log que muestre solo el hash de confirmación (gracias a TheBamf). El separador impide que el nombre del file se interprete como un nombre de confirmación, en caso de que sea ambiguo.

Si desea get el hash de la última confirmación para modificar un set específico de files (y desea evitar awk ), puede usar:

 git log -n 1 --pretty=format:%h -- <path> 

Esto puede ser útil para get el hash de confirmación para utilizar posteriormente con git describe .

Por ejemplo (en caso de que sea útil para cualquier persona) …

Creo un ID de versión actual considerando el compromiso más reciente para cambiar cualquier file fuente (suponiendo que marcas versiones con tags como mycode-1.2.1 ):

 COMMIT=$(git log -n 1 --pretty=format:%h -- *.c *.h) if VN=$(git describe --always --abbrev=5 --match "mycode-*" $COMMIT 2>/dev/null) && case "$VN" in mycode-*) git update-index -q --refresh test -z "$(git diff-index --name-only HEAD *.c *.h)" || VN="$VN-mod" ;; *) VN="mycode-unknown-g$VN" ;; esac then continue else VN="mycode-unknown" fi 

Esto produce identificadores como:

  • mycode-1.2.1 – cuando el estado actual de los files fuente corresponde a una versión labelda
  • mycode-1.2.1-g3k7s2 – cuando el estado actual de los files fuente corresponde al commit siguiendo una versión labelda
  • mycode-1.2.1-g3k7s2-mod – cuando el estado actual de los files fuente ha sido modificado desde la última confirmación después de una versión labelda
  • mycode-unknown : cuando aún no se ha creado una label de versión

Si solo quieres encontrar la confirmación más reciente, entonces no quieres git-log , quieres git-rev-list , que enumera los objects de confirmación que cambian ese file, en esa ruta de confirmación, empezando por la más reciente ( cronológicamente). Simplemente pon:

git rev-list -1 <commit> <filename>

Para git-rev-list en su caso, solo proporciona:

  • El número de confirmaciones para include, o -1 solo para el más reciente,
  • La twig (o la identificación de confirmación) para comenzar a mirar hacia atrás, HEAD si ya está en ella, o –all si desea todas las confirmaciones conocidas, y
  • La ruta relativa a su file.

Esto solo devuelve el ID de confirmación más reciente en la twig actual para alterar ese file, por ejemplo: 215095e2e338525be0baeeebdf66bfbb304e7270

Para un ejemplo más complejo, puede usar nombres de tags, e incluso references remotas, e include nombres de routes relativas con comodines, por ejemplo:

git rev-list origin/user/bob/testbranch -1 src/bfiles/*.txt

… que le diría cuál fue el cambio más reciente en la coincidencia de comodines en la historia de esa sucursal. Las opciones para rev-list son extremas, es uno de los commands de plomería más importantes, por lo que puede include o excluir por cualquier criterio que pueda imaginar.

Por supuesto, consulte la página de manual de git-rev-list (1) .

No estoy seguro de si esto es lo que quieres, pero si haces un git log <thefile> para get las confirmaciones que alteraron ese file. Puedes elegir la más alta. Debería ser el que estás buscando.

Una vez que tenga el ID SHA de la confirmación que desea ver usando git log FILENAME , debería poder hacer que git show SHA_ID_HERE para ver lo que hizo para esa confirmación en particular. Ni siquiera necesita ingresar la identificación completa; los primeros 6 caracteres deberían ser suficientes.

para get solo la reference en una línea, intente:

 git log -n1 --oneline <path> | awk '{print $1;}'