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.
Greg Hewgill
fuente
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.

Lily Ballard
fuente
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.

skiphoppy
fuente
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
Martillo de peste
fuente
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
}
Clintm
fuente
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.

Michael Durrant
fuente
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
Alex V
fuente
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

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

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

nopsoft
fuente
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
Dominik Ehrenberg
fuente