Estoy buscando en el historial de confirmaciones usando gitk y git log y estoy tratando de ver cómo llegó una confirmación específica en una rama determinada. Puedo ver las confirmaciones en el historial, así que sé que están ahí.

Lo que quiero entender es cómo se fusionaron (se suponía que debían permanecer en su propia rama). Este es un proyecto muy grande y hay cientos de confirmaciones entre la confirmación en cuestión y el estado actual de la rama, por lo que no puedo descifrar claramente a través del DAG limitado en gitk, y la confirmación se enmascara en otras ramas y fusiona y confirma mensajes.

Para hacer esto, he estado intentando:

gitk {sha1hashIDstring}..branch_name
gitk {sha1hashIDstring}..branch_name --ancestry-path
git log {sha1hashIDstring}..branch_name --reverse
git log {sha1hashIDstring}..branch_name --merges --reverse
git log {sha1hashIDstring}..branch_name --ancestry-path --reverse
git log {sha1hashIDstring}..branch_name --ancestry-path --merges --reverse

Y no entiendo los resultados. SOLO quiero ver elementos que incluyan el compromiso específico en cuestión, de modo que pueda ver claramente cómo llegó a la rama en cuestión. ¿Cómo lo hago?

Ejemplo

Lo que estoy buscando, en gitk preferiblemente, pero git log sería suficiente:

Message       Author         Date         #commit that merged branch z into current branch
Message       Author         Date         #commit that merged branch y into branch z
Message       Author         Date         #commit that merged branch x into branch y
Message       Author         Date         #commit that merged {sha1hashIDstring} commit/branch a into branch x
Message       Orig_Author    Date         #{sha1hashIDstring} original commit, on branch a

Más información

Todavía no veo ninguna respuesta, así que comenzaré una recompensa si no aparece ninguna, pero tal vez no esté explicando la pregunta correctamente (estoy abierto a sugerencias para mejorar y aclarar).

El controlador de esto es que puedo ver la confirmación en sí, y me dicen que no debería estar en una rama determinada. Esto es lo que estoy viendo:

Message       Orig_Author    Date         #{sha1hashIDstring} commit
Message       Orig_Author    Date         #Merged into branch test_dec14 (includes original commit)
...
Message       Author         Date         # unrelated commits
Message       Author         Date         # more unrelated commits
# Stuff happened here ??? everything I do gives me hundreds of things here 
# Not all of them related to the {sha1hashIDstring} commit
# No idea how to see only the ones that are
...
Message       Author         Date         # final commit on test_jan15 branch

Me han dicho que las confirmaciones en test_dec14 no deberían haber llegado a test_jan15 a menos que fueran publicadas, y como tal, la confirmación {sha1hashIDstring} NO DEBE ESTAR en test_jan15, pero lo está. Quiero saber por qué, cómo llegó allí y quién lo puso allí.

4
Ehryk 28 ene. 2015 a las 00:22

5 respuestas

La mejor respuesta

Para la última parte de su pregunta, "¿cómo llegó a la rama actual?", Eche un vistazo a git-when-merged.

Es una secuencia de comandos de Python que, según su archivo léame:

Encuentre cuándo se fusionó una confirmación en una o más ramas. Busque la confirmación de fusión que llevó COMMIT a las SUCURSALES especificadas. Específicamente, busque la confirmación más antigua en el historial del primer padre de BRANCH que contenga COMMIT como antepasado.

Esto suena como lo que está buscando en el caso de determinar cuándo se fusionó la confirmación {sha1hashIDstring} en la rama test_jan15.

2
Jason Jones 3 feb. 2015 a las 17:56

Sé que esto no está etiquetado con "github", pero si el proyecto está allí, el estilo visual de Blame o History (botones en el encabezado del archivo cuando se ve un archivo específico) puede hacer que sea mucho más fácil rastrear cuándo sucedieron las cosas.

No estoy seguro de si eso realmente resuelve este problema (muy) específico, pero podría ayudar a otros con problemas similares que encuentren esta pregunta ...

0
Rycochet 4 feb. 2015 a las 11:16

Busqué algo en Google y conseguí algo para ti. el crédito va a #vonC

git when-merged [OPCIONES] COMPROMETER [SUCURSAL ...]

Encuentre cuándo se fusionó una confirmación en una o más ramas. Busque la confirmación de fusión que llevó COMMIT a las SUCURSALES especificadas.

Específicamente, busque la confirmación más antigua en el historial del primer padre de BRANCH que contenga COMMIT como antepasado.

git-what-branch

Descubra en qué rama se encuentra una confirmación o cómo llegó a una rama con nombre Este es un script en Perl de Seth Robertson que parece muy interesante:

SYNOPSIS

git-what-branch [--allref] [--all] [--topo-order | --date-order ]
[--quiet] [--reference-branch=branchname] [--reference=reference]
<commit-hash/tag>...
OVERVIEW

Nos dice (por defecto) la ruta causal más temprana de confirmaciones y fusiones para hacer que la confirmación solicitada llegue a una rama con nombre. Si se realizó una confirmación directamente en una rama con nombre, obviamente esa es la ruta más antigua.

Por ruta causal más temprana, nos referimos a la ruta que se fusionó en una rama nombrada antes, por tiempo de confirmación (a menos que se especifique --topo-order).

RENDIMIENTO

Si muchas ramas (por ejemplo, cientos) contienen la confirmación, el sistema puede llevar mucho tiempo (para una confirmación en particular en el árbol de Linux, tomó 8 segundos explorar una rama, pero había más de 200 ramas candidatas) para rastrear la ruta. a cada compromiso. La selección de una etiqueta de referencia --reference-branch - en particular para examinar será cientos de veces más rápida (si tiene cientos de ramas candidatas).

**EXAMPLES**
 # git-what-branch --all 1f9c381fa3e0b9b9042e310c69df87eaf9b46ea4
 1f9c381fa3e0b9b9042e310c69df87eaf9b46ea4 first merged onto master using the following minimal temporal path:
   v2.6.12-rc3-450-g1f9c381 merged up at v2.6.12-rc3-590-gbfd4bda (Thu May  5 08:59:37 2005)
   v2.6.12-rc3-590-gbfd4bda merged up at v2.6.12-rc3-461-g84e48b6 (Tue May  3 18:27:24 2005)
   v2.6.12-rc3-461-g84e48b6 is on master
   v2.6.12-rc3-461-g84e48b6 is on v2.6.12-n
   [...]
1
love 3 feb. 2015 a las 18:23

¿Has probado la opción "--decorate" para git log?

Tengo este alias en mi .gitconfig:

[alias]

        k = log --graph --oneline --abbrev-commit  --decorate

Muestra un gráfico similar al que muestra gitk, con los nombres de las ramas "decorados" además de la confirmación más reciente de la rama.


O

--

Prueba tig también. Es más informativo que gitk (según mi uso;)). Consulte http: // gitready. .com / advanced / 2009/07/31 / tig-the-ncurses-front-end-to-git.html una vez. Creo que cualquiera de las soluciones le dará los resultados requeridos.

1
love 3 feb. 2015 a las 18:09

Este es un caso clásico de git bisect. bisect te ayuda a rastrear errores. En su caso, simplemente está buscando un commitId (que está fuera de lugar en la rama incorrecta).

Bisect es una herramienta muy simple pero poderosa.

http://git-scm.com/docs/git-bisect http://hashrocket.com/blog/posts/finding-failure-git-bisect

Espero que te ayude.

1
CodeWizard 2 feb. 2015 a las 01:37