Cómo obtener los cambios en una sucursal en Git


266

¿Cuál es la mejor manera de obtener un registro de confirmaciones en una rama desde el momento en que se bifurcó desde la rama actual? Mi solución hasta ahora es:

git log $(git merge-base HEAD branch)..branch

La documentación para git-diff indica que git diff A...Bes equivalente a git diff $(git-merge-base A B) B. Por otro lado, la documentación para git-rev-parse indica que r1...r2se define como r1 r2 --not $(git merge-base --all r1 r2).

¿Por qué son diferentes? Tenga en cuenta que git diff HEAD...branchme da las diferencias que quiero, pero el comando git log correspondiente me da más de lo que quiero.

En imágenes, suponga esto:

         x --- y --- z --- rama
        / /
--- a --- b --- c --- d --- e --- HEAD

Me gustaría obtener un registro que contenga commits x, y, z.

  • git diff HEAD...branch da estos compromisos
  • sin embargo, git log HEAD...branchda x, y, z, c, d, e.

Estás usando "git log" incorrectamente para tus propósitos por lo que puedo ver. He agregado mi respuesta a continuación.
PlagueHammer

Respuestas:


187

En el contexto de una lista de revisión, A...Bes cómo la git-rev-parsedefine. git-log toma una lista de revisión. git-diffno toma una lista de revisiones: toma una o dos revisiones y ha definido la A...Bsintaxis para indicar cómo se define en la página de git-diffmanual. Si git-diffno se definió explícitamente A...B, entonces esa sintaxis sería inválida. Tenga en cuenta que la página de git-rev-parsemanual se describe A...Ben la sección "Especificación de rangos", y todo en esa sección solo es válido en situaciones en las que un rango de revisión es válido (es decir, cuando se desea una lista de revisión).

Para obtener un registro que contiene solo x, y, z, try git log HEAD..branch(dos puntos, no tres). Esto es idéntico a git log branch --not HEAD, y significa todos los commits en la rama que no están en HEAD.


31
Wow, eso es confuso. Resulta que el uso de "git diff HEAD..branch" muestra todos los commits (x, y, z, c, d, e), pero "git log HEAD..branch" hace exactamente lo que quiero y solo muestra x, y , z! Esto es exactamente lo contrario de usar "...".
Greg Hewgill

22
git diff HEAD..branches idéntico al git diff HEAD branch. La clave para recordar aquí es que el registro toma una lista / rango de revisiones, mientras que diff no. Es por eso que tratan sus argumentos de manera diferente.
Lily Ballard

44
Parece que git diff HEAD...branch(tres puntos) corresponde a la salida degit log HEAD..branch
jchook

72
git cherry branch [newbranch]

hace exactamente lo que pides cuando estás en la mastersucursal.

También soy muy aficionado a:

git diff --name-status branch [newbranch]

Lo cual no es exactamente lo que estás preguntando, pero sigue siendo muy útil en el mismo contexto.


8
'git cherry' genera una lista de ID de confirmación. ¿Puedo convertirlos en un único diff que combine todos los cambios en cada commit?
Jonathan Hartley

1
git cherryes muy útil de hecho. Gracias :)
jkp

2
@JonathanHartley Tome el primer y el último me gusta de los ID de confirmación y tírelos a gif-diff:, git diff x..zo para mi propio ejemplo, es git diff 13bc4d..8eda3a.
Towi

3
Es difícil entender qué código debe ser reemplazado en su comando como en el que uno de sucursal o newbranch es una palabra clave y que deberían ser sustituidos por nombre de la rama de encargo
pal4life

37

Lo que quiere ver es la lista de confirmaciones salientes. Puedes hacer esto usando

git log master..branchName 

o

git log master..branchName --oneline

Donde supongo que "branchName" se creó como una rama de seguimiento de "master".

Del mismo modo, para ver los cambios entrantes puede usar:

git log branchName..master

1
@ABB, si se omite branchName, el valor predeterminado es "head", que efectivamente es branchName en el ejemplo anterior.
PlagueHammer

25

Esto es similar a la respuesta que publiqué en: Vista previa de un Git push

Coloque estas funciones en su perfil de Bash:

  • gbout - git branch saliente
  • gbin - git branch entrante

Puedes usar esto como:

  • Si está en master: gbin branch1 <- esto le mostrará lo que hay en branch1 y no en master
  • Si está en master: gbout branch1 <- esto le mostrará lo que hay en master que no está en branch 1

Esto funcionará con cualquier rama.

function parse_git_branch {
  git branch --no-color 2> /dev/null | sed -e '/^[^*]/d' -e 's/* \(.*\)/\1/'
}

function gbin {
    echo branch \($1\) has these commits and \($(parse_git_branch)\) does not
    git log ..$1 --no-merges --format='%h | Author:%an | Date:%ad | %s' --date=local
}

function gbout {
    echo branch \($(parse_git_branch)\) has these commits and \($1\) does not
    git log $1.. --no-merges --format='%h | Author:%an | Date:%ad | %s' --date=local
}

16

Similar a varias respuestas como Alex V y NDavis, pero ninguna de ellas es la misma.

Cuando ya está en la sucursal en cuestión

Utilizando:

git diff master...

Que combina varias características:

  • es supercorto
  • muestra los cambios reales

Actualizar:

Esto probablemente debería ser git diff master, pero también muestra la diferencia, no las confirmaciones como la pregunta especificada.


2
Si lo ha hecho git co master; git pulldesde que creó la bifurcación, git diff masterno será de mucha utilidad obtener las diferencias introducidas SOLO por los commits en la bifurcación especificada.
Guival

1
O para especificar ramas explícitamente: git diff <branch1>...<branch2>mostrará los cambios introducidos por branch2.
Alex

10

Lanza una -p allí para ver algunos CAMBIOS DE ARCHIVO

git log -p master..branch

Haz algunos alias:

alias gbc="git branch --no-color | sed -e '/^[^\*]/d' -e 's/* \\(.*\\)/\1/'"

alias gbl='git log -p master..\`gbc\`'

Vea los commits únicos de una sucursal:

gbl

6

Para ver el registro de la rama actual desde la ramificación del maestro:

git log master...

Si actualmente está en el maestro, para ver el registro de una rama diferente desde que se bifurcó del maestro:

git log ...other-branch


4
git log --cherry-mark --oneline from_branch...to_branch

(3dots) pero a veces muestra '+' en lugar de '='


3 puntos muestra el primer commit en la rama dos veces, mientras que dos no.
TJ Biddle

2

encontré

git diff <branch_with_changes> <branch_to_compare_to>

más útil, ya que no solo obtienes los mensajes de confirmación, sino toda la diferencia. Si ya está en la rama de la que desea ver los cambios y (por ejemplo) quiere ver qué ha cambiado en el maestro, puede usar:

git diff HEAD master
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.