Quiero enumerar todas las confirmaciones que son solo parte de una rama específica.
Con lo siguiente, enumera todos los commits de la rama, pero también del padre (maestro)
git log mybranch
La otra opción que encontré fue excluir los commits accesibles por master y me da lo que quiero, PERO me gustaría evitar la necesidad de conocer los nombres de otras ramas.
git log mybranch --not master
Estaba tratando de usar git for-each-ref
, pero también está enumerando mybranch, por lo que en realidad está excluyendo 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 una caducidad para los reflogs (por defecto 90 días, 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")
Solo estoy eliminando la rama actual de la lista de ramas disponibles y estoy usando esa lista para excluirla del registro. De esta manera solo obtengo los commits que solo mybranch alcanza .
Respuestas:
Por lo que parece que deberías estar usando
cherry
:Esto mostraría todos los commits que están contenidos dentro de mybranch , pero NO en desarrollo . Si deja la última opción ( mybranch ), comparará la rama actual en su lugar.
Como señaló VonC, SIEMPRE está comparando su rama con otra rama, así que conozca sus ramas y luego elija con cuál comparar.
fuente
git cherry -v master
para comparar su rama actual con la rama maestra.fatal: Unknown commit mybranch
.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 lo suficiente ":
Necesita un punto de referencia para que su registro muestre los commits correctos.
Como se menciona en " GIT - ¿De dónde me ramifiqué? ":
Entonces, incluso si
git log master..mybranch
es una respuesta, aún mostraría demasiados commits, simybranch
se basa enmyotherbranch
sí mismomaster
.Para encontrar esa referencia (el origen de su rama), solo puede analizar las confirmaciones y ver en qué rama están, como se ve en:
fuente
Finalmente encontré la manera de hacer lo que quería el OP. Es tan simple como:
El comando mostrará todas las confirmaciones a las que se puede acceder desde la rama proporcionada en el formato de gráfico. Pero puede 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, echemos un vistazo al extracto de
git log --graph master
repositorio de GitHub de cakephp a continuación:Como se puede ver, sólo compromete
8314c2ff833280bbc7102cb6d4fcf62240cd3ac4
yc3f45e811e4b49fe27624b57c3eb8f4721a4323b
tener el*
ser el primer carácter de la confirmación líneas. Esas confirmaciones son de la rama maestra, mientras que las otras cuatro son de otras ramas.fuente
El siguiente comando de shell debe hacer lo que quieras:
Advertencias
Si ha
mybranch
desprotegido, el comando anterior no funcionará. Esto se debe a quemybranch
también se puedeHEAD
acceder a los commits, por lo que Git no considera que los commits sean únicosmybranch
. Para que funcione cuandomybranch
está desprotegido, también debe agregar una exclusión paraHEAD
:Sin embargo, debe no excluir
HEAD
a menos que lamybranch
está desprotegido, de lo contrario se corre el riesgo mostrando compromete a que no son exclusivos demybranch
.Del mismo modo, si tiene una rama remota llamada
origin/mybranch
que corresponde a lamybranch
rama local , deberá excluirla:Y si la rama remota es la rama predeterminada para el repositorio remoto (generalmente solo es cierto para
origin/master
), también deberá excluirorigin/HEAD
:Si tiene la rama desprotegida, y hay una rama remota, y la rama remota es la predeterminada para el repositorio remoto, entonces termina excluyendo mucho:
Explicación
El
git rev-list
comando es un comando de bajo nivel (plomería) que recorre las revisiones dadas y vuelca los identificadores SHA1 encontrados. Piense en ello como equivalente agit log
excepto que solo muestra el SHA1: sin mensaje de registro, sin nombre de autor, sin marca de tiempo, ninguna de esas cosas "elegantes".La
--no-walk
opción, como su nombre lo indica, evitagit rev-list
caminar por la cadena de ascendencia. Entonces, si escribegit rev-list --no-walk mybranch
, solo imprimirá un identificador SHA1: el identificador de la confirmación de propinas de lamybranch
rama.Los
--exclude=refs/heads/mybranch --all
argumentos le dicengit rev-list
que comience desde cada referencia, excepto pararefs/heads/mybranch
.Entonces, cuando ejecutas
git rev-list --no-walk --exclude=refs/heads/mybranch --all
, Git imprime el identificador SHA1 de la confirmación de propinas de cada referencia a excepción derefs/heads/mybranch
. Estas confirmaciones y sus antepasados son las confirmaciones en las que no está interesado; estas son las confirmaciones que no desea ver.Las otras confirmaciones son las que desea ver, por lo que recopilamos el resultado
git rev-list --no-walk --exclude=refs/heads/mybranch --all
y le decimos a Git que muestre todo menos esas confirmaciones y sus antepasados.El
--no-walk
argumento es necesario para repositorios grandes (y es una optimización para repositorios pequeños): sin él, Git tendría que imprimir, y el shell tendría que recopilar (y almacenar en la memoria) muchos más identificadores de confirmación de los necesarios. Con un repositorio grande, el número de confirmaciones recopiladas podría superar fácilmente el límite de argumento de la línea de comandos del shell.Git bug?
Hubiera esperado que funcionara lo siguiente:
Pero no lo hace. Supongo que esto es un error en Git, pero tal vez sea intencional.
fuente
hg log -b <branch>
. No entiendo por qué la gente dice que Git es hostil. / sgit log --all --not --exclude=refs/heads/mybranch --all
no funciona, perogit log refs/heads/mybranch --not --exclude=refs/heads/mybranch --all
funciona, con las mismas advertencias sobre excluir HEAD y origen.Respuesta rápida:
Digamos:
Que tienes una rama maestra
Haz algunas confirmaciones
Creaste una rama llamada b2
Hacer
git log -n1
; el commit id es la base de fusión entre b2 y masterHaz algunas confirmaciones en b2
git log
mostrará su historial de registro de b2 y masterUse el rango de confirmación, si no está familiarizado con el concepto, lo invito a buscarlo en Google o apilarlo,
Para su contexto real, puede hacer por ejemplo
El ".." es el operador de rango para el comando de registro.
Eso significa, en una forma simple, 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 diferenciaGit puede recuperar la base de fusión para ti así
Finalmente puedes hacer:
fuente
Podrías probar algo como esto:
O, tomando prestado de la receta en el Manual del usuario de Git :
fuente
git show-ref --tags
también.enumerará los consejos de cada rama que no lo es
master
.enumerará todas las confirmaciones en
master
el historial que no están en el historial de ninguna otra rama.La secuencia es importante para las opciones que configuran la tubería de filtro para la selección de confirmación, por lo que
--branches
debe seguir los patrones de exclusión que se supone que debe aplicar, y--no-walk
debe seguir los filtros que suministran las confirmaciones que se supone que la lista de revoluciones no debe seguir.fuente
Esto generará los commits en la rama actual. Si se pasa algún argumento, solo genera los hashes.
git_show_all_commits_only_on_this_branch
fuente
Estoy usando los siguientes comandos:
o
fuente
Encontré este enfoque relativamente fácil.
Pago a la sucursal y que
correr
Esto proporcionará solo dos SHA:
1) última confirmación de la rama [C1]
2) y comprometer padre a la primera confirmación de la rama [C2]
Ahora corre
Aquí C1 y C2 son dos cadenas que obtendrá cuando ejecute el primer comando. Ponga estos valores sin <> en el segundo comando.
Esto le dará una lista del historial de cambios de archivos dentro de la rama.
fuente
En mi situación, estamos usando Git Flow y GitHub. Todo lo que necesita hacer es: comparar su rama de características con su rama de desarrollo en GitHub.
Mostrará las confirmaciones realizadas solo en su rama de características.
Por ejemplo:
https://github.com/your_repo/compare/develop...feature_branch_name
fuente
git
y en su lugar usar GitHub para hacer una solicitud de extracción o comparar las ramas.