Obtenga todos los archivos que se han modificado en git branch


209

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



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.


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.


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


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.


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)

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.


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


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 .


3
git show --stat origin/branch_name

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


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)


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>)

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

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)"

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
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.