Obtenga todos los archivos que se han modificado en git branch

209

¿Hay alguna manera de ver qué archivos han cambiado en una rama?

Raif
fuente
2
No son mis empleados, son mis colegas y no son ellos en particular tanto como las personas en general. Pero sí, releer esta publicación parece un poco agro. :)
Raif
3
¿Puedes usar github o bitbucket, gitlab? Existen herramientas para gestionar exactamente esta situación. El desarrollador hace una solicitud de extracción. Recibirá la solicitud y tendrá acceso a una interfaz muy buena que le mostrará una diferencia de todos los cambios realizados en cada archivo. Incluso puede comentar, solicitar cambios, etc. Cuando los cambios son buenos, puede aceptar la solicitud que fusionará los cambios en la rama solicitada (normalmente se desarrolla). Esa es la mejor forma de manejar esta situación.
Scott Wright

Respuestas:

168

Una alternativa a la respuesta de @Marco Ponti, y evitando el pago:

git diff --name-only <notMainDev> $(git merge-base <notMainDev> <mainDev>)

Si su shell en particular no entiende la construcción $ (), use back-ticks en su lugar.

Twalberg
fuente
1
ah! esto es muy divertido, ¿qué tal si quiero decir <notMainDev> ser la rama actual en la que estoy? eso no tiene que especificarlo?
Raif
29
git diff --name-only <some-other-branch>le mostrará qué archivos son diferentes entre su rama actual y <some-other-branch>. Por lo que es esencialmente el mismo comando, pero tenga en cuenta que puede utilizar esto para encontrar los archivos que son diferentes entre las dos ramas, incluso si no están relacionados de forma remota. Si esa comparación es útil o no depende de la topología de sus ramas ... Además, tenga en cuenta que <some-other-branch>realmente podría ser cualquier confirmación, o cualquier cosa que se resuelva en una (etiquetas, etc.).
twalberg
hmmm, bueno, supongo que lo que quiero decir es que me gustaría hacer git diff --name-only <notMainDev> $ (git merge-base <notMainDev> <MY_CURRENT_CO_BRANCH>) donde MY_CURRENT_CO_BRANCH sería, por supuesto, mi sucursal actual.
Raif
Tú también puedes hacer eso. Eso encontrará el punto donde, <notMainDev>y <MY_CURRENT_CO_BRANCH>más recientemente, tuvo un ancestro común, y lo comparará <notMainDev>con ese ancestro. Sin embargo, deberá proporcionar su nombre de sucursal actual, ya que git merge-baseespera dos argumentos: no hay un acceso directo, al menos en la versión actual.
twalberg
1
¡Okay! Lo tengo. Cortesía de mi colega, ¿cómo se llama? git merge-base <notMainDev> git branch | grep '\*' | awk '{print $2}' que obtendrá la confirmación de la rama entre <notMainDev> y mi rama actual. Entonces puedo hacer git diff --name-only <notMainDev> $ (git merge-base <notMainDev> git branch | grep '\*' | awk '{print $2}')
Raif
147

Todo lo que tienes que hacer es lo siguiente:

git checkout <notMainDev>
git diff --name-only <mainDev>

Esto le mostrará solo los nombres de archivo que son diferentes entre las dos ramas.

Marco Ponti
fuente
wow rápido y también el punto. gracias. por cierto me encanta git. siempre es rápido y al grano
Raif
23
Sin <mainDev>embargo, creo que eso también mostrará cosas que han cambiado desde que las ramas divergieron. Es posible que desee utilizar git diff --name-only <sha-of-branch-point>en su lugar, o ver la respuesta alternativa que publiqué que evita el pago.
twalberg
Sí, eso es cierto @twalberg, mostraría esos cambios si las ramas son divergentes. Estaba asumiendo notMainDevque se mantendría actualizado con los compromisos de mainDev ... Sin embargo, generalmente también me resulta útil ver esas diferencias.
Marco Ponti
¿No puedes especificar --derecho solo para mostrar solo los archivos que se modificaron en el lado derecho?
TheZenker
obtienes el <sha-of-branch-point>congit rev-parse <branch-name>
fc9.30 01 de
69

asombrado esto no se ha dicho hasta ahora!

git diff master...branch

Entonces vea los cambios solo en branch

Para verificar el uso actual de la sucursal

git diff master...

Gracias a jqr

Esta es una mano corta para

git diff $(git merge-base master branch) branch

entonces la base de fusión (la confirmación común más reciente entre las ramas) y la punta de la rama

También usar origen / maestro en lugar de solo maestro ayudará en caso de que su maestro local esté fechado

exussum
fuente
44
Si bien esto muestra lo que ha cambiado, muestra TODOS los cambios, en lugar de un resumen de los archivos modificados ... que es lo que me llevó a esta página en primer lugar :)
Chris Rutledge
1
luego agregue la bandera --name-only a esto. o --short-stat
exussum
2
git diff --name-only master..si solo desea los nombres de los archivos que son diferentes entre las dos ramas.
Adam
1
Esto no funcionará correctamente si su maestro tenía confirmaciones después de que creó su rama lateral.
simplylizz
2
@simplylizz sí lo hace. eso es exactamente lo que esto está resolviendo
exussum
45

No puedo creer que haya tantas maneras de hacer esto. Uso lo que cambió como alguien publicado antes, solo con los siguientes argumentos:

git whatchanged --name-only --pretty="" origin..HEAD

Esto solo enumera los nombres de archivo, y solo los que cambiaron en la rama actual.

lukiller
fuente
3
Esta parece ser la respuesta más fácil aquí, ya que no requiere información adicional. ¡El resultado parece correcto y es mucho más fácil de recordar que la respuesta aceptada!
RickMeasham
1
Gracias, esto es interesante, más prolijo. Proporciona salida para cada confirmación, en orden inverso. git-whatchanged - Mostrar registros con diferencia cada confirmación presenta git-scm.com/docs/git-whatchanged
nealmcb
De los documentos de git :New users are encouraged to use git-log instead. The whatchanged command is essentially the same as git-log but defaults to show the raw format diff output and to skip merges.
Derek S
21

Realmente me gustó la respuesta de @ twalberg, pero no quería tener que escribir el nombre de la sucursal actual todo el tiempo. Entonces estoy usando esto:

git diff --name-only $(git merge-base master HEAD)
Sip_It's_Me
fuente
1
Su solución funciona para mí y obtengo la lista de archivos que espero ver. Soy un novato de Git y lo he utilizado git diff master... --name-onlycuando se ejecuta en la rama de destino y obtengo el mismo resultado. ¿Podrías ser tan amable de darnos tu opinión sobre lo que es bueno o malo entre tu respuesta y el comando que he proporcionado?
hungerstar
Su comando funcionará exactamente igual, si el maestro no tiene nuevos compromisos desde que se creó su rama. Creo que mi comando será equivalente a git diff master.. --name-only(tenga en cuenta que solo hay 2 puntos en lugar de 3). Para entender lo que significan los puntos, vea esta respuesta
Sí, es el
¡Increíble! Gracias por la rápida respuesta y comprensión. Muy apreciado.
Hungertar
12

git whatchanged Parece ser una buena alternativa.

chalasr
fuente
1
Qué era exactamente lo que estaba buscando.
Sild
De los documentos de git :New users are encouraged to use git-log instead. The whatchanged command is essentially the same as git-log but defaults to show the raw format diff output and to skip merges.
Derek S
9
git diff --name-only master...branch-name

con lo que queremos comparar

Rajesh Dusa
fuente
Parece una parte de una respuesta existente, stackoverflow.com/a/41486181/11912
James Skemp
Esta variación compara la CABEZA del maestro con una rama actual. La respuesta aceptada compara el estado del maestro en el punto en que se bifurcó . Cualquiera de los dos puede tener la respuesta que está buscando, dependiendo de lo que quiera saber.
Mark Stosberg
8

¿Y si pudiera ser tan fácil como esto?

git changed

Si está dispuesto a asumir que la rama principal se llama "maestra" y que crea sus otras ramas desde la maestra, puede agregar este alias a su ~/.gitconfigarchivo para que sea más fácil:

cbranch = !"git branch | grep '*' | cut -f2 -d' '"
changed = !"git diff --name-only $(git cbranch) $(git merge-base $(git cbranch) master)"

Esos supuestos funcionarán para la mayoría de las personas en la mayoría de las situaciones, pero debes ser consciente de que los estás haciendo.

Además, debe usar un shell que sea compatible $(). Es muy probable que su shell lo admita .

iconoclasta
fuente
3
git show --stat origin/branch_name

Esto le dará una lista de los archivos que se agregaron o modificaron en esta rama.

Badari
fuente
2
Esto está mal, esto solo muestra los archivos modificados en la confirmación principal de esa rama, no toda la rama.
davidtbernal
2

Por alguna razón, nadie lo mencionó git-tree. Ver https://stackoverflow.com/a/424142/1657819

git-treese prefiere porque es un comando de plomería ; destinado a ser programático (y, presumiblemente, más rápido)

(suponiendo que la rama base es master)

git diff-tree --no-commit-id --name-only -r master..branch-name

Sin embargo, esto le mostrará todos los archivos que se vieron afectados en la rama, si solo desea ver archivos modificados explícitamente , puede usar --diff-filter:

git diff-tree --no-commit-id --name-only -r master..branch-name --diff-filter=M

También se puede usar en --name-statuslugar de --name-onlyver el estado de los archivos ( A/ M/ Dy así sucesivamente)

El Padrino
fuente
Esto era justo lo que necesitaba para alinear los archivos modificados y excluir los que se eliminaron. rubocop --fail-level error $(git diff-tree --no-commit-id --name-only -r origin/master..HEAD --diff-filter=M)
HarlemSquirrel
1

La respuesta aceptada git diff --name-only <notMainDev> $(git merge-base <notMainDev> <mainDev>)- está muy cerca, pero noté que tenía el estado incorrecto para las eliminaciones. Agregué un archivo en una rama y, sin embargo, este comando (usando --name-status) dio el archivo que eliminé el estado "A" y el archivo que agregué el estado "D".

Tuve que usar este comando en su lugar:

git diff --name-only $(git merge-base <notMainDev> <mainDev>)
Connor Clark
fuente
0

Ampliando lo que tenían @twalberg y @iconoclast, si está usando cmd por cualquier razón, puede usar:

FOR /F "usebackq" %x IN (`"git branch | grep '*' | cut -f2 -d' '"`) DO FOR /F "usebackq" %y IN (`"git merge-base %x master"`) DO git diff --name-only %x %y
Lunyx
fuente
0

El siguiente archivo por lotes se basa en la respuesta de twalberg, pero funcionará en Windows:

@ECHO OFF
C:                               :: <== OR USE A DIFFERENT DRIVE
CD \path\to\where\git\files\are  :: <== CHANGE TO THE ACTUAL PATH
SET /p b="Enter full path of an ALREADY MERGED branch to compare with origin/master: "
bash --login -i -c "git diff --name-only %b% $(git merge-base %b1% origin/drop2/master)"
PAUSE

Lo anterior supone que la rama principal es origin / master y que git bash se incluyó cuando se instaló Git (y su ubicación se encuentra en el entorno de la ruta). De hecho, necesitaba mostrar las diferencias reales usando una herramienta diff configurada (kdiff3), así que sustituí el siguiente comando bash anterior:

bash --login -i -c "git difftool --dir-diff %b% $(git merge-base %b1% origin/drop2/master)"
Steve Chambers
fuente
0

Uso grep, así que solo obtengo las líneas con diff --git, que son la ruta de los archivos:

git diff branchA branchB | grep 'diff --git'
// OUTPUTS ALL FILES WITH CHANGES, SIMPLE HA :)
diff --git a/package-lock.json b/package-lock.json
T04435
fuente