Git 使用原始提交的哈希查找已拾取的提交或重定基础的提交

Git 使用原始提交的哈希查找已拾取的提交或重定基础的提交,git,rebase,git-rebase,git-log,git-cherry-pick,Git,Rebase,Git Rebase,Git Log,Git Cherry Pick,我有一个大型的git回购协议,通常有很多分支,我只处理其中的一小部分,与我的团队拥有的功能相关。假设我有一个提交的散列,例如从拉请求复制的散列。这个提交可能已经合并到我感兴趣的一个分支中,也可能没有。它可能被直接合并,或者被挑选或重新定基。在后两种情况下,它在日志中的散列是不同的,因为它现在实际上是一个全新的提交,尽管具有相同的差异 如果我知道原始提交的散列,我如何才能找到所有直接包含它的分支,或者以cherry picked或rebased形式包含它的分支 如果我知道原始提交的散列,我如何才能

我有一个大型的git回购协议,通常有很多分支,我只处理其中的一小部分,与我的团队拥有的功能相关。假设我有一个提交的散列,例如从拉请求复制的散列。这个提交可能已经合并到我感兴趣的一个分支中,也可能没有。它可能被直接合并,或者被挑选或重新定基。在后两种情况下,它在日志中的散列是不同的,因为它现在实际上是一个全新的提交,尽管具有相同的差异

如果我知道原始提交的散列,我如何才能找到所有直接包含它的分支,或者以cherry picked或rebased形式包含它的分支

如果我知道原始提交的散列,我如何才能找到所有直接包含它的分支,或者以cherry picked或rebased形式包含它的分支

好消息是,你完全可以在一两个假设下完成这一切,我将在稍后描述。直接包含它的变体是最简单的:git branch-contains散列生成答案

或。。。在cherry picked或rebase中,表单部分需要一个假设,而坏消息是,how部分可能相当混乱。或者这可能真的很容易

有一个Git命令,它接受由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是否匹配

这是一种很难的方法,但是对于一次提交来说很容易做到。简单的方法是让Git告诉您关于相等的提交。该命令及其更灵活但更难使用的companion命令的工作方式是,在某一组提交中的每个提交上运行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基于差减号和一些空白。但有时在樱桃采摘或重基时,必须改变差异以使其适合。在这种情况下,补丁ID将不匹配,这种检测将失败。对此你无能为力。

类似于这个问题。你可能会在那里找到你需要的东西。