Tengo un archivo a.txt.
cat a.txt
> hello
El contenido de a.txtes "hola".
Me comprometo.
git add a.txt
git commit -m "first commit"
Luego me muevo a.txta un testdirectorio.
mkdir test
mv a.txt test
Luego hago mi segundo compromiso.
git add -A
git commit -m "second commit"
Finalmente, edito a.txtpara decir "adiós" en su lugar.
cat a.txt
> goodbye
Hago mi último compromiso.
git add a.txt
git commit -m "final commit"
Ahora aquí está mi pregunta:
¿Cómo difiero el contenido de a.txtentre mi última confirmación y mi primera confirmación?  
Lo intenté
  git diff HEAD^^..HEAD -M a.txt, pero no funcionó.  git log --follow a.txtdetecta correctamente el cambio de nombre, pero no puedo encontrar un equivalente para git diff. Hay uno

Respuestas:
El problema con la diferencia entre
HEAD^^yHEADes que tienes unaa.txten ambas confirmaciones, por lo que solo considerando esas dos confirmaciones (que es lo que hace diff), no hay cambio de nombre, hay una copia y un cambio.Para detectar copias, puede utilizar
-C:Resultado:
Por cierto, si restringe su diff a solo una ruta (como lo hace en
git diff HEAD^^ HEAD a.txt, nunca verá los cambios de nombre o copias porque ha excluido todo, aparte de una sola ruta y los cambios de nombre o copias, por definición, involucran dos caminos.fuente
-- <old-path> <new-path>... vea mi respuesta.git show -C [commit]y reconoció el cambio de nombre del archivo y me mostró el diff entre los archivos. Perfecto.Para diferenciar un cambio de nombre de un archivo específico, use
-M -- <old-path> <new-path>(-Ctambién funciona).Entonces, si cambió el nombre y cambió un archivo en la última confirmación, puede ver los cambios con:
Esto produce:
(
// a.txtlíneas agregadas para ayudar a git a detectar el cambio de nombre)Si git no detecta el cambio de nombre, puede especificar un umbral de similitud bajo con
-M[=n], digamos, 1%:De los documentos de git diff :
fuente
git diff HEAD^^ HEAD -M -- a.txt test/a.txtTambién puedes hacer:
git diff rev1:file1 rev2:file2que, para tu ejemplo, sería
git diff HEAD^^:./a.txt HEAD:./test/a.txtTenga en cuenta lo explícito
./: de lo contrario, este formato asume que las rutas son relativas a la raíz del repositorio. (Si está en la raíz del repositorio, por supuesto, puede omitirlo).Esto no depende en absoluto de la detección de cambio de nombre, ya que el usuario indica explícitamente exactamente qué comparar. (Por lo tanto, también resulta útil en otras circunstancias, como comparar archivos entre diferentes ramas svn en un entorno git-svn).
fuente
Si su confirmación de cambio de nombre está preparada pero aún no se ha confirmado, puede usar:
fuente