git 如何查找分支源自的提交哈希

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

假设我从主分支分支到主题分支,然后在主题分支上进行了一些提交。是否有命令告诉我主题分支源自的主分支上的提交哈希?

理想情况下,我不必知道我做了多少次提交(试图避免 HEAD^5 )。

我用谷歌搜索过,但似乎找不到答案。谢谢!

git git-branch
6个回答
86
投票

使用

git merge-base master your-branch
找到两个分支(通常是分支点)之间的最佳共同祖先。


86
投票

您可以使用

git reflog show --no-abbrev <branch name>
。它将输出对分支所做的所有更改,包括其创建,例如(我从
xxx
分支创建了
master
分支):

bdbf21b087de5aa2e78a7d793e035d8bd9ec9629 xxx@{0}: branch: Created from master

请注意,这不是很可靠,因为引用日志记录可能会过期(默认为 90 天),而且似乎没有 100% 可靠的方法来做到这一点。


9
投票

唯一 100% 可靠的方法是在创建分支时标记分支的开头。如果您将提交合并回您发起新分支的分支,则接受的答案将不起作用。有时会这样做,例如,如果您正在创建稳定版本分支并希望将在发布测试期间找到的修复程序合并回主版本。一件很平常的事。如果您知道您永远不会将新分支的提交合并回原始分支,那么接受的答案将起作用。


1
投票

如果感兴趣的分支还没有合并,就像大家说的:

  • git merge-base branch1 branch2

如果您合并了分支(例如

topic
master
,以任何方式合并):

  • 查找最后一次合并发生的位置(这就是当前所有答案所建议的)
    • git merge-base topic master
    • 给你
      sha-of-last-merge
  • 找到用于合并的两个(理论上,可能更多)提交:
    • git rev-list --parents -n 1 sha1-of-last-merge
    • 给你
      sha-of-last-merge sha-of-parent-1 sha-of-parent-2
    • 我们对最后两个感兴趣
  • 获取父母的两个 SHA1 并重复该过程:
    • git merge-base sha-of-parent-1 sha-of-parent-2
    • 如果您没有中间合并,这将为您提供首次创建分支的提交
    • 否则你必须不断重复
      • 这里最糟糕的部分是,除了查看提交消息或应用其他启发式方法之外,没有办法知道何时停止。如果你幸运的话,你最终会在 master 上进行提交,而不是只有一个单亲 - 这是一个自然的停止点。但是,如果您从具有多个父级的
        topic
        上的提交(即合并提交)开始您的
        master
        分支,那么就不走运了。需要启发法/常识/其他知识。

0
投票

这将向您显示第一个提交

topic
:

git rev-list topic ^master | tail -n 1

这将显示分支开始的提交,即分叉点:

git rev-parse "$(git rev-list topic ^master | tail -n 1)^"

这些也适用于自创建

master
分支以来将
topic
合并到
topic
的情况。它假设
topic
master
开始。


解释

git rev-list topic ^master

列出

topic
上无法从
master
访问的所有提交。

| tail -n 1

然后进行最后一次提交。

git rev-parse <rev>^

打印

<rev>
的第一个父级。


0
投票

迄今为止我发现的唯一通用方法。

git reflog show --no-abbrev $(git branch --show-current) | grep "branch: Created from" | awk '{print $1;}'
© www.soinside.com 2019 - 2024. All rights reserved.