2011-12-11 23 views
5

Si usa gitk --all, puede ver todas las confirmaciones de su repositorio, de todas las sucursales. Quiero algo así, excepto solo los descendientes de un compromiso determinado.¿Cómo puedo obtener/enumerar/ver todos los descendientes de una confirmación con git (o gitk)?

+1

Aunque la primera oración de manojlds es correcta, no es toda la verdad: sería posible bloquear algo que comprueba si cada ref tiene el compromiso determinado en su ascendencia, y luego mostrar el historial a partir de esos refs. – Cascabel

+1

posible duplicado de [Obteniendo una lista de todos los hijos de una determinada comisión] (http://stackoverflow.com/questions/2613935/getting-a-list-of-all-children-of-a-given-commit) – jthill

Respuesta

2

Un compromiso solo conoce a su padre (y, por lo tanto, hasta el final) pero no tiene ni idea de sus hijos/descendientes. Debes usar una notación como A..B para encontrarla.

Por ejemplo, si usted quiere encontrar comete en rama actual ya que el commit dado A, puede hacer algo como esto:

git rev-list A.. 
+1

'gitk --all' debe funcionar de alguna manera. Parece posible, al menos, codificarlo en primer 'gitk --all' y luego omitir cada commit que no tenga un commit dado como su padre. – Pistos

7

Creo que esto podría hacer lo que quiera. Todos los envíos en todas las ramas, que tienen A como ancestro:

gitk --all --ancestry-path A.. 
1

En resumen:

git log --all BRANCH~1.. 

En detalle, con ejemplos: Este es el árbol completo de un repositorio que acabo de crear:

$ git log --graph --oneline --decorate --all 
* e3972be (HEAD, a) a-6 
* 2707d79 a-5 
* cdea9a7 a-4 
| * 65b716e (c) c-5 
| * ebe2a0e c-4 
|/ 
| * 2ed9abe (b) b-4 
|/ 
* ace558e (master) 3 
* 20db61f 2 
* 3923af1 1 

Aparte de --all, otra cosa es obvia: master ->HEAD:

$ git log --graph --oneline --decorate master.. 
* e3972be (HEAD, a) a-6 
* 2707d79 a-5 
* cdea9a7 a-4 

así que he intentado combinar ellos, y casi me consiguió lo que quería:

$ git log --graph --oneline --decorate --all master.. 
* e3972be (HEAD, a) a-6 
* 2707d79 a-5 
* cdea9a7 a-4 
* 65b716e (c) c-5 
* ebe2a0e c-4 
* 2ed9abe (b) b-4 

Pero, por desgracia, esto no muestra la relación entre las ramas, ya que la rama que estamos pidiendo sobre fue omitido. Así que tenemos que utilizar registro de los padres de master así:

$ git log --graph --oneline --decorate --all master~1.. 
* e3972be (HEAD, a) a-6 
* 2707d79 a-5 
* cdea9a7 a-4 
| * 65b716e (c) c-5 
| * ebe2a0e c-4 
|/ 
| * 2ed9abe (b) b-4 
|/ 
* ace558e (master) 3 

Ta-da! (No sé si esto simplemente no funcionó en el pasado, pero por las dudas: estoy en la versión de Git 1.7.1)

EDITAR 2017-11-17 - Gracias a STW por la realidad mostrando el problema con esto: los árboles independientes lo estropearían. Los compromisos que son totalmente independientes de master se incluirán en esta salida. A partir de una copia de la cesión temporal anteriormente, esto es lo que mi último comando sería de salida:

$ git checkout --orphan z 
Switched to a new branch 'z' 
$ git commit --allow-empty -m'z-1' 
[z (root-commit) bc0c0bb] z-1 
$ git commit --allow-empty -m'z-2' 
[z 1183713] z-2 

$ git log --graph --oneline --decorate --all master~1.. 
* 1183713 (HEAD -> z) z-2 
* bc0c0bb z-1 
* 6069f73 (a) a-6 
* 654d106 a-5 
* a218c59 a-4 
| * 338432a (c) c-5 
| * 2115318 c-4 
|/ 
| * 43a34dc (b) b-4 
|/ 
* ce05471 (master) 3 

El z rama, siendo creado como un huérfano, no tiene historia común con master, por lo z-1 y z-2 deberían haber sido excluidas pero no lo fueron Esto es para lo que es --ancestry-path, ahora lo entiendo.Incluyendo excluirá rama z:

$ git log --graph --oneline --decorate --all --ancestry-path master~1.. 
* 6069f73 (a) a-6 
* 654d106 a-5 
* a218c59 a-4 
| * 338432a (c) c-5 
| * 2115318 c-4 
|/ 
| * 43a34dc (b) b-4 
|/ 
* ce05471 (master) 3 

Para completar, incluso teniendo en cuenta que ya había --ancestry-path, la respuesta superior actual no muestra la relación sucursal correctamente porque excluye el commit en master sí:

$ git log --graph --oneline --decorate --all --ancestry-path master.. 
* 6069f73 (a) a-6 
* 654d106 a-5 
* a218c59 a-4 
* 338432a (c) c-5 
* 2115318 c-4 
* 43a34dc (b) b-4 
+0

He intentado juguetear con variaciones de esto, pero no parece mostrar lo que quiero [con gitk]. Por ejemplo, supongamos que ha creado una sucursal secundaria intermediaria y desde allí ha creado tres sucursales de nietos. ¿Cuál sería la forma de mostrar el gitk solo para esa familia de ramas, y nada de maestro, ni nada más? – Pistos

+0

@Pistos Así que usando lo anterior, obtengo el mismo resultado en 'gitk' que' log' cuando uso 'gitk --all master..' (en oposición a' git log --all master ~ 1.'' - Entonces, para usar una rama que no sea maestra, pruebe 'gitk --all branchname..' (incluya los dos puntos) – Izkata

+0

@Pistos También ahora noto que mi comentario ha terminado casi igual que la respuesta de jsvnm, excepto que no lo hago. t entiendo '--ancestry-path' y por qué sería necesario – Izkata

Cuestiones relacionadas