"git diff" siempre muestra la diferencia entre dos commits (o commit y directorio de trabajo, etc.).
Jakub Narębski
21
@ JakubNarębski, pregunta cómo ver la diferencia entre los cambios introducidos por un comando y los cambios introducidos por otro commit. En otras palabras, la diferencia de diffs o interdiff.
psusi
1
y si agrega el parámetro --dirstat = files al comando diff, tomará una muy buena captura de pantalla de los proyectos y archivos exactos que se cambian, junto con un porcentaje de cambio. De esta manera: git diff [commit-number] [commit-number] --dirstat = files
Óscar Ibáñez Fernández
Respuestas:
606
simplemente puede pasar los 2 commits a git diff como:
La ventaja de usar git apply vs. patch es que puede incluir cambios de nombre y algunos otros cambios que son específicos de git. Me gusta usar git format-patch y git am.
Russell
58
Esta respuesta no responde la pregunta, por lo que no tengo idea de por qué tiene tantos votos positivos. El OP pregunta específicamente cómo NO obtener el primer comando que das, y el segundo no tiene nada que ver con nada.
psusi
3
Esta respuesta no deja de responder nada. Funciona perfectamente Si ramifica la última de las dos confirmaciones en cuestión, luego aplique esta diferencia a esa nueva ramificación, verá los cambios entre las dos confirmaciones sin dolor de cabeza de las confirmaciones intermitentes.
Craig Labenz
142
Pedir la diferencia / entre / dos confirmaciones sin incluir las confirmaciones intermedias tiene poco sentido. Los commits son solo instantáneas del contenido del repositorio; preguntar por la diferencia entre dos necesariamente los incluye. Entonces la pregunta es, ¿qué estás buscando realmente?
Como sugirió William, la selección de cerezas puede darte el delta de un solo commit rebasado sobre otro. Es decir:
Esto toma commit 'abcdef', lo compara con su antepasado inmediato, luego aplica esa diferencia sobre '012345'. Luego se muestra esta nueva diferencia: el único cambio es que el contexto proviene de '012345' en lugar del antepasado inmediato de 'abcdef. Por supuesto, puede obtener conflictos, etc., por lo que no es un proceso muy útil en la mayoría de los casos.
Si solo está interesado en abcdef, puede hacer lo siguiente:
$ git log -u -1 abcdef
Esto compara abcdef con su antepasado inmediato, solo, y generalmente es lo que desea.
Y por supuesto
$ git diff 012345..abcdef
te da todas las diferencias entre esos dos commits.
Sería útil tener una mejor idea de lo que está tratando de lograr; como mencioné, pedir la diferencia entre dos confirmaciones sin lo que hay entre ellas no tiene sentido.
Estoy de acuerdo en que, en general, no tiene mucho sentido comparar dos commits. Pero git es realmente bueno para no decirte cómo deberías pensar. Suponga que tiene dos ramas, cada una con confirmaciones distintas que parecen estar haciendo los mismos cambios en los mismos conjuntos de archivos. Me gustaría poder usar git para decirme si estos dos parches son iguales sin tener que confiar en mis ojos. Creo que hay utilidad en esto.
Chris Cleeland
99
@ChrisCleeland, la utilidad interdiff puede ser útil en ese caso. Use git diff para obtener el diff de cada commit contra su padre inmediato, luego use interdiff para comparar los diffs.
bdonlan
3
@ChrisCleeland, git no almacena parches. Almacena el contenido del archivo. Tiene un esquema de compresión que usa deltas, pero las fuentes delta no están necesariamente correlacionadas con el historial real de los archivos.
bdonlan
11
La diferencia entre las dos confirmaciones excluyendo otras confirmaciones en sus respectivas ramas tiene mucho sentido: una confirmación fue seleccionada de la otra, pero puede tener algunas diferencias sutiles. Desea ver cuáles son sin estar abarrotados con todas las demás basura no relacionada que es diferente entre las dos ramas.
psusi
2
O digamos que reescribe el maestro en una rama de características y debe resolver los conflictos. Después comparando origin/featurebranch#HEADa local/featurebranch#HEADpuede ayudar a asegurarse de que no hizo nada lodo durante la resolución de conflictos.
lefnire
91
Para comparar dos git commits 12345 y abcdef como parches, se puede usar el comando diff como
@OneOfOne git diff <(git show 123456) <(git show abcdef)no funciona; diff <(...) <(...)hace. (Solo lo intenté).
Menachem
@Menachem git diff 123456 abcdef.
OneOfOne
15
@OneOfOne Eso no hace lo mismo. Lo que sugirió compararía los árboles de cada confirmación, mostrando un solo parche . Lo que yo (y @plexoos) estamos haciendo es comparar dos parches , cada uno de ellos introducido por commits separados, en otras palabras, diffobteniendo la salida de dos diffs. Esto implica leer y comparar dos flujos de entrada. diff(GNU o Unix diff) puede hacer eso, mientras git diffque no puede. Algunos pueden preguntarse por qué uno querría hacer eso. Estoy en el medio de hacer eso ahora, limpiando una fusión que salió mal.
Menachem
1
¿No incluirá esto el gnu diff de todos los metadatos en el git diff?
joelb
61
git diff <a-commit> <another-commit> path
Ejemplo:
git diff commit1 commit2 config/routes.rb
Muestra la diferencia en ese archivo entre esas confirmaciones.
Gracias, es una buena idea verificar su resultado después de aplastar las confirmaciones. Por ejemplo, puede verificar su rama con confirmaciones no aplastadas y elegir su confirmación aplastada para ver si todo salió bien con la nueva versión interactiva. Además, cuando el maestro se adelantó a la rama.
akostadinov
10
¿Qué hay de esto?
git diff abcdef 123456 | less
Es útil simplemente canalizarlo a menos si desea comparar muchas diferencias diferentes sobre la marcha.
Mi aliasconfiguración en el ~/.bashrcarchivo para git diff:
alias gdca='git diff --cached' # diff between your staged file and the last commit
alias gdcc='git diff HEAD{,^}' # diff between your latest two commits
Respuestas:
simplemente puede pasar los 2 commits a git diff como:
fuente
my.patch
a otra sucursal?Pedir la diferencia / entre / dos confirmaciones sin incluir las confirmaciones intermedias tiene poco sentido. Los commits son solo instantáneas del contenido del repositorio; preguntar por la diferencia entre dos necesariamente los incluye. Entonces la pregunta es, ¿qué estás buscando realmente?
Como sugirió William, la selección de cerezas puede darte el delta de un solo commit rebasado sobre otro. Es decir:
Esto toma commit 'abcdef', lo compara con su antepasado inmediato, luego aplica esa diferencia sobre '012345'. Luego se muestra esta nueva diferencia: el único cambio es que el contexto proviene de '012345' en lugar del antepasado inmediato de 'abcdef. Por supuesto, puede obtener conflictos, etc., por lo que no es un proceso muy útil en la mayoría de los casos.
Si solo está interesado en abcdef, puede hacer lo siguiente:
Esto compara abcdef con su antepasado inmediato, solo, y generalmente es lo que desea.
Y por supuesto
te da todas las diferencias entre esos dos commits.
Sería útil tener una mejor idea de lo que está tratando de lograr; como mencioné, pedir la diferencia entre dos confirmaciones sin lo que hay entre ellas no tiene sentido.
fuente
origin/featurebranch#HEAD
alocal/featurebranch#HEAD
puede ayudar a asegurarse de que no hizo nada lodo durante la resolución de conflictos.Para comparar dos git commits 12345 y abcdef como parches, se puede usar el comando diff como
fuente
git diff <(git show 123456) <(git show abcdef)
no funciona;diff <(...) <(...)
hace. (Solo lo intenté).git diff 123456 abcdef
.diff
obteniendo la salida de dosdiff
s. Esto implica leer y comparar dos flujos de entrada.diff
(GNU o Unixdiff
) puede hacer eso, mientrasgit diff
que no puede. Algunos pueden preguntarse por qué uno querría hacer eso. Estoy en el medio de hacer eso ahora, limpiando una fusión que salió mal.Ejemplo:
Muestra la diferencia en ese archivo entre esas confirmaciones.
fuente
Para verificar los cambios completos:
Para verificar solo los archivos modificados / agregados / eliminados:
NOTA : Para verificar diff sin commit en el medio, no necesita poner los identificadores de commit.
fuente
Digamos que tienes esto
Y quieres asegurarte de que
A
sea lo mismo queA0
.Esto hará el truco:
fuente
diff <(git diff B A) <(git diff D A0)
(el mismo resultado que con git show)Suponga que quiere ver la diferencia entre commits 012345 y abcdef. Lo siguiente debe hacer lo que quieras:
fuente
¿Qué hay de esto?
Es útil simplemente canalizarlo a menos si desea comparar muchas diferencias diferentes sobre la marcha.
fuente
Desde Git 2.19, simplemente puede usar:
git range-diff rev1...rev2
- compara dos árboles de compromiso, comenzando por su ancestro comúno
git range-diff rev1~..rev1 rev2~..rev2
- compare los cambios introducidos por 2 commits dadosfuente
Mi
alias
configuración en el~/.bashrc
archivo paragit diff
:fuente
Mi
alias
configuración en el~/.zshrc
archivo paragit diff
:Gracias @Jinmiao Luo
git diff HEAD~2 HEAD
cambio completo entre la última segunda confirmación y la actual.
HEAD
es convenientefuente
Escribí un script que muestra la diferencia entre dos confirmaciones, funciona bien en Ubuntu.
https://gist.github.com/jacobabrahamb4/a60624d6274ece7a0bd2d141b53407bc
fuente