Git - 如何找到特定分支的第一次提交

问题描述 投票:68回答:6

在以下示例树中:

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

我正在寻找F - xxx分支中的第一个提交。我认为有可能:

git log xxx --not master

最后列出的提交应该是F.这是正确的解决方案还是有一些缺点?

我知道stackoverflow上有类似的问题,但没有人提出这样的解决方案,我不确定我是否做得对。

git
6个回答
82
投票
git log master..branch --oneline | tail -1

“分支”是您的特定分支名称。点点线为您提供了主人没有的分支所有提交。 tail -1返回上一个输出的最后一行。


5
投票

您应该使用merge-base功能,旨在解决这个问题:

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

1
投票

如果您的分支(旧的)再次合并回master,则不会给出预期的结果。我使用python脚本来查找初始分支提交ID。

git rev-list - 第一个父变更集

--first-parent在看到合并提交时仅遵循第一个父提交。

从上面的命令迭代changeset,直到找到父分支。

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)

1
投票
git cherry master -v | head -n 1

0
投票
git cherry master -v | tail -1   

但是这只会给你第一次提交不在master中的分支xxx,而不是第一次提交分支xxx。如果分支xxx已被删除和/或重新创建一次或多次,则后者将是困难的。在这种情况下,您可以尝试以下方法:

git reflog | grep checkout | grep xxx | tail -1   

-2
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.