Git diff entre la rama actual y la maestra pero sin incluir las confirmaciones maestras no fusionadas

171

Quiero una diferencia de todos los cambios en una rama que aún no se fusionó para dominar.

Lo intenté:

git diff master
git diff branch..master
git diff branch...master

Sin embargo, en cada uno de estos casos, el diff contiene contenido en master que aún no se ha fusionado en mi rama.

¿Hay alguna manera de hacer una diferencia entre mi rama y el maestro que excluya los cambios en el maestro que aún no se han fusionado en mi rama?

pillarOfLight
fuente
9
Si le da la vuelta alrededor de la segunda versión, se obtiene lo que desea: git diff master..branch. Puede acortarlo git diff master..si está en la rama. La r1..r2sintaxis es la abreviatura ^r1 r2que significa "muéstrame todo lo que desciende r2y no es accesible desde r1". git help gitrevisionstiene información sobre las diversas sintaxis que puede usar.
John Szakmeister
1
Expandí mi respuesta después de leer más sobre la ...sintaxis de git diff. Su comentario es incorrecto, @jszakmeister, porque los rangos de revisión como se describen en gitrevisionsno tienen nada que ver git diff. Diff compara dos puntos en la historia, no puede funcionar con un rango.
Palec
Estás en lo correcto. Siempre olvido que git difffunciona de manera diferente a los otros comandos ... un hecho que encuentro frustrante. :-(
John Szakmeister
asegúrese de actualizar la copia local de master antes de comparar
joe

Respuestas:

232
git diff `git merge-base master branch`..branch

La base de fusión es el punto de donde branchdivergen master.

Git diff admite una sintaxis especial para esto:

git diff master...branch

No debe intercambiar los lados porque entonces obtendría la otra rama. Desea saber qué cambió branchya que divergió master, no al revés.

Vagamente relacionados:


Tenga en cuenta que ..y la ...sintaxis no tiene la misma semántica que en otras herramientas de Git. Difiere del significado especificado en man gitrevisions.

Citando man git-diff:

  • git diff [--options] <commit> <commit> [--] [<path>…]

    Esto es para ver los cambios entre dos arbitrarios <commit>.

  • git diff [--options] <commit>..<commit> [--] [<path>…]

    Esto es sinónimo de la forma anterior. Si <commit>se omite por un lado, tendrá el mismo efecto que usar en su HEADlugar.

  • git diff [--options] <commit>...<commit> [--] [<path>…]

    Este formulario es para ver los cambios en la rama que contiene y hasta el segundo <commit>, comenzando en un antepasado común de ambos <commit>. " git diff A...B" es equivalente a " git diff $(git-merge-base A B) B". Puede omitir cualquiera de ellos <commit>, que tiene el mismo efecto que usar en su HEADlugar.

En caso de que esté haciendo algo exótico, debe tenerse en cuenta que todo lo de la <commit>descripción anterior, excepto en las dos últimas formas que usan anotaciones "..", puede ser cualquiera <tree>.

Para obtener una lista más completa de formas de deletrear <commit>, consulte la sección "ESPECIFICAR REVISIONES" en gitrevisions[7]. Sin embargo, "diff" se trata de comparar dos puntos finales, no rangos, y las anotaciones de rango (" <commit>..<commit>" y " <commit>...<commit>") no significan un rango como se define en la sección "ESPECIFICAR RANGOS" en gitrevisions[7].

Palec
fuente
Para mí $ git diff master...branchproduje fatal: ambiguous argument 'master...branch': unknown revision or path not in the working tree.- se trata de un comando dependiente de la versión?
Joel Peltonen
En realidad, me acabo de dar cuenta de que "sucursal" debe ser el nombre de su sucursal, pensé que era una referencia a la sucursal actual
Joel Peltonen
44
Tienes razón, mi respuesta se basa en la rama que se llama branch. Elegí seguir con el nombre que el OP había elegido en la pregunta. Si desea utilizar la rama actual, reemplácela branchcon HEAD.
Palec
14
Tenga en cuenta que puede usar git diff master...para evitar especificar la rama (se tomará la actual).
VasiliNovikov
1
¿ develFunciona el comando original después de que hayas salido , @ChrisGuest? Probablemente, Git creó la rama para usted durante el pago, como una copia local de una rama remota (normalmente origin/devel). Si ese fuera el caso, git diff origin/devel...bugfix/API-353-api-allows-database-access-whenhabría funcionado incluso antes del pago.
Palec
44

Esto es lo que funcionó para mí:

git diff origin/master...

Esto muestra solo los cambios entre mi rama local seleccionada actualmente y la rama maestra remota, e ignora todos los cambios en mi rama local que provienen de confirmaciones de fusión.

Jeshurun
fuente
Como referencia, si necesita las referencias de confirmación de las confirmaciones que contienen estos cambios, use git cherry origin/master.
jaytibann
Si esto muestra un montón de basura que no esperaba, masterpuede haber cambiado un conjunto de confirmaciones debajo de usted.
Michael - ¿Dónde está Clay Shirky?
21

Como también señalaron John Szakmeister y VasiliNovikov, el comando más corto para obtener la diferencia completa desde la perspectiva del maestro en su rama es:

git diff master...

Esto usa su copia local de master.

Para comparar un archivo específico use:

git diff master... filepath

Ejemplo de salida:

Ejemplo de uso

Andrew Schreiber
fuente