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

Git-如何找到特定分支的第一次提交,git,Git,在以下示例树中: A-B-C-D-E (master branch) \ F-G-H (xxx branch) 我正在寻找F-在xxx分支中的第一个提交。我认为这是可能的: git log xxx --not master 最后列出的提交应该是F。这是正确的解决方案还是有一些缺点 我知道在stackoverflow上也有类似的问题,但没有人提出这样的解决方案,我也不确定我是否做对了。git rev list--祖先路径$(git merge base master xxx)

在以下示例树中:

A-B-C-D-E (master branch)
    \
     F-G-H (xxx branch)
我正在寻找F-在xxx分支中的第一个提交。我认为这是可能的:

git log xxx --not master
最后列出的提交应该是F。这是正确的解决方案还是有一些缺点

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

git rev list--祖先路径$(git merge base master xxx)…xxx | tail-1

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

其中“分行”是您的具体分行名称。点-点-点为您提供了分支拥有的主节点没有的所有提交
tail-1
返回上一个输出的最后一行。

您应该使用
合并基
功能,该功能旨在准确解决以下问题:

git merge-base remotes/origin/<branch> develop 
git合并基本远程/源/开发
如果您的分支(旧分支)再次合并回主分支并没有给出预期的结果。我已使用python脚本查找初始分支提交Id

git版本列表--第一个父变更集

--第一个父级在看到合并提交时仅跟随第一个父级提交

从上面的命令迭代变更集,直到找到父分支

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)
但是,这只会给您在未在master中的分支xxx上的第一次提交,而不是在分支xxx上的第一次提交。如果分支机构xxx已被删除和/或重新创建一次或多次,则后者将很困难。在这种情况下,您可以尝试以下方法:

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

我尝试了这个命令,它成功了:

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

只有在“分支”存在时,此文件的可能副本才起作用。如果分支被删除,您会怎么做?@Oz123 branch可以被任何引用替换,如HEAD、sha1或标记。但很明显,你需要一些推荐信,但这并不能满足我的期望。我的分支(旧分支)已合并回master,这意味着xxx中的所有提交都已在master中。不过-我需要知道哪个提交是该分支上的第一个提交-或者实际上-我需要单独检查该分支的提交历史-我不在乎它们是否在master上。@mottishne或者取决于您合并的方式,这可能很棘手。如果你做了一个快进动作,就好像这个分支根本不存在。否则,您可能会感兴趣,其中列出了许多查找分支点的方法。一旦你有了分支点,SHA就可以替换
master
,只要你的分支没有被删除,
git log..branch--oneline | tail-1
应该仍然会给出你要查找的结果。你可以使用
--reverse
以颜色向后读取日志,等。在我的回购协议中,这显示了自上次从主分支合并到分支xxx以来的第一次提交,而不是分支xxx的第一次提交。我认为如果您希望返回到原始分叉点,这将不起作用。如果将develop合并到合并基中,则会比原始分叉点更新。此外,这不会指向F,而是指向主分支中的commit(虽然在OP的绘图中很难看到,但似乎是B或C)。您的意思是编写
head-n1
而不是
tail-1
tail-1
返回最近的提交,而不是第一次提交。上面的第一个建议对我不起作用。将
master
更改为
main
后,这是我当前回购协议的默认分支(
master
给出了git的致命错误)。它给出最近的提交,而不是最早的提交。第二个建议很有效。
git cherry master -v | head -n 1
git log <source_branch> <feature_branch> --oneline | tail -1