2013-08-23 3 views
39

В следующем примере дерева:Git - как найти первую фиксацию конкретной отрасли

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

Я ищу F - первый совершить в хой отрасли. Я думаю, что это возможно с:

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

В мое репо показывает 1-ю фиксацию с момента последнего слияния с хозяином на ветку xxx, а не на 1-й фиксатор ветки xxx. – jk7

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

точка-точка дает вам все коммиты, что филиал имеет тот хозяин не имеет. tail -1 возвращает последнюю строку из предыдущего вывода.

+2

Это работает только в том случае, если 'branch''exists. Как вы это сделаете, если ветвь удалена? – Oz123

+1

@ ветвь Oz123 может быть заменена любым ref, например HEAD или sha1 или тегом. Но, очевидно, вам нужна какая-то ссылка. – Zitrax

+2

Не дает мне того, чего я ожидал. Моя ветка (старая) уже была объединена с мастером, что означает, что все фиксации в xxx уже находятся в главном. Тем не менее - мне нужно знать, какая фиксация БЫЛА первой в этой ветке, или на самом деле - мне нужно изучить историю совершений только этой ветви - мне все равно, находятся ли они на хозяине или нет. –

0

Вы должны использовать merge-base функциональность, которая предназначена для решения именно это:

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

Если ветвь (старый) еще раз слиты обратно к хозяину не дает ожидаемых result.I бы с помощью питона скрипт найти начальный идентификатор фиксации ветвления.

мерзавца преподобного список --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) 
Смежные вопросы