115

在以下示例树中:

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

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

git log xxx --not master

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

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

4

8 回答 8

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

其中“分支”是您的特定分支名称。dot-dot 为您提供了分支拥有而 master 没有的所有提交。tail -1返回上一个输出的最后一行。

于 2015-09-30T16:07:42.447 回答
14

您应该使用merge-base旨在解决此问题的功能:

git merge-base remotes/origin/<branch> develop 
于 2018-01-30T14:58:17.463 回答
11
git cherry master -v | head -n 1

cherry- 显示当前分支上不存在于上游分支 ( docs ) 上的提交。上游(在这种情况下为 master)是您当前分支的派生点。

-v- 显示提交名称(而不仅仅是 SHA) - 详细。

headn-从文本中打印行数的 Unix 命令

于 2019-03-15T23:24:47.013 回答
1

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

git rev-list --first-parent 变更集

--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)
于 2018-03-01T14:24:02.473 回答
1
git cherry master -v | tail -1   

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

git reflog | grep checkout | grep xxx | tail -1   
于 2018-08-13T15:09:32.900 回答
0

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

于 2013-08-23T17:08:08.673 回答
0

我尝试了这个命令并且它有效:

git log <source_branch> <feature_branch> --oneline | tail -1
于 2020-09-17T08:24:15.023 回答
0

你可以在当前分支上 git first commit

git log --oneline |tail -1

如果你想 git 首先提交另一个分支

git log branch_name --oneline |tail -1

于 2021-09-23T03:44:28.643 回答