2013-08-18 24 views
6

C'è qualche convenzione per l'ordine dei genitori di un commit?Git Commit Genes 'Order

Perché uno dei genitori di impegnarsi dovrebbe essere quello di essere a precedente commettere sul ramo corrente che viene fusa per incorporazione in e il resto sono impegna precedenti degli altri rami fusione.

Vorrei identificare il commit precedente del ramo corrente, sto usando pygit che restituisce un elenco di genitori per un impegno e intuitivo Ho pensato che forse l'ordine dei genitori ha un significato, ma non ho trovato alcuna esplicita menzione di questo.


Ho scritto questa funzione di utilità, utilizzando primo genitore impegnano a percorrere ramo:

def walk_branch(pygit_repository, branch_oid): 
    """ 
    Walk a single branch 
    """ 
    from pygit2 import GIT_SORT_TOPOLOGICAL 
    previous_first_parent_oid = None 
    for commit in pygit_repository.walk(branch_oid, GIT_SORT_TOPOLOGICAL): 
     if previous_first_parent_oid is None or commit.oid == previous_first_parent_oid: 
      previous_first_parent_oid = commit.parents[0].oid if len(commit.parents) else None 
      yield commit 
+3

Non so su libgit2 e pygit2 ma il "primo" genitore è sempre quello del ramo in cui si trovava quando hai fatto un 'git merge'. Questo è l'estratto di '- first-parent', ed è il primo nell'output grezzo di' git cat-file -p somerev'. I genitori rimanenti sono i rami che sono stati "fusi". – torek

+0

Grazie, non sapevo del termine "primo genitore". –

risposta

7

libgit2 e i suoi binding restituiscono i genitori nell'ordine in cui sono memorizzati nel commit, che è l'ordine dei commit così come sono stati forniti ad es. la riga di comando per git merge ed è una costante che il primo genitore è il commit corrente quando ne crea uno nuovo (tramite unione o normale git commit).

Per identificare l'impegno di commit precedente (in tempo), tutto ciò che devi fare è guardare il primo genitore. Se si trovano nello stesso ramo o no non è qualcosa che puoi vedere da questo, poiché un genitore di commit potrebbe trovarsi in un ramo diverso (che è ciò che causa le diramazioni), ma puoi tracciare una linea diretta (come quelli di git log --graph --oneline) .

+0

Grazie, per i chiarimenti. –

7

Sì, se si uniscono A in B, il primo genitore è B e la seconda è A.

Pertanto è possibile eseguire operazioni come gitk --first-parent per mostrare la cronologia del solo ramo corrente senza i dettagli dei rami incorporati.

0

Qualsiasi genitore dopo il primo genitore rappresenta un'unione da un altro ramo con almeno un'eccezione.

Se si fonde un ramo in se stesso, che di solito accade quando viene lavorato in due punti separatamente, successivamente integrato, uno di quei "rami" in un ramo, apparirà come se provenisse dal nulla.

Questo verrà visualizzato se si attraversano tutti i genitori di tutti i rami foglia, ma tali rami all'interno dei rami non si visualizzano se si attraversa la storia lineare di tutti i rami foglia. Questo è almeno ancora corretto nel senso che attraverserai solo la cronologia lineare dei commit in cui sono stati incorporati. Quello che sarà nascosto è il fatto che c'è un ramo all'interno di un ramo, quindi non mostrerà tutta la cronologia esclusiva di quel ramo.

Non so se l'eliminazione dei rami abbia lo stesso effetto.