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

git merge-base B E erlaubt zu finden, wo eine der gemeinsame Vorfahr A der beiden Commits. Gibt es eine Möglichkeit, das Commit F zu finden, wo die beiden Zweige wieder zusammengeführt werden?Findet das erste gemeinsame Kind von zwei Commits

+0

das ist eine tolle Grafik, wie hast du das gemacht? –

+1

Was ist, wenn es mehr als ein "erstes" gemeinsames Kind gibt? Zum Beispiel könnte es ein Commit geben, das eine Verschmelzung von B und E ist. – svick

+1

Sie könnten die 'git rev-list --children'-Ausgabe hacken, so etwas wie dieser Typ: http://stackoverflow.com/questions/1761825/referending-the-kind-von-einem-commit-in-git. – ellotheth

Antwort

0

Hoppla. Habe das nicht sorgfältig genug gelesen.

Die einzige Information in einem Commit ist die ID seiner Eltern (oder Eltern). Sie können nicht von einem Eltern-Commit zu einem Kind gelangen (dies ist der gerichtete Teil des Repositorys, der eine DAG ist).

Sieht man sich das genauer an, so sieht die Option --ancestry-path für git log aus. Zum Beispiel gegeben:

* 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 

können wir die alle Kinder dieser beiden Commits bekommen

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

verwenden, wenn Sie diese dann umgekehrt und die erste Pick-off - das ist F.

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

in meinem Fall, der 3146e5d zurückgibt.

0

Adapt all.awk von this answer, um auch die Zeilennummer für jeden Ref zu tragen, dann, wenn Sie beide Eltern kennengelernt haben, schauen Sie sich die Refs an, die sie gemeinsam haben.