Cómo obtener los cambios en una rama en Git
Pregunta
¿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 diferencia git indica que git diff A...B
es equivalente a git diff $(git-merge-base A B) B
.Por otra parte, la documentación para git-rev-parse indica que r1...r2
Se define como r1 r2 --not $(git merge-base --all r1 r2)
.
¿Por qué son diferentes?Tenga en cuenta que git diff HEAD...branch
me da las diferencias que quiero, pero el comando git log correspondiente me da más de lo que quiero.
En imágenes, supongamos esto:
x---y---z---branch / ---a---b---c---d---e---HEAD
Me gustaría obtener un registro que contenga las confirmaciones x, y, z.
git diff HEAD...branch
da estos compromisos- sin embargo,
git log HEAD...branch
da x, y, z, c, d, e.
Solución
En el contexto de una lista de revisión, A...B
es como git-rev-parse
lo define.git-log toma una lista de revisión. git-diff
no requiere una lista de revisiones: requiere una o dos revisiones y ha definido el A...B
sintaxis significa cómo se define en el git-diff
página de manual.Si git-diff
no definió explícitamente A...B
, entonces esa sintaxis no sería válida.Tenga en cuenta que el git-rev-parse
la página de manual describe A...B
en la sección "Especificar rangos", y todo lo contenido en esa sección solo es válido en situaciones donde un rango de revisión es válido (es decir,cuando se desea una lista de revisión).
Para obtener un registro que contenga solo x, y y z, intente git log HEAD..branch
(dos puntos, no tres).Esto es idéntico a git log branch --not HEAD
, y significa todas las confirmaciones en la rama que no están en HEAD.
Otros consejos
git cherry branch [newbranch]
hace exactamente lo que estás pidiendo, cuando estás en el master
rama.
También me gustan mucho:
git diff --name-status branch [newbranch]
Que no es exactamente lo que estás preguntando, pero sigue siendo muy útil en el mismo contexto.
Lo que quieres 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".
De manera similar, para ver los cambios entrantes puedes usar:
git log branchName..master
Esto es similar a la respuesta que publiqué en: Vista previa de una inserción de Git
Coloque estas funciones en su perfil de Bash:
- gabout - rama git saliente
- gbin - rama git entrante
Puedes usar esto como:
- Si está en maestro:Gbin Branch1 <- Esto te mostrará lo que hay en Branch1 y no en Master
- Si está en maestro:Gbout Branch1 <- Esto te mostrará lo que hay en el maestro que no está en la Rama 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
}
Similar a varias respuestas como las de Alex V y NDavis, pero ninguna de ellas es exactamente igual.
Cuando ya esté en la sucursal en cuestión
Usando:
git diff master...
Que combina varias características:
- es super corto
- muestra los cambios reales
Actualizar:
Esto probablemente debería ser git diff master
, pero también esto muestra la diferencia, no las confirmaciones como se especifica en la pregunta.
Introduzca -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 las confirmaciones únicas de una rama:
gbl
Para ver el registro de la rama actual desde que se bifurcó en master:
git log master...
Si actualmente está en master, para ver el registro de una rama diferente desde que se bifurcó en master:
git log ...other-branch
git log --cherry-mark --oneline from_branch...to_branch
(3 puntos) pero a veces muestra '+' en lugar de '='
encontré
git diff <branch_with_changes> <branch_to_compare_to>
más útil, ya que no solo recibes los mensajes de confirmación sino también toda la diferencia.Si ya está en la rama de la que desea ver los cambios y (por ejemplo) desea ver qué ha cambiado en la rama maestra, puede usar:
git diff HEAD master