2012-06-06 10 views
7
  : 
      A 
T  /\ 
i  B C 
m  : : 
e  D E 
      \/
|   F 
V   : 

git merge-base B E permite encontrar donde un antepasado común A de las dos confirmaciones. ¿Hay alguna forma de encontrar el compromiso F donde las dos ramas se fusionan de nuevo?primer hijo común de dos confirmaciones

+0

eso es un gráfico impresionante, ¿cómo lo hiciste? –

+1

¿Qué pasa si hay más de un "primer" hijo común? Por ejemplo, podría haber un compromiso que es una combinación de B y E. – svick

+1

Podría piratear la salida 'git rev-list --children' algo así como este tipo: http://stackoverflow.com/questions/1761825/referenciando-el-niño-de-un-compromiso-en-git. – ellotheth

Respuesta

0

Vaya. No lo leí con cuidado.

La única información en una confirmación es la identificación de su padre (o sus padres). No se puede obtener un hijo de una confirmación principal (esta es la parte dirigida del repositorio que es un DAG).

Mirando esto más - parece que la opción --ancestry-path para git log puede hacer esto. Por ejemplo dado:

* 85d26ab When compiling vim, also compile & install gvim 
* 3146e5d Merge remote-tracking branch 'origin/devel' into deve 
|\ 
| * 28d08e5 rebasing-merge: specify all commits explicitly 
* | 006d11d Help 'file' find its magic file 
|/ 
* e68531d (tag: Git-1.7.6-preview20110720) Update submodules 

podemos obtener los todos los niños de estas dos confirmaciones utilizando

git log --oneline --ancestry-path B..E 

si luego revertir esto y escoger de la primera - es decir F.

git rev-list --reverse --ancestry-path 28d08e5..006d11d | head -1 

en mi caso que devuelve 3146e5d.

0

Adapte all.awk de this answer para llevar también el número de línea para cada referencia, luego, cuando se haya encontrado con ambos padres, observe las referencias que tienen en común.

Cuestiones relacionadas