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

9wbgstp7  于 2022-12-10  发布在  Git
关注(0)|答案(8)|浏览(421)

在以下示例树中:

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

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

git log xxx --not master

最后列出的提交应该是F。这是正确的解决方案还是可能有一些缺点?
我知道在stackoverflow上也有类似的问题,但是没有人提出这样的解决方案,我也不确定我是否做对了。

pdkcd3nj

pdkcd3nj1#

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

其中“分支”是你指定的分支名称。点-点给出了该分支拥有而master没有的所有提交。tail -1返回上一个输出的最后一行。

yptwkmov

yptwkmov2#

git cherry master -v | head -n 1

cherry-显示当前分支上不存在于上游分支(docs)上的提交。upstream(本例中为master)是当前分支的派生点。
-v-显示提交名称(而不仅仅是SHA)- verbose。
head- Unix命令,用于从文本中打印n行数

soat7uwm

soat7uwm3#

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

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

7ajki6be4#

如果你的分支(旧的)再次合并回主不给予预期的结果。我已经使用Python脚本找到初始分支提交Id。

git修订列表--第一个父变更集

  • --first-parent* 在看到合并提交时只跟随第一个父提交。

从上述命令迭代变更集,直到找到父分支为止

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)
col17t5w

col17t5w5#

git cherry master -v | tail -1

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

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

neekobn86#

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

umuewwlo

umuewwlo7#

您也可以使用它来直接获取特性分支中第一次提交的哈希值:

git log <source_branch>..<feature_branch> --pretty=format:%h
ykejflvf

ykejflvf8#

我尝试了以下命令,它成功了:

git log <source_branch> <feature_branch> --oneline | tail -1

相关问题