2013-08-18 49 views
6

對於提交的父母的順序是否存在一些約定?Git Commit父母的命令

因爲犯的父母中的一方應該是是一次提交關於當前分支正被合併到其餘的都是以前的其他合併分支的提交。

我想識別先前提交的當前分支的,我使用pygit它返回一個承諾,直觀地我想,也許父母的命令具有重要意義,但我沒有發現任何明確的家長名單提到這一點。


我寫了這個實用功能,使用第一父承諾遍歷分支:

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

我不知道libgit2和pygit2但「第一」父母總是由你,當你做了'git的merge'的分支之一。這是'--first-parent'提取的一個,它是'git cat-file -p somerev'的原始輸出中的第一個。其餘的父母是「合併」的分支機構。 – torek

+0

謝謝,我不知道「第一父母」這個詞。 –

回答

7

libgit2和綁定在它們存儲在提交訂單,這是提交的訂單,因爲他們在給定的例如回父母git merge的命令行,並且在創建新文件時(通過合併或正常git commit),第一個父文件是當前提交的常量。

爲了查明提交一次提交(時間),那麼所有你需要做的是看看第一個父。無論他們是否在同一個分支中,都不是你能從中看到的東西,因爲提交的父母可能在不同的分支(這是分支的原因),但是你可以畫一條直線(就像那些git log --graph --oneline繪圖) 。

+0

謝謝,澄清。 –

7

是,如果合併成一個B,第一個父是B,第二個是A.

因此,你可以做這樣的事情gitk --first-parent只顯示當前分支的歷史不合並,分支機構的詳細信息。

0

第一個父代之後的任何父代表來自另一個分支並至少有一個例外的合併。

如果合併一個分支到自身,當它在兩個地方工作的分別後來集成,在一個分支的「分支」的一個,因爲如果它來自無處會出現這通常發生。

這將顯示,如果你遍歷所有葉分支機構所有的父母,但分支內它這樣的分支不會顯示出來,如果你遍歷所有葉分支的線性歷史。這至少仍然是正確的,因爲您只會遍歷合併的提交的線性歷史記錄。將隱藏的事實是分支內有一個分支,因此它不會顯示該分支獨有的所有歷史記錄。

我不知道刪除分支是否有相同的效果。