lab - git repository
En git, ¿puede ver las confirmaciones más antiguas aplicadas a un archivo después de que se haya movido? (2)
'' git-log -M
'' proporcionará el historial de confirmación con información de cambio de nombre, como se menciona en GitFaq "¿Por qué git no" hace un seguimiento de "nombre"?
La maquinaria diff
en Git tiene soporte para la detección automática de nombres, esto se activa mediante el interruptor '' -M
'' de la familia de comandos git-diff-*
.
La maquinaria de detección de cambio de nombre es utilizada por git-log
y git-whatchanged
.
Git también es compatible con una forma limitada de fusión a través de los nombres. Las dos herramientas para asignar culpar, git-blame
y git-annotate
usan el código de detección de cambio de nombre automático para rastrear los nombres.
Como un caso muy especial, git-log versión 1.5.3 y posterior tiene la opción '' --follow
'' que le permite seguir los nombres cuando se le da una sola ruta .
en tu ejemplo:
F:/prog/git/test/rename>git log --follow bar
commit 81f52b91eb2fc7ad18051c93f3e4d583f27c15ca
Author: VonC <>
Date: Tue Jun 2 21:54:43 2009 +0200
renamed foo to bar
commit 71aff26ace6ab249ab2042d1e5d20377486ce478
Author: VonC <>
Date: Tue Jun 2 21:54:19 2009 +0200
edited foo
commit c893199da767eddac6a547b940557435ade4d18c
Author: VonC <>
Date: Tue Jun 2 21:53:51 2009 +0200
initial commit
Nota: todo esto es posible porque no modificaste drásticamente el contenido de foo
antes de cambiar el nombre a barra. Si el contenido fuera completamente diferente, la opción --follow
no podría obtener todo el historial.
Después de mover un archivo en git (usando git mv
), mirar en el registro de ese archivo solo muestra las confirmaciones incluidas y después de la mudanza.
¿Hay alguna forma de ver los compromisos aplicados al archivo con su nombre anterior? En el ejemplo, a continuación, me gustaría ver las confirmaciones b04033bdc44f1 y 8ca40d563ce5d en el git log
vez que haya realizado el movimiento.
$ git init
Initialized empty Git repository in /Users/ben/code/git_mv_example/.git/
$ touch foo
$ git add foo
$ git commit -m "Initial commit"
Created initial commit 8ca40d5: Initial commit
0 files changed, 0 insertions(+), 0 deletions(-)
create mode 100644 foo
[master*]$ echo "abcdefg" > foo
[master*]$ git commit -a -m "edited foo"
Created commit b04033b: edited foo
1 files changed, 1 insertions(+), 0 deletions(-)
$ git log foo
commit b04033bdc44f1eb3477270b4b7ca727377d8c03a
Author: Ben Brinckerhoff <[email protected]>
Date: Tue Jun 2 13:26:53 2009 -0600
edited foo
commit 8ca40d563ce5d07d965bfb75a01b9c23378fd321
Author: Ben Brinckerhoff <[email protected]>
Date: Tue Jun 2 13:26:15 2009 -0600
Initial commit
$ git mv foo bar
[master+]$ git commit -a -m "renamed foo to bar"
Created commit 2bccdf6: renamed foo to bar
1 files changed, 0 insertions(+), 0 deletions(-)
rename foo => bar (100%)
$ git log bar
commit 2bccdf6fc65b9da5b279d9f1117e436549dd3a7b
Author: Ben Brinckerhoff <[email protected]>
Date: Tue Jun 2 13:27:14 2009 -0600
renamed foo to bar
$ git log foo
fatal: ambiguous argument ''foo'': unknown revision or path not in the working tree.
Use ''--'' to separate paths from revisions
¿No es esto posible? O tal vez es git log
el comando incorrecto para esto?
Respuesta corta: usar
$ git log -M --follow bar
o
$ git log -M -- foo bar
especificando tanto el nombre antiguo como el nuevo.
Por cierto, como git utiliza la detección heurística basada en el cambio de nombre, es posible que los ejemplos de juguetes no funcionen como usted desea, mientras que los ejemplos de la vida real (o los ejemplos con más contenidos sin cambios) funcionarán como se espera.
Tenga en cuenta que en git path, un argumento para git-log no es un filtro de ruta, sino un limitador de ruta (y puede ser, por ejemplo, un directorio).