Registro de Git para obtener confirmaciones solo para una rama específica
Quiero enumerar todas las confirmaciones que son solo parte de una rama específica.
A continuación, enumera todas las confirmaciones de la rama, pero también del padre (maestro)
git log mybranch
La otra opción que encontré fue excluir las confirmaciones a las que puede acceder el maestro y me da lo que quiero, PERO me gustaría evitar la necesidad de conocer los nombres de las otras ramas.
git log mybranch --not master
Estaba intentando usar git for-each-ref
, pero también incluye mybranch, por lo que en realidad excluye todo:
git log mybranch --not $(git for-each-ref --format '^%(refname:short)' refs/heads/)
Actualizar:
Estoy probando una nueva opción que encontré hace un tiempo, y hasta ahora parece que esto podría ser lo que estaba buscando:
git log --walk-reflogs mybranch
Actualización (2013-02-13T15:08):
La opción --walk-reflogs es buena, pero verifiqué que hay un vencimiento para los reflogs (90 días predeterminado, gc.reflogExpire ).
Creo que encontré la respuesta que estaba buscando:
git log mybranch --not $(git for-each-ref --format='%(refname)' refs/heads/ | grep -v "refs/heads/mybranch")
Simplemente estoy eliminando la rama actual de la lista de ramas disponibles y usando esa lista para excluirla del registro. De esta manera solo obtengo las confirmaciones a las que solo llega mybranch .
Por lo que parece que deberías usar cherry
:
git cherry -v develop mybranch
Esto mostraría todas las confirmaciones que están contenidas en mybranch , pero NO en development . Si deja de lado la última opción ( mybranch ), comparará la rama actual.
Como señaló VonC, SIEMPRE estás comparando tu sucursal con otra sucursal, así que conoce tus sucursales y luego elige con cuál comparar.
PERO me gustaría evitar la necesidad de conocer los nombres de las otras sucursales.
No creo que esto sea posible: una rama en Git siempre se basa en otra o al menos en otra confirmación, como se explica en " git diff no muestra suficiente ":
Necesita un punto de referencia para que su registro muestre las confirmaciones correctas.
Como se menciona en " GIT - ¿Desde dónde me ramifiqué? ":
las ramas son simplemente punteros a ciertas confirmaciones en un DAG
Entonces, incluso si git log master..mybranch
es una respuesta, todavía mostraría demasiadas confirmaciones, si mybranch
se basa en myotherbranch
, a su vez se basa en master
.
Para encontrar esa referencia (el origen de tu rama), solo puedes analizar las confirmaciones y ver en qué rama están, como se ve en:
- " Git: encontrar de qué rama proviene una confirmación ".
- " ¿ Cómo puedo ver de qué rama se bifurcó otra rama? "
Finalmente encontré la manera de hacer lo que quería el OP. Es tan simple como:
git log --graph [branchname]
git log --graph origin/[branchname] # if your local checkout isn't up to date
El comando mostrará todas las confirmaciones a las que se puede acceder desde la rama proporcionada en formato de gráfico. Pero puedes filtrar fácilmente todas las confirmaciones en esa rama mirando el gráfico de confirmaciones cuyo *
es el primer carácter en la línea de confirmación.
Por ejemplo, veamos el extracto del git log --graph master
repositorio GitHub de cakephp a continuación:
D:\Web Folder\cakephp>git log --graph master
* commit 8314c2ff833280bbc7102cb6d4fcf62240cd3ac4
|\ Merge: c3f45e8 0459a35
| | Author: José Lorenzo Rodríguez <[email protected]>
| | Date: Tue Aug 30 08:01:59 2016 +0200
| |
| | Merge pull request #9367 from cakephp/fewer-allocations
| |
| | Do fewer allocations for simple default values.
| |
| * commit 0459a35689fec80bd8dca41e31d244a126d9e15e
| | Author: Mark Story <[email protected]>
| | Date: Mon Aug 29 22:21:16 2016 -0400
| |
| | The action should only be defaulted when there are no patterns
| |
| | Only default the action name when there is no default & no pattern
| | defined.
| |
| * commit 80c123b9dbd1c1b3301ec1270adc6c07824aeb5c
| | Author: Mark Story <[email protected]>
| | Date: Sun Aug 28 22:35:20 2016 -0400
| |
| | Do fewer allocations for simple default values.
| |
| | Don't allocate arrays when we are only assigning a single array key
| | value.
| |
* | commit c3f45e811e4b49fe27624b57c3eb8f4721a4323b
|\ \ Merge: 10e5734 43178fd
| |/ Author: Mark Story <[email protected]>
|/| Date: Mon Aug 29 22:15:30 2016 -0400
| |
| | Merge pull request #9322 from cakephp/add-email-assertions
| |
| | Add email assertions trait
| |
| * commit 43178fd55d7ef9a42706279fa275bb783063cf34
| | Author: Jad Bitar <[email protected]>
| | Date: Mon Aug 29 17:43:29 2016 -0400
| |
| | Fix `@since` in new files docblocks
| |
Como puede ver, solo confirma 8314c2ff833280bbc7102cb6d4fcf62240cd3ac4
y c3f45e811e4b49fe27624b57c3eb8f4721a4323b
tiene *
el primer carácter en las líneas de confirmación. Esas confirmaciones son de la rama maestra, mientras que las otras cuatro son de otras ramas.
Estoy usando los siguientes comandos:
git shortlog --no-merges --graph --abbrev-commit master..<mybranch>
o
git log --no-merges --oneline --decorate master..<mybranch>
Respuesta rápida:
git log $(git merge-base master b2)..HEAD
Digamos:
Que tengas una rama maestra
Haz algunas confirmaciones
Creaste una rama llamada b2
Hacer
git log -n1
; el ID de confirmación es la base de fusión entre b2 y masterHaz algunas confirmaciones en b2
git log
mostrará su historial de registro de b2 y masterUtilice el rango de confirmación, si no está familiarizado con el concepto, lo invito a buscarlo en Google o apilarlo en overflow-it.
Para su contexto real, puede hacer, por ejemplo
git log commitID_FOO..comitID_BAR
El ".." es el operador de rango para el comando de registro.
Eso significa, de forma sencilla, darme todos los registros más recientes que commitID_FOO...
Mira el punto 4, la base de fusión.
Entonces:
git log COMMITID_mergeBASE..HEAD
te mostraré la diferencia.Git puede recuperar la base de fusión de esta manera
git merge-base b2 master
Finalmente puedes hacer:
git log $(git merge-base master b2)..HEAD