2013-08-18 13 views
6

Czy istnieje konwencja dotycząca kolejności rodziców popełnienia przestępstwa?Git Commit Parents 'Order

Ponieważ jedno z rodziców popełniają powinno być być poprzednie popełnić na bieżącym oddział które jest połączone w, a reszta to poprzednia commity pozostałych gałęziach łączących.

Chciałbym zidentyfikować poprzedniego popełnić obecnego oddziału używam pygit która zwraca listę rodziców dla commit i intuicyjnie Myślałem, że może kolejność rodziców ma znaczenie, ale nie znalazłem jawne wspomnieć o tym.


Napisałem tę funkcję użytkową, stosując pierwszego rodzica commit przemierzać Branża:

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

Nie wiem o libgit2 i pygit2, ale "pierwszym" rodzicem jest zawsze ten z gałęzi, w której byłeś, kiedy robiłeś 'git merge'. Jest to pierwszy wyciąg z "- pierwszego-rodzica", i jest pierwszym w surowym wyjściu z 'git cat-file -p somerev'. Pozostali rodzice to oddziały, z których "połączono". – torek

+0

Dzięki, nie wiedziałem o terminie "pierwszego rodzica". –

Odpowiedz

7

libgit2 i jego powiązania zwracają rodziców w kolejności, w jakiej są przechowywane w zatwierdzeniu, co jest kolejnością zatwierdzeń, ponieważ zostały podane na przykład, wiersz polecenia dla git merge i jest to stała, której pierwszym rodzicem jest bieżące zatwierdzenie podczas tworzenia nowego (przez scalenie lub normalne git commit).

Aby zidentyfikować commit commit commit (w czasie), wystarczy spojrzeć na pierwszego rodzica. To, czy są w tej samej gałęzi, czy nie, nie jest czymś, co można z tego zobaczyć, ponieważ rodzic dokonujący zatwierdzenia może znajdować się w innej gałęzi (co powoduje rozgałęzienia), ale możesz narysować bezpośrednią linię (taką jak te git log --graph --oneline). .

+0

Dzięki za wyjaśnienie. –

7

Tak, jeśli połączyć A do B, pierwszy rodzic jest B, a drugi jest A.

W związku z tym można wykonywać operacje takie jak gitk --first-parent, aby wyświetlić historię tylko bieżącego oddziału bez szczegółowych informacji o połączonych oddziałach.

0

Dowolny element nadrzędny po pierwszym obiekcie nadrzędnym reprezentuje scalenie z innej gałęzi z co najmniej jednym wyjątkiem.

Jeśli scalisz gałąź w siebie, co zwykle dzieje się, gdy jest ona przetwarzana w dwóch miejscach oddzielnie, a następnie później zintegrowana, jedna z tych "gałęzi" w gałęzi, pojawi się tak, jakby pochodziła znikąd.

Pojawi się, jeśli przemierzysz wszystkich rodziców wszystkich gałęzi liścia, ale takie gałęzie w gałęziach nie pojawią się, jeśli przejdziesz liniową historię wszystkich gałęzi liścia. Jest to przynajmniej nadal poprawne w tym sensie, że przechodzisz tylko liniową historię zatwierdzeń, które zostały scalone. To, co będzie ukryte, to fakt, że istnieje gałąź wewnątrz oddziału, więc nie będzie ona pokazywać całej historii wyłącznie dla tej gałęzi.

Nie wiem, czy usuwanie gałęzi ma taki sam efekt.