【问题标题】:Identify merge into master识别合并到master
【发布时间】:2016-08-25 11:26:29
【问题描述】:

鉴于 master 分支历史中的提交 X,我想确定该提交包含在 master 中的合并。换句话说,我想找到最大的 i 使得 Xmaster~i 的祖先,即 i -th 的祖先沿着第一父链掌握。 (这假设合并到 master 将具有以前的 master 作为第一个父级,这通常是 afaik 的情况。)如何有效地完成?

示例

举个例子,假设我有以下历史:

A - B - C - D - E - F - G - H
     \       \     /   /
      I -[J]- K - L - M
       \         /
        N - O - P

当我想知道J git 何时合并到master(上行)时,我希望命令返回F。因为从H 开始,只有第一父级的历史是H - G - F - E - …,而JF 的祖先,但不是E 的祖先。仅仅在J..H 范围内寻找最近的合并是不够的,因为我不想找到KL。这两者都不是H 的唯一父级历史的一部分,因为LF 的第二个父级。

【问题讨论】:

  • 一次提交是时间上的快照,所以提交 X 只发生一次,并且不能由之前的提交引入。同样,上一次提交(特定变更集)中的diff 不太可能在其全部之前发生过。你的意思是 - 找到 X 之前的第一个合并提交,同时遵循 --first-parent 主线,这样你就可以看到当时带来了什么?
  • @PhilipOakley:不,我不是这个意思。我已经编辑了我的问题,希望这能澄清我所追求的。当然,一次提交只发生一次,但它通常会在稍后的时间进入 master,即不是在提交时,而是在合并时。我想找到那个合并。不需要是最近的合并,因为最近的合并可能不在主线上。所以一个简单的log --first-parent J.. 告诉我JC 之前与master 分歧,而一个简单的log --merges J..(正如你在回答中所建议的那样)告诉我KJ 之后的第一个合并,所以两者都不是这些回答了我的实际问题。
  • 在我的回答中添加了额外的注释 - 如果我有更多时间,我会尝试一些代码,但希望这些建议能让你到达那里。

标签: git version-control merge


【解决方案1】:

怎么样:

git log --oneline --merges -1  [<rev range>]

这将列出当前分支的第一个合并提交,或者如果您将其作为 rev 范围,则从提交 X 列出。评论git help log 甜味和服务。


更新以遵循已澄清的问题

额外的技巧是使用

git merge-base --is-ancestor <commit> <commit>

这将根据祖先返回真/假(例如https://stackoverflow.com/a/13526591/717355)。

所以首先在 master 上生成您的第一个父合并列表,或者排除相关提交可以访问的提交,或者使用日期和 --since=&lt;commiter_date&gt; 选项。然后对于每个按顺序(通常最旧的第一个),检查您的提交是否是给定合并提交的祖先。您可以使用以下 bash 脚本:

for merge in $(git rev-list --reverse --first-parent --merges "${commit}"..master)
do if git merge-base --is-ancestor "${commit}" "${merge}"
   then git show -s "${merge}"
        break
   fi
done

【讨论】:

  • 谢谢,这个祖先检查很有用,即使我仍然需要循环候选提交,我宁愿避免。我认为,时间戳在某些设置中可能会产生误导,因为它们可能会由于不正确的时钟设置而被修改或破坏。所以我建议在那里建立一个基于可达性的标准。我在您的帖子中包含了一些代码,希望您不要介意。我个人会放弃log --oneline 部分(因为它不能回答问题)和--since 部分(因为我认为替代方案更好),但这是你的帖子,我也不想干涉很多。非常感谢!
  • 我对 RTFM 进行了一些钻研,您可能会发现 git rev-list --first-parent --merges -- reverse &lt;commit&gt;..master 符合您的喜好。只需接受给定的第一个提交(` | head -1`)(注意--max-count= 似乎不起作用,因为--reverse 是最后应用的)。
  • 这不是我建议用来产生候选人的评论吗?无论如何,--max-count 是不合适的,因为在我想要的之前可能会合并到 master,但我输入的提交无法访问这些合并。在我上面的示例中,C 可能是其他一些功能分支的合并,并且会首先打印。所以我不能用它作为唯一的命令来找到我的解决方案。
  • @MvG,现在我看,是的,它很相似。我认为需要更多的修订限制器。 rev-list 顺序(包括双点符号 J..H)应该保证列表中的第一个(反转)是最旧的,它可能是合并和第一个父链(master !) ,我认为这是请求。即使C 是一个合并,它也不在 J..H 范围内。最大计数可能会混淆,因为它可能依赖于反向,但看起来它是在 before 反向应用的。尽管如此,它仍然是建立 Git 理解的有用练习!
  • @MvG,尝试添加--ancestry-path(男孩,那些手册可能很辛苦)和public-inbox.org/git 用于gmane 替换(可以通过旧的gmane id 号码搜索)
猜你喜欢
  • 1970-01-01
  • 2021-03-06
  • 1970-01-01
  • 2013-01-14
  • 2021-05-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多