¿Cómo se diferencia un file a una versión arbitraria en Git?

¿Cómo puedo diferir un file, digamos pom.xml , de la twig principal a una versión anterior arbitraria en Git?

Tu puedes hacer:

 git diff master~20:pom.xml pom.xml 

… para comparar tu actual pom.xml con el de las revisiones del master 20 atrás a través del primer padre. Puede replace master~20 , por supuesto, con el nombre del object (SHA1sum) de una confirmación o cualquiera de las muchas otras forms de especificar una revisión .

Tenga en count que esto en realidad está comparando el viejo pom.xml con la versión en su tree de trabajo, no la versión confirmada en el master . Si quieres eso, entonces puedes hacer lo siguiente en su lugar:

 git diff master~20:pom.xml master:pom.xml 
 git diff <revision> <path> 

Por ejemplo:

 git diff b0d14a4 foobar.txt 

Si desea ver la diferencia entre la última confirmación de un solo file, puede hacer lo siguiente:

 git log -p -1 filename 

Esto le dará la diferencia del file en git, no está comparando su file local.

Para ver qué se cambió en un file en la última confirmación:

 git diff HEAD~1 path/to/file. 

Puede cambiar el número (~ 1) al n-ésimo compromiso con el que desea diferenciar.

git diff -w HEAD origin / master path / to / file

Si ninguno de los commit es tu HEAD, entonces la expansión de Brah de bash resulta realmente útil, especialmente si tus nombres de file son largos, el ejemplo anterior:

 git diff master~20:pom.xml master:pom.xml 

Se convertiría

 git diff {master~20,master}:pom.xml 

Más sobre la expansión de Brace con bash.

Sintaxis genérica

 $git diff oldCommit..newCommit -- **FileName.xml > ~/diff.txt 

para todos los files llamados "FileName.xml" en cualquier lugar de su repository.

Observe el espacio entre "-" y "**"

Responde por tu pregunta:

 $git checkout master $git diff oldCommit..HEAD -- **pom.xml or $git diff oldCommit..HEAD -- relative/path/to/pom.xml 

como siempre con git, puede usar una label / sha1 / "HEAD ^" para id a commit.

Probado con git 1.9.1 en Ubuntu.

Para las personas interesadas en hacer lo mismo desde GitHub, consulte la comparación de compromisos a través del time .

Para comparar el compromiso 5 con el actual, ambos en el master , simplemente hazlo:

 git diff master~5:pom.xml master:pom.xml 

También puede referirse al número hash de confirmación, por ejemplo, si el número hash es x110bd64 , puede hacer algo como esto para ver la diferencia:

 git diff x110bd64 pom.xml 

Si necesita diff en un solo file en un escondite, por ejemplo, puede hacer

 git diff stash@{0} -- path/to/file 

Si está buscando la diferencia en una confirmación específica y desea usar la interfaz de usuario de github en lugar de la línea de command (digamos que desea vincularla a otras personas), puede hacer:

 https://github.com/<org>/<repo>/commit/<commit-sha>/<path-to-file> 

Por ejemplo:

https://github.com/grails/grails-core/commit/02942c5b4d832b856fbc04c186f1d02416895a7e/grails-test-suite-uber/build.gradle

Tenga en count los enlaces Anterior y Siguiente en la parte superior derecha que le permiten navegar a través de todos los files en la confirmación.

Sin embargo, esto solo funciona para una confirmación específica, no para comparar entre dos versiones arbitrarias.

 git diff master~20 -- pom.xml 

Funciona si no estás en la twig principal también.