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:
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}')
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
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:
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:
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.
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.
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:
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:
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".
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:
Respuestas:
Una alternativa a la respuesta de @Marco Ponti, y evitando el pago:
Si su shell en particular no entiende la construcción $ (), use back-ticks en su lugar.
fuente
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.).<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 quegit merge-base
espera dos argumentos: no hay un acceso directo, al menos en la versión actual.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}'
)Todo lo que tienes que hacer es lo siguiente:
Esto le mostrará solo los nombres de archivo que son diferentes entre las dos ramas.
fuente
<mainDev>
embargo, creo que eso también mostrará cosas que han cambiado desde que las ramas divergieron. Es posible que desee utilizargit diff --name-only <sha-of-branch-point>
en su lugar, o ver la respuesta alternativa que publiqué que evita el pago.notMainDev
que se mantendría actualizado con los compromisos de mainDev ... Sin embargo, generalmente también me resulta útil ver esas diferencias.<sha-of-branch-point>
congit rev-parse <branch-name>
asombrado esto no se ha dicho hasta ahora!
Entonces vea los cambios solo en
branch
Para verificar el uso actual de la sucursal
Gracias a jqr
Esta es una mano corta para
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
fuente
git diff --name-only master..
si solo desea los nombres de los archivos que son diferentes entre las dos ramas.No puedo creer que haya tantas maneras de hacer esto. Uso lo que cambió como alguien publicado antes, solo con los siguientes argumentos:
Esto solo enumera los nombres de archivo, y solo los que cambiaron en la rama actual.
fuente
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.
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:
fuente
git diff master... --name-only
cuando 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?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 respuestagit whatchanged
Parece ser una buena alternativa.fuente
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.
con lo que queremos comparar
fuente
¿Y si pudiera ser tan fácil como esto?
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
~/.gitconfig
archivo para que sea más fácil: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 .fuente
Esto le dará una lista de los archivos que se agregaron o modificaron en esta rama.
fuente
Por alguna razón, nadie lo mencionó
git-tree
. Ver https://stackoverflow.com/a/424142/1657819git-tree
se 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
)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
:También se puede usar en
--name-status
lugar de--name-only
ver el estado de los archivos (A
/M
/D
y así sucesivamente)fuente
rubocop --fail-level error $(git diff-tree --no-commit-id --name-only -r origin/master..HEAD --diff-filter=M)
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:
fuente
Ampliando lo que tenían @twalberg y @iconoclast, si está usando cmd por cualquier razón, puede usar:
fuente
El siguiente archivo por lotes se basa en la respuesta de twalberg, pero funcionará en Windows:
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:
fuente
Uso grep, así que solo obtengo las líneas con diff --git, que son la ruta de los archivos:
fuente