git如何找到分支起源的提交哈希

z31licg0  于 2023-01-28  发布在  Git
关注(0)|答案(5)|浏览(150)

假设我从master分支转移到了一个topic分支,然后我在topic分支上做了几次提交,有没有一个命令告诉我topic分支的master分支上的提交哈希值?
理想情况下,我不需要知道自己提交了多少次(尽量避免HEAD^5)。
我已经在谷歌上搜索了这么多,似乎不能找到答案。谢谢!

6ojccjat

6ojccjat1#

你可以使用git reflog show --no-abbrev <branch name>,它会输出对分支所做的所有修改,包括分支的创建,例如(我从master分支创建了分支xxx):

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

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

pxiryf3j

pxiryf3j2#

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

wd2eg0qa

wd2eg0qa3#

唯一100%可靠的方法是在创建分支时标记分支的开头。如果你将提交合并回创建新分支的分支,那么已接受的答案将不起作用。有时候,如果你正在创建一个稳定版本分支,并希望将在发布测试中找到的修复合并回master,就需要这样做。这是一件常见的事情。如果你知道你永远不会把新分支的提交合并回原始分支,那么接受的答案将起作用。

eufgjt7s

eufgjt7s4#

如果感兴趣的分支机构尚未合并,就像大家说的:

  • git merge-base branch1 branch2
    如果您已合并分支(例如,topicmaster,以任一方式合并):
  • 查找上次合并发生的位置(当前所有答案都是这样建议的)
  • 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上的一个提交,而不是只有一个父提交--这是一个自然的停止点.然而,如果你从master上的一个提交开始你的topic分支,而这个提交有几个父提交(合并提交),然后没有运气。需要启发式/常识/其他知识。
jk9hmnmh

jk9hmnmh5#

这将显示topic上的第一次提交:

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

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

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

这也适用于创建topic分支后将master合并到topic的情况,假设topicmaster开始。

    • 说明**:
git rev-list topic ^master

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

| tail -n 1

然后执行最后一个提交。

git rev-parse <rev>^

打印<rev>的第一个父级。

相关问题