【问题标题】:Git find the oldest common ancestor of two branches [closed]Git找到两个分支的最古老的共同祖先[关闭]
【发布时间】:2021-01-01 18:11:56
【问题描述】:

我尝试了 git merge-base,但它只提供两个分支的最新共同祖先,而不是最旧的一个。谁能帮帮我?

谢谢!!

【问题讨论】:

  • 您的意思是两个提示都追溯到最旧的根,或者是具有多个子代的最旧的提交,其后代包括两个提示,还是什么?
  • 基本上是最老的根。例如,我针对主分支创建了一个名为“Sky”的分支。因为有人更新了我的主分支,所以我后来从主分支发出了一些拉取请求,我正在寻找一开始就创建“天空”的提交。
  • 好的。这不是 Git 术语中的根提交,根提交根本没有祖先,它们是整个历史上最古老的提交。你所要求的是对那些想要 Git 已经处理的东西的人的常见要求。你可以得到你所追求的东西,git rev-list --first-parent 在每个技巧上并找到第一个常见的,但没有人从 Git 中获得全部价值会发现它很有用。你能解释一下你打算用这个做什么,你在什么情况下触发了这个请求?
  • 嗨,jthill,感谢您的帮助。我基本上是在尝试计算分支从最终到初始的可用代码更改的行数。例如,在创建分支“Sky”后,A 修改了代码,添加了一行“a+b=c”、“c+d=e”,并对其进行了提交。之后,B 人将 master 分支合并到“Sky”中以更新分支并删除“a+b=c”。后来分支“Sky”的代码修改通过后,我们决定将其合并到master中,line_of_code_changes = 1(因为“a+b=c”被人B删除,“a+b=c”不可用代码更改)。想要 line_of_code_changes。
  • 你说你想计算可用更改,并正确显示 Git 如何不将恢复的 a=b+c 更改计算为可用,但又说你想计算 line_of_code_changes,意思是什么?如果进行了十次更改并还原了十次,您要计算十次吗?如果它在没有合并的情况下被还原,您是否要将原始更改及其还原都计为单独的更改?

标签: git github bitbucket


【解决方案1】:
  1. 运行git merge-base --all
  2. 在结果上运行git rev-list --max-parents 0;这些是可能的答案。
  3. 为您的目的定义“最旧”并选择第 2 步中显示的提交之一。(根据您的定义,添加 --topo-order 并选择最后一个输出可能就足够了。)

【讨论】:

  • 嗨,torek,你能提供一个例子来告诉我这是如何工作的吗?谢谢!
  • 这个工作的原因是共同祖先的每个祖先共同祖先(根据定义)。所以一旦git merge-base 找到Lowest Common Ancestor——或--all,找到所有这些,因为可能不止一个——从这里到达每个根提交的每个提交也是一个共同的祖先。根几乎可以肯定是您所说的“最古老的”。请点击此处的维基百科链接了解更多信息。
  • 也请参见jthill's comment questions,因为找到根祖先似乎并不是很有用。
猜你喜欢
  • 2014-03-19
  • 1970-01-01
  • 1970-01-01
  • 2021-09-05
  • 2020-04-03
  • 1970-01-01
  • 1970-01-01
  • 2012-08-23
  • 1970-01-01
相关资源
最近更新 更多