2013-08-23 118 views
39

的在下面的例子中樹:Git的 - 如何找到第一次提交特定分支

A-B-C-D-E (master branch) 
    \ 
    F-G-H (xxx branch) 

我正在尋找的F - 在XXX分支的第一個承諾。我認爲這是可能的:

git log xxx --not master 

和列出的最後提交應該是F.它是正確的解決方案也許有它的一些缺點?

我知道在stackoverflow上有類似的問題,但沒有人提出這樣的解決方案,我不知道如果我做對了。

+0

http://stackoverflow.com/questions/6058308/in-git-how-can-i-find-the-revision-at-which-a-branch-was-created – nyzm

回答

-3

git rev-list --ancestry-path $(git merge-base master xxx)..xxx | tail -1

+0

的可能重複在我的回購顯示自從最後一次合併到master到分支xxx之後的第一次提交,而不是分支xxx的第一次提交。 – jk7

45
git log master..branch --oneline | tail -1 

點 - 點給你所有的分支有主沒有提交的。 tail -1返回前一個輸出的最後一行。

+2

這隻有當分支存在時纔有效。如果分支被刪除,你會怎麼做? – Oz123

+1

@ Oz123分支可以被任何裁判所取代,如HEAD或sha1或標籤。但顯然你需要一些參考。 – Zitrax

+2

不給我我期待的。我的分支(舊的)已經合併回主,這意味着xxx中的所有提交已經在master中。仍然 - 我需要知道哪個提交是該分支上的第一個提交 - 或者實際上 - 我需要單獨檢查該分支的提交歷史記錄 - 我不在乎它們是否處於master階段。 –

0

您應該使用merge-base功能,其目的是準確地解決這個問題:

git merge-base remotes/origin/<branch> develop 
0

如果您的分行(舊)再次合併回主人不給期待已result.I使用python腳本找到初始分支提交ID。

git的轉速名單--first父變更

--first父母遵循只有第一父提交見狀合併提交。

從上面的命令迭代變更集,直到發現父分支。

def status_check(exec_command, exec_dir=None, background=False): 
    if exec_dir: 
     os.chdir(exec_dir) 
    res = subprocess.Popen(exec_command, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE) 
    if not background: 
     result = res.communicate() 
    return result 



def findNewBranchCommits(changeset=None): 
    cmd = "git rev-list --first-parent "+ changeset 
    rev_list = status_check(cmd,self.module_dir) 
    rev_list = str(rev_list[0]).split('\n') 
    rev_list = list(filter(None, rev_list)) 
    for x in rev_list:      # Iterate until branch base point 
     rev_cmd = "git branch --contains " + x 
     rev_cmd = status_check(rev_cmd,self.module_dir) 
     rev_cmd = str(rev_cmd[0]).split('\n') 
     if(len(rev_cmd) > 2): 
      print "First Commit in xxx branch",x 
      break 

findNewBranchCommits(changeset) 
相關問題