使用原始提交的哈希查找经过精心挑选或重新设置的提交

时间:2019-06-24 22:51:48

标签: git rebase git-rebase git-log git-cherry-pick

我有一个很大的git repo,上面有很多分支(通常,我只使用其中的一小部分,与我团队所拥有的功能有关)。假设我有一个提交的哈希(例如从请求请求中复制)。该提交可能已合并到我感兴趣的分支之一中,也可能没有。它可能已经直接合并,或者经过精心挑选或重新设置了基础。在后两种情况下,其在日志中的哈希值是不同的(因为尽管差异相同,但实际上现在是一个全新的提交)。

假设我知道原始提交的哈希,那么如何找到所有直接包含它的分支或以樱桃挑选或重新设置形式包含它的分支?

1 个答案:

答案 0 :(得分:1)

  

假设我知道原始提交的哈希,那么如何找到所有直接包含它的分支或以樱桃挑选或重新设置形式包含它的分支?

好消息是,您绝对可以做所有这一切(我将在稍后描述的一个或两个假设下)。 “直接包含” 变量是最简单的:git branch --contains hash给出答案。

需要以某种假设为准的”或“ ...”部分是一种假设,而坏消息是“ how”部分可能非常混乱。可能真的很简单!

有一个Git命令git patch-id,它获取git diff输出(由git diff直接产生,或更方便地由git show产生)并计算补丁ID ,本质上是去除行号和空格后diff的校验和。 (有关更多信息,请参见链接的文档页面,或运行git help patch-id。)例如:

$ git show HEAD | git patch-id
869f23f0e8b4813c88cb853fa2b4d415d25dc32c 8dca754b1e874719a732bc9ab7b0e14b21b1bc10

第二个哈希(如果出现第二个哈希)是提交的哈希ID:

$ git rev-parse HEAD
8dca754b1e874719a732bc9ab7b0e14b21b1bc10

因此,您可以在原始提交上运行git show并获取其补丁程序ID,然后在每个可疑提交上运行git show并查看补丁程序ID是否匹配。

这是 hard 的方式(但是很容易完成一次提交)。 easy 方法是让Git告诉您“相等的提交”。 git cherry命令及其更灵活但更难使用的伴侣git rev-list --cherry-mark,通过在一组提交中的每个提交上运行git show | git patch-id并在其中的每个提交上运行git show | git patch-id来工作另一组提交,并告诉您第一组中的哪些提交与第二组中的哪些匹配。

要使用git rev-list,您必须选择一个对称差分操作,即,使用带有三个点的A...B语法。 Git将计算A可以到达但B不能到达的所有提交的补丁ID,并将它们与B可以到达但A不能到达的所有提交的所有补丁ID进行比较。git cherry命令做了很多同样的东西,但语法不同,输出格式也不同。有关详细信息,请查阅两个文档页面。

警告非常明显:补丁ID基于diff减去行号和(某些)空白。但是有时在选择或重新设置基数时,必须对差异进行更改以使其适合。在这种情况下,修补程序ID将不匹配,并且这种检测将失败。您对此无能为力。