如何列出包含等效提交的分支

2024-03-04

在之前的问题中,有人提供了查找包含确切提交的分支的答案:

如何列出包含给定提交的分支 https://stackoverflow.com/questions/1419623/how-to-list-branches-that-contain-a-given-commit/%20how-to-list-branches-that-contain-a-given-commit

接受的答案强调这仅适用于精确的提交 ID,不适用于相同的提交。进一步指出可以使用 Git Cherry 来解决这个问题。

Git Cherry 似乎是为相反的方向而准备的;发现提交没有被推送到上游。如果我不知道哪个分支创建了它以及哪个分支是哪个分支的上游,那么这是没有用的。所以我不知道它将如何帮助解决这个问题。

有人可以解释/提供如何使用 gitcherry 查找包含特定提交的“等效项”的所有分支的示例吗?


在回答哪些分支包含等效提交的问题之前,您必须确定“哪些提交是等效的”。一旦你有了它,你只需使用git branch --contains在每个提交上。

不幸的是,没有 100% 可靠的方法来确定等效提交。

最可靠的方法是检查提交引入的变更集的补丁ID。这是什么git cherry, git log --cherry, and git log --cherry-mark依靠。在内部,他们都调用git patch-id。补丁 ID 只是变更的标准化差异的 SHA1。任何引入相同更改的提交都将具有相同的补丁 ID。此外,任何引入mostly仅在空格或文件中应用的行号不同的相同更改将具有相同的补丁 ID。如果两个提交具有相同的补丁 ID,则几乎可以保证它们是等效的 - 您几乎永远不会通过补丁 ID 得到误报。但假阴性经常发生。任何时候你做git cherry-pick并且必须手动解决合并冲突,您可能在变更集中引入了差异。即使 1 个字符的更改也会导致生成不同的补丁 ID。

按照 Chronial 的建议,检查补丁 ID 需要编写脚本。首先计算原始提交的补丁ID,类似于

(注意 - 脚本未经测试,但应该相当接近工作)

origCommitPatchId=$(git diff ORIG_COMMIT^! | git patch-id | awk '{print $1}')

现在,您必须搜索历史记录中的所有其他提交并计算它们的补丁 ID,并查看它们是否相同。

for rev in $(git rev-list --all)
do
   testPatchId=$(git diff ${rev}^1..${rev} | git patch-id | awk '{print $1}')
   if [ "${origCommitPatchId}" = "${testPatchId}" ]; then
      echo "${rev}"
   fi
done

现在您有了 SHA 列表,您可以将它们传递给git branch -a --contains

如果由于合并冲突,上述内容对您不起作用怎么办?

嗯,您还可以尝试其他一些方法。通常,当您选择提交时,会保留提交中的原始作者姓名、电子邮件和日期字段。因此,您将得到一个新的提交,但作者信息将是相同的。

所以你可以从你的原始提交中获取这些信息

git log -1 --pretty="%an %ae %ad" ORIG_COMMIT

然后像以前一样,您必须检查历史记录中的每一次提交,打印出相同的信息并进行比较。那might给你一些额外的匹配。

你也可以使用git log --grep=ORIG_COMMIT这将找到在提交消息中引用 ORIG_COMMIT 的任何提交。

如果这些都不起作用,您可以尝试寻找用镐引入的特定行,或者可以git log --grep对于提交消息中可能是唯一的其他内容。

如果这一切听起来很复杂,那么事实确实如此。这就是为什么我告诉人们尽可能避免使用cherry-pick。git branch --contains非常有价值、易于使用且 100% 可靠。其他解决方案都无法与之相媲美。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何列出包含等效提交的分支 的相关文章

随机推荐

  • S 的最长平衡子序列

    给出的问题 一串括号据说是 如果字符串中的左括号和右括号可以正确配对 则为平衡 例如 字符串 和 都是平衡的 而字符串 则不是 均衡 给定一个字符串S长度n由括号组成 假设你想找到最长的子序列S这是平衡的 使用动态规划 设计一个算法来找到最
  • 从 Resteasy 服务器返回文件

    你好 我想从 Resteasy 服务器返回一个文件 为此 我在客户端有一个链接 它使用 ajax 调用休息服务 我想在其余服务中返回文件 我尝试了这两段代码 但都没有按照我想要的方式工作 POST Path exportContacts p
  • 仅加载关系的 id(pluck)

    我有一个简单的应用程序 使用 Laravel 5 5 13 public function index return Pet all 这列出了所有宠物 我有多对多关系 其中许多用户可以拥有同一只宠物 宠物的人类家庭 我想加载这些用户 Doi
  • 文件夹如何工作?

    谁能解释一下怎么做foldr http haskell org ghc docs latest html libraries base Prelude html v foldr work 举这些例子 Prelude gt foldr 54
  • 如何在phar文件代码中获取.phar文件真实目录?

    我正在尝试创建一个php可执行文件 phar文件 来生成一些文件 我想知道如何获取phar文件的真实路径 在phar文件代码内 我想要做的是在phar文件的同一级别创建一个文件夹并在那里创建新文件 但是realpath DIR 似乎不起作用
  • Git:“工作树”到底是什么?与“工作目录”相同吗?

    我正在阅读大量有关 Git 的文档 最近我一直在寻找 工作树 概念 但我不明白 工作树 到底是什么 我找到了这样的描述 什么是工作树 https mijingo com blog what is the working tree in gi
  • 在 ActionScript 2.0 中按程序访问函数的参数列表

    我已经可以通过执行类似以下操作来获取类中的所有函数 for var member in obj if obj member instanceof Function var f Function obj member 有没有办法在动作脚本中获
  • Haskell、Lisp 和冗长[关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 生产中的 Azure SDK 2.2:无法加载文件或程序集“msshrtmi”或其依赖项之一。该系统找不到指定的文件

    我在 StackOverflow 和其他网站上的其他几个线程中读到过有关此问题的信息 其他解决方案都没有解决我的问题 而且大多数都已经过时 引用了旧版本的 Azure SDK 我有一个部署到 Azure 的典型 Azure 网站角色 该角色
  • Postgrex.Error ERROR 42501 unavailable_privilege 无法创建扩展 citext

    我正在尝试创建迁移 这是输出 MIX ENV prod DATABASE URL URL mix ecto migrate info execute CREATE EXTENSION citext Postgrex Error ERROR
  • Firebase 快照顺序错误

    我尝试将存储在 firebase 上的帖子加载到我的 tableView 中 我使用 childAdded 函数按照发布的顺序 从第一个到最后一个 获取帖子 起初它似乎有效 但现在不再有效 我不知道为什么 因此 我在帖子中添加了时间戳并使用
  • 弯曲等高列,但尊重另一列的最大高度[重复]

    这个问题在这里已经有答案了 我如何使下面的代码仅使用CSS flex 而不使用Javascript 第二列有动态内容列表 我需要根据第一列的高度应用滚动条 HTML div class row d flex div class col lg
  • 是否存在类似于 Nonetype 路径的东西?

    在我的课程中 我喜欢用 None 来启动我的路径变量 如果我使用os path很容易与其他路径进行比较 但我更喜欢pathlib风格 有没有解决方案可以做到这一点 import os path1 os path dirname D test
  • Selenium Grid:org.openqa.selenium.WebDriverException:转发新会话时出错用于设置功能的 VM 池为空

    我正在尝试使用 Cucumber 在硒网格上进行 POC 我收到此错误 转发新会话时出错 用于设置功能的虚拟机池为空 这是我的示例代码 公共静态无效configureServer GridHubConfiguration gridHubCo
  • 为什么 Swift 的 AVPlayer 在一场比赛中会加载两次playerItem?

    我正在使用 AVFoundation 的 AVPlayer 来流式传输外部 mp3 文件 我的后端有一个计数器 可以计算文件加载的次数 该服务的唯一客户端只有我一个 每当我触发播放 AVPlayer 时 计数器就会增加 2 这意味着 AVP
  • 使用 Bootstrap Accordion 添加向右箭头

    我想看看是否可以在 Bootstrap Accordion 标题的右侧添加箭头 我希望箭头在手风琴折叠时从下变为向上 这很复杂吗 我只希望标题带有箭头 并让它们在折叠时发生变化 但我在试图解决这个问题时遇到了最大的麻烦 这是代码 Accor
  • 使用 R 优化/向量化数据库查询

    我正在尝试使用 R 查询大型数据库 由于数据库的大小 我编写了一次获取 100 行的查询 我的代码如下所示 library RJDBC library DBI library tidyverse options java parameter
  • 架构组件改造和 RxJava 2 错误处理

    我目前正在尝试使用来自改造和 Okhttp 的 API 请求在架构组件中实现新的 ViewModel 一切正常 但我不知道如何将错误响应从改造传递到LiveDataReactiveStreams fromPublisher然后上游到片段中的
  • C++:遍历对象的所有成员?

    假设我有一个包含许多成员的对象 class Example AnotherClass member1 AnotherClass member2 YetAnotherClass member3 有没有一种简短 简洁的方法可以做类似的事情 fo
  • 如何列出包含等效提交的分支

    在之前的问题中 有人提供了查找包含确切提交的分支的答案 如何列出包含给定提交的分支 https stackoverflow com questions 1419623 how to list branches that contain a