Tengo un archivo a.txt
.
cat a.txt
> hello
El contenido de a.txt
es "hola".
Me comprometo.
git add a.txt
git commit -m "first commit"
Luego me muevo a.txt
a un test
directorio.
mkdir test
mv a.txt test
Luego hago mi segundo compromiso.
git add -A
git commit -m "second commit"
Finalmente, edito a.txt
para 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.txt
entre 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.txt
detecta correctamente el cambio de nombre, pero no puedo encontrar un equivalente para git diff
. Hay uno
Respuestas:
El problema con la diferencia entre
HEAD^^
yHEAD
es que tienes unaa.txt
en 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>
(-C
también funciona).Entonces, si cambió el nombre y cambió un archivo en la última confirmación, puede ver los cambios con:
Esto produce:
(
// a.txt
lí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.txt
También puedes hacer:
git diff rev1:file1 rev2:file2
que, para tu ejemplo, sería
git diff HEAD^^:./a.txt HEAD:./test/a.txt
Tenga 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