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

git merge-base B E consente di trovare dove un comune antenato A dei due commit. C'è un modo per trovare il commit F in cui i due rami vengono uniti di nuovo?Trova il primo figlio comune di due commit

+0

questo è un grafico fantastico, come l'hai fatto? –

+1

Cosa succede se c'è più di un "primo" bambino comune? Ad esempio, potrebbe esserci un commit che è un'unione di B ed E. – svick

+1

È possibile modificare l'output di 'git rev-list --children' qualcosa che ha fatto questo tipo: http://stackoverflow.com/questions/1761825/riferimento-il-figlio-di-un-commit-in-git. – ellotheth

risposta

0

Oops. Non l'ho letto abbastanza attentamente.

L'unica informazione in un commit è l'id del genitore (o dei genitori). Non è possibile ottenere un figlio da un commit padre (questa è la parte diretta del repository che è un DAG).

Guardando ancora questo - sembra che l'opzione --ancestry-path per git log possa farlo. Per esempio dato:

* 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 

possiamo ottenere i tutti i figli di questi due commit utilizzando

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

se poi invertire questa e far fuori il primo - che è F.

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

nel mio caso che restituisce 3146e5d.

0

Adattare all.awk da this answer per portare anche il numero di riga per ogni riferimento, quindi quando si è verificato che entrambi i genitori guardano i riferimenti che hanno in comune.