¿Cómo obtener el historial de confirmación de una sola rama?

128

Digamos que he creado una nueva rama my_experimentde mastere hice varias entregas a my_experiment. Si hago un " git logon" my_experiment, veo las confirmaciones realizadas en esta rama, pero también las confirmaciones realizadas masterantes de que my_experimentsse creara la rama.

Me resultaría muy útil ver el historial de todas las confirmaciones a la my_experimentsrama hasta que llegue a la creación de esa rama, efectivamente una verdadera historia de solo esa rama. De lo contrario, no me queda claro cuando reviso el registro si los commits estaban en la my_experimentsrama o no.

¿Hay alguna manera de hacer esto con Git?

Marplesoft
fuente

Respuestas:

139

Puedes usar un rango para hacer eso.

git log master..

Si has revisado tu my_experimentsucursal. Esto comparará dónde masterestá en HEAD(la punta de my_experiment).

alex
fuente
3
Ok habló muy pronto. Eso lo hice por mi simple ejemplo. Pero ahora estoy mirando el repositorio real de otra persona y se me ocurre que para usar este comando correctamente, necesito saber de qué rama se creó mi rama actual. Tal vez debería poder decir esto de Gitk, pero no es obvio para mí. ¿Alguna idea?
Marplesoft
@Marplesoft Puede ser complicado darse cuenta de eso. Ver esta pregunta .
alex
¿Podría explicar brevemente cómo funciona? ¿Qué le git log master..dice a Git?
tonix
2
@tonix Siga el enlace en la respuesta para obtener más información sobre cómo funciona un rango (la master..) parte.
alex
7

El git merge-basecomando se puede usar para encontrar un antepasado común. Entonces, si my_experiment aún no se ha fusionado en master y my_experiment se creó desde master, podría:

git log --oneline `git merge-base my_experiment master`..my_experiment
cforbish
fuente
Si desea incluir al padre de su primer commit, agregue ^ y - first-parent : git log --oneline `git merge-base my_experiment master`^..my_experiment --first-parent
Eric Lavoie
7

Nota: si limita ese registro al último n commit (los últimos 3 commits, por ejemplo, git log -3), asegúrese de poner un espacio entre 'n' y su rama:

git log -3 master..

Antes de Git 2.1 (agosto de 2014), este error: en git log -3master..realidad le mostraría los últimos 3 commits de la rama actual (aquí my_experiment), ignorando el masterlímite (lo que significa que si my_experimentcontiene solo un commit, 3 todavía se enumerarían, 2 de ellos master)

Ver commit e3fa568 por Junio ​​C Hamano ( gitster) :

revisión: analizar " git log -<count>" con más cuidado

Esta línea de comando mal escrita simplemente ignora " master" y termina mostrando dos confirmaciones de la actual HEAD:

$ git log -2master

porque alimentamos " 2master" atoi()sin asegurarnos de que toda la cadena se analice como un entero.

Utilice la strtol_i()función auxiliar en su lugar.

VonC
fuente
1

Solo puedes usar git log --oneline

Manoj Rana
fuente
Si bien este código puede responder la pregunta, proporcionar un contexto adicional sobre cómo y / o por qué resuelve el problema mejoraría el valor a largo plazo de la respuesta.
DebanjanB
1

Creo que una opción para tus propósitos es git log --online --decorate. Esto le permite conocer la confirmación marcada y las principales confirmaciones para cada rama que tiene en su historia. Al hacer esto, tiene una buena vista de la estructura de su repositorio y los compromisos asociados a una rama específica. Creo que leer esto podría ayudar.

Daniel Casas
fuente
0

Sé que es muy tarde para este ... Pero aquí hay un (no tan simple) en línea para obtener lo que estaba buscando:

git show-branch --all 2>/dev/null | grep -E "\[$(git branch | grep -E '^\*' | awk '{ printf $2 }')" | tail -n+2 | sed -E "s/^[^\[]*?\[/[/"
  • Enumeramos las confirmaciones con el nombre de la sucursal y las posiciones relativas a los estados de sucursal reales con git show-branch(enviando las advertencias a/dev/null ).
  • Entonces solo mantenemos aquellos con nuestro nombre de sucursal dentro del soporte con grep -E "\[$BRANCH_NAME" .
  • Donde real $BRANCH_NAMEse obtiene con git branch | grep -E '^\*' | awk '{ printf $2 }'(la rama con una estrella, repetida sin esa estrella).
  • De nuestros resultados, eliminamos la línea redundante al principio con tail -n+2.
  • Y luego, limpiamos finalmente la salida eliminando todo lo que precede [$BRANCH_NAME]a sed -E "s/^[^\[]*?\[/[/".
menssana
fuente