Mostrar qué archivos han cambiado entre dos revisiones

2105

Quiero fusionar dos ramas que se han separado por un tiempo y quería saber qué archivos se han modificado.

Encontré este enlace: http://linux.yyz.us/git-howto.html que fue bastante útil.

Las herramientas para comparar ramas que he encontrado son:

  • git diff master..branch
  • git log master..branch
  • git shortlog master..branch

Me preguntaba si hay algo como "git status master..branch" para ver solo aquellos archivos que son diferentes entre las dos ramas.

Sin crear una nueva herramienta, creo que esto es lo más cerca que puedes llegar a hacerlo ahora (que por supuesto mostrará repeticiones si un archivo se modificó más de una vez):

  • git diff master..branch | grep "^diff"

Me preguntaba si hay algo que me perdí ...

johannix
fuente
12
¿Cuántos otros encuentran el título de esta pregunta engañoso? En realidad, se trata de encontrar las diferencias de archivo entre dos ramas. Lo que vine a buscar aquí fue cómo ver las diferencias de archivos entre dos revisiones en la misma rama. ¿O soy el único?
Sandeepan Nath
44
@SandeepanNath: con git no hay diferencia. SIEMPRE te refieres a commits individuales.
Samuel O'Malley
@ SamuelO'Malley Soy nuevo en git y estoy considerando la estrategia de ramificación aparentemente común en la que todas las ramas finalmente se fusionan con la rama maestra y, finalmente, se despliega el maestro. Ahora, considerando el evento de un lanzamiento, donde la producción ya está en el maestro, pero detrás de la punta (por una revisión si el último lanzamiento ocurrió después de la última fusión maestra), me gustaría ver las diferencias entre estas dos revisiones, para descubra lo que se lanzaría. No me gustaría mirar la rama que se fusionó por última vez. Corrígeme si estoy equivocado.
Sandeepan Nath
2
@SandeepanNath: en lugar de usar los nombres de las ramas, puede tomar las respuestas a continuación y solo especificar las ID de confirmación. O incluso refiera los commits por sus nombres de etiquetas si crea etiquetas cuando se implementa.
Samuel O'Malley
1
@SandeepanNath No puede comparar 2 ramas, debe especificar la revisión. Entonces, comparar 2 ramas es comparar 2 revisiones.
Bastien Vandamme

Respuestas:

2575

Para comparar la rama actual contra la masterrama:

$ git diff --name-status master

Para comparar dos ramas cualquiera:

$ git diff --name-status firstbranch..yourBranchName

Siga leyendo git diffen la documentación oficial .

JasonSmith
fuente
2
¿Qué significan cada uno de los índices en el lado izquierdo (veo muchas M y D)?
gogogadgetinternet 05 de
15
@ user446936: puede ver el significado de las letras en la página de manual de estado de git @ kernel.org/pub/software/scm/git/docs/git-status.html , en particular, M == modificado, D == eliminado
James Manning
12
git diff --name-status your_branch...mastergenera los cambios que ocurrieron en el maestro desde que se creó your_branch a partir de él
Radu
1
El operador de doble punto es superfluo, aquí, porque las diferencias son por pares.
jub0bs
2
Me sale una revisión desconocida o una ruta que no está en el árbol de trabajo.
SuperUberDuper
408

Tratar

$ git diff --stat --color master..branchName

Esto le dará más información sobre cada cambio, mientras sigue usando el mismo número de líneas.

También puede voltear las ramas para obtener una imagen aún más clara de la diferencia si tuviera que fusionarse de la otra manera:

$ git diff --stat --color branchName..master
Gerry
fuente
77
Si tiene el color git (altamente recomendado, en mi opinión) activado ( config --global color.ui true), puede omitir el --color. (Tengo lks - síndrome de teclado perezoso).
Art Swri
25
Estoy contigo en color! Por cierto, quería decir git config --global color.ui true, para ser completo.
Art Swri
2
No funciona, arroja errores:fatal: ambiguous argument 'master..branchName': unknown revision or path not in the working tree.
Tomáš Zato - Restablece a Mónica el
77
@ TomášZato lo siento, pero necesita intercambiar "branchName" con el nombre de su sucursal.
Gerry
161

También tenga en cuenta que git tiene una ramificación barata y fácil. Si creo que una fusión podría ser problemática, creo una rama para la fusión. Entonces, si mastertiene los cambios que deseo fusionar y bami rama necesita el código del maestro, podría hacer lo siguiente:

git checkout ba
git checkout -b ba-merge
git merge master
.... review new code and fix conflicts....
git commit
git checkout ba
git merge ba-merge
git branch -d ba-merge
git merge master

El resultado final es que tuve que probar la fusión en una rama desechable antes de atornillarla. Si me enredo, puedo eliminar la ba-mergerama y comenzar de nuevo.

Eric Anderson
fuente
44
Increíble. Nunca he pensado en ramificar de esa manera. Creo que esto debería considerarse como parte de las "mejores prácticas" al fusionarse.
egelev 01 de
Cuando fusionas el ba-marge nuevamente en ba, ¿no existe la posibilidad de tener que arreglar los conflictos nuevamente?
Josef.B
2
@EricAnderson Correcto, es un gráfico. SVN se pega como goma de mascar debajo del escritorio de la escuela. gracias.
Josef.B
1
¿Por qué se necesita hacer último paso 'master git merge' si ba-merge ya tenía maestro
qwebek
Podrías dejarlo. La única razón por la que sería útil es si nuevas cosas aterrizan mastermientras trabajabas en revisar el código y solucionar conflictos.
Eric Anderson
58

Si alguien intenta generar un archivo diff a partir de dos ramas:

git diff master..otherbranch > myDiffFile.diff
Paulino III
fuente
2
Esto ha sido útil especialmente con grandes ramas que contienen muchas diferencias.
vandsh
Esto es útil cuando la diferencia es realmente grande. Por defecto, no mostraría todas las diferencias en la consola (me preguntaba por qué), en ese caso, pasar la diferencia a un archivo es la mejor opción.
Rotimi-best
42

También hay un método basado en GUI.

Puedes usar gitk .

  1. Correr:

    $ gitk --all
    
  2. Haga clic derecho en una confirmación de una rama y seleccione Marcar esta confirmación en el menú emergente.

  3. Haga clic derecho en un commit de otra rama y seleccione Diff this -> commit marcado o Diff marcado commit -> this .

Luego habrá una lista de archivos modificados en el panel inferior derecho y detalles de diferencias en el panel inferior izquierdo.

Yantao Xie
fuente
3
@Orwellophile Subo un video para mostrar cómo hacerlo. Espero que te sirva de ayuda.
Yantao Xie
Wow, solo para mí, me siento especial. Lo he marcado en delicious.com para referencia futura y google-foo adicional.
Orwellophile
Respuesta severamente subestimada. ¡Gracias!
Koshinae
36

Una opción más, usando meld en este caso:

git difftool -d master otherbranch

Esto permite no solo ver las diferencias entre los archivos, sino que también proporciona una manera fácil de señalar y hacer clic en un archivo específico.

rsilva4
fuente
66
Es posible que desee establecer meld como difftool predeterminado: git config --global diff.tool meld
bwv549
1
Este es mi favorito porque usará cualquier herramienta de configuración que configure.
Josiah
No es compatible con OSX. :-(
Mike S.
@MikeS. consulte esta respuesta stackoverflow.com/a/12815806/151918 que contiene instrucciones para OSX. Al menos me funciona, espero que ayude.
rsilva4
Agradable. ¿Pero para qué es la -dopción?
Scotty.NET
29

Tenga en cuenta que git hace que sea fácil probar la fusión y alejarse de cualquier problema si no le gusta el resultado. Puede ser más fácil que buscar posibles problemas de antemano.

David Plumpton
fuente
10
David, que es un buen punto, aunque sería agradable para saber lo que está pasando antes de la mano ...
johannix
18

Y si está buscando cambios solo entre ciertos archivos, entonces:

git diff branch1 branch2 -- myfile1.js myfile2.js

branch1 es opcional y su rama actual (la rama en la que se encuentra) se considerará de forma predeterminada si no se proporciona branch1. p.ej:

git diff master -- controller/index.js
Mannu
fuente
15

Cuando se trabaja en colaboración, o en múltiples funciones a la vez, es común que el upstream o incluso su master contengan trabajo que no está incluido en su rama, y ​​que aparecerá incorrectamente en las diferencias básicas.

Si su Upstream puede haberse movido, debe hacer esto:

git fetch
git diff origin/master...

El simple uso de git diff master puede incluir, o no incluir, cambios relevantes.

Alex Brown
fuente
8

Hay dos ramas, digamos

  • A (rama en la que estás trabajando)
  • B (Otra rama con la que quieres comparar)

Estando en la rama A puedes escribir

git diff --color B

entonces esto te dará una salida de

ingrese la descripción de la imagen aquí

El punto importante sobre esto es

  1. El texto en verde está presente en el interior de la rama A

  2. El texto en rojo está presente en la Rama B

selftaught91
fuente
8

Aquí hay muchas respuestas, pero quería agregar algo que uso habitualmente. SI está en una de las ramas que le gustaría comparar, normalmente hago una de las siguientes. En aras de esta respuesta, diremos que estamos en nuestra rama secundaria. Dependiendo de qué vista necesites en ese momento dependerá de cuál elijas, pero la mayoría de las veces estoy usando la segunda opción de las dos. La primera opción puede ser útil si está intentando volver a una copia original; de cualquier manera, ¡ambos hacen el trabajo!

Esto comparará el maestro con la rama en la que estamos (que es secundaria) y el código original serán las líneas agregadas y el nuevo código se considerará las líneas eliminadas

git diff ..master

O

Esto también comparará el maestro con la rama en la que estamos (que es secundario) y el código original será las líneas antiguas y el nuevo código será las líneas nuevas.

git diff master..
TheCodenator
fuente
1

Si está utilizando Github / Github Enterprise, puede usar la interfaz de usuario web presionando la url /comparede la ruta de su repositorio, por ejemplo, https://github.com/http4s/http4s/compare . Puede seleccionar la rama / commit / etiqueta que desea comparar: Captura de pantalla de Github Compare

Y el diff se presentará en la interfaz de github en la url /compare/{x1}...{x2}donde están x2y x1están la rama / commit / etiqueta que desea comparar, por ejemplo: https://github.com/http4s/http4s/compare/release-0.18.x ...Maestro

Puedes ver más en el Github Doc .

Valy Dia
fuente
0

Para las personas que buscan una solución GUI, Git Cola tiene un muy agradable "Visor de diferencias de sucursal ( Diff -> Sucursales ... ).

kerner1000
fuente
-1
git diff revision_n revision_m

si revision_ny revision_mson confirmaciones sucesivas, entonces sale igual que git show revision_m

Jovo Skorupan
fuente
-2

Si te gusta la GUI y estás usando Windows, aquí hay una manera fácil.

  1. Descargar WinMerge
  2. Mira las dos ramas en diferentes carpetas
  3. Haga una comparación carpeta por carpeta usando WinMerge. También puede realizar modificaciones fácilmente si una de las ramas es en la que está trabajando.
Marius Matioc
fuente
No es la forma más simple, en realidad no hay necesidad de descargar repos para diferir entre las ramas.
stefgosselin
De hecho, no es la forma más simple, pero es la forma de GUI, que a menudo es mucho más fácil, especialmente para ver las diferencias en todos los archivos
Marius Matioc
-3

También puede comparar fácilmente ramas para archivos modificados utilizando, por ejemplo, TortoiseGit . Simplemente haga clic en Examinar referencias y elija las ramas que desea comparar.

Por ejemplo, si compara su rama con master , obtendrá como resultado una lista de archivos que se cambiarán en master si decide fusionar su rama en master .

Recuerde que tendrá un resultado diferente si compara master con your-branch y your-branch con master .

Piotr
fuente
1
la pregunta parece ser sobre la utilidad nativa de git
Vladimir Hraban