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


91

在以下示例树中:

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

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

git log xxx --not master

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

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


Answers:


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

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


3
仅在存在“分支”的情况下才有效。如果分支被删除,您将如何处理?
Oz123 '16

2
@ Oz123分支可以用任何引用代替,例如HEAD或sha1或标签。但是显然您需要某种参考。
Zitrax '16

3
没有给我我所期望的。我的分支(旧分支)已经合并回master,这意味着xxx中的所有提交都已经在master中。仍然-我需要知道哪个提交是该分支上的第一个提交-或实际上-我需要单独检查该分支的提交历史-我不在乎它们是否在主目录上。
Motti Shneor

1
@MottiShneor取决于您的合并方式,这可能会很棘手。如果进行了快进,则好像该分支从未存在。否则,您可能对此答案感兴趣,该答案列出了许多找到分支点的方法。有了分支点后,SHA可以替换master,并且只要未删除分支,SHA git log <sha>..branch --oneline | tail -1仍应为您提供所需的结果。
ND极客

1
您可以使用--reverse颜色等向后读取日志
。– Dominik

8

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

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

如果您想回到原始的分叉点,我认为这不会奏效。如果将development合并到<branch>,则合并基础将比原始派生点新。
亚历山大·米尔斯

5
同样,这不是指向F,而是指向master分支中的提交(尽管很难在OP的图形中看到,似乎是B或C)。
RomainValeri


1

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

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

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

0
git cherry master -v | tail -1   

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

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

3
您是head -n 1不是要写而不是写tail -1tail -1返回最近的提交而不是第一个提交。
Nelu

-1

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


在我的仓库中,这显示了自上次从master合并到分支xxx以来的第一次提交,而不是分支xxx的第一次提交。
jk7'3
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.