如何调试大型 git 提交?

2024-01-25

好的,情况如下:

几年前,我们对代码库中的多个文件进行了多项更改,并一次性全部提交。这些更改中的某个地方隐藏着一个错误。使用 git bisect,我很快就能够追踪到罪魁祸首的提交,但该提交中的更改量让我有点不那么热情了。

使用 git bisect 查找错误的提交是轻而易举的事,但是一旦找到,追踪导致一切顺利的单一更改的最佳方法是什么?将受影响的文件一一恢复到以前的版本?


除非您非常了解大型提交中发生的所有更改,否则这可能会非常乏味。

通常,非常大(坏大)的提交涉及许多不同的更改。您需要做的是从概念上隔离所有这些更改并重写不同的提交。

我建议根据以下 4 个标准来分解变更:

[新] 涉​​及与单个识别的技术级功能相关的所有代码(与可能涉及多个技术级功能的用户级相反)

[RFG] 任何行为不变的变化。保留执行的行为和 API(接口)

[CHG] 实施任何代表规范/要求变更的内容

[修复]任何可能改变行为的更改,以使其符合编码背后的意图。

然后,git-wise 这就是你需要做的:

  git checkout <bad commit SHA1> -b CULPRIT

这将创建一个“CULPRIT”分支。我始终保留此作为参考,因为您可能需要对以下步骤执行许多繁琐的迭代。作为旁注,沿途保留部分引用会有所帮助(作为分支或标签)。

  git reset HEAD^ --mixed

这将撤消提交,就好像该提交中的所有更改都作为未暂存更改的补丁应用到先前提交中一样。然后使用

  git add --patch

您可以更改这些更改的子集。请毫不犹豫地使用 [s]plit 选项来逐行单独选择更改。有时,您无法避免手动选择所需更改的版本。并重新暂存为我上面建议的 NEW、RFG、CHG、FIX 方案中分解的多个提交,并根据需要重写任意数量的提交。

请注意:

  • 暂存一个无法编译的新提交
  • 暂存一个新的提交,该提交会产生“微不足道”的运行时错误(例如段错误)
  • 需要合并才能使事情正常工作的子提交

...因为目标是让二等分工作。此外,通过 git diff 新的 HEAD 提交来确保您的新提交与旧提交相同,以确保您没有引入进一步的更改。

一开始这很痛苦,需要大量练习,但是一旦你足够擅长这样做,你将成为整个团队崇拜的调试之神,然后可以以 NEW 的形式传播小提交的福音, CHG、RFG 和 FIX。

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

如何调试大型 git 提交? 的相关文章

  • 仅使用 Git grep 的文件名

    我只想查看文本中包含特定单词的不同文件 current directory git grep word 显示文件中具有匹配单词的每一行 所以我尝试了这个 current directory git grep word files with
  • 将更改从一个分支复制到另一个分支

    我有一个分支名为BranchA from master 我有一些改变BranchA 我不会合并来自BranchA to master 现在我创建了另一个分支master named BranchB 我如何复制更改BranchA to Bra
  • 除非我在项目目录中,否则 Git 不会显示日志

    我正在尝试打电话git log当我在不同的目录中时 我经过的位置 git is git log Users Leica proj1 但它说 不是 git repo 如果我cd进入这个目录 就可以正常工作了 cd Users Leica Pr
  • 部分共享git仓库

    我是 git 新手 我想知道是否支持以下场景 如果支持的话如何支持 即用于设置和更新的 git 命令 可以从三个不同的地方获取存储库 本地 镜像 和 github mirror 完全镜像 local github 镜像 local 但 受版
  • Gerrit 和 Active Directory

    我正在尝试设置 Gerrit 以使用我们的公司 Active Directory 进行身份验证 我知道很多人都设法让它发挥作用 但它对我来说不起作用 如果我运行一个ldapsearch命令如下我得到了正确的结果 所以我知道我的搜索字符串是正
  • 删除 Git 存储库,但保留所有文件

    在我使用 Linux 的过程中的某个时刻 我决定将我的主目录中的所有内容都放入源代码管理中是个好主意 我不是在问这是否是一个好主意 我是在问如何撤销它 删除存储库的原因是我最近安装了 Oh My Zsh 而且我非常喜欢它 问题是我的主目录有
  • 我应该把 .gitignore 放在哪里才能影响所有项目?

    我应该在哪里放置一个 gitignore文件以便我的所有项目都使用这些设置 我尝试了各种文件夹 只有将其放入项目文件夹中才能使其正常工作 但是设置 当然 仅应用于该项目 而不是我的其他项目 git 包含一个 全局 配置选项 可以告诉它在启动
  • 无法使用 Git 部署从多项目解决方案部署正确的网站到 Azure

    我有一个解决方案 它有一个 mvc 网站 WebApplication1 该网站依赖于解决方案中的另一个项目 WebAppCore 源代码托管在 Visual Studio Online 上的 git 中 我配置了持续集成 一切都构建得很好
  • 为 RHEL 6 安装/构建 git-svn

    我无权访问 RHEL6 存储库 那么在 RedHat Enterprise Linux 6 上构建和 或安装 git svn 工具的最佳方法是什么 通过卸载现有的 yum擦除git 并从源安装最新的来设法安装git和git svn 1 7
  • 尝试克隆一个 git 存储库,但它卡在克隆到中

    我使用的是 Windows 10版本 10 0 19042 内部版本 19042 GIT Ver 2 32当尝试使用 git bash 执行以下命令时git clone depth 1 b carla https github com Ca
  • 使用Git记录文件复制操作

    当我使用 git mv 在 git 中移动文件时 状态显示该文件已被重命名 即使我更改了某些部分 它仍然被认为几乎是相同的东西 这很好 因为它让我可以跟踪它的历史记录 当我复制文件时 原始文件有一些历史记录 我想将其与新副本关联起来 我尝试
  • 哪些 git hooks 适用于“git rebase --continue”?

    我正在尝试为我的组织构建一组 git hook 脚本 我想使用的一个脚本 仅用于我自己的多个项目 将是检查git rebase continue我的代码中没有留下任何冲突标记 lt lt lt lt lt or gt gt gt gt gt
  • 有没有办法导入/导出容器绑定脚本

    我有一个插件 它使用 appscripts gs 以及 html js 和 css 文件 目前我们所做的是我们有一个参考 Google 文档 其中有一个脚本项目包含所有这些源代码 但是除了手动复制和粘贴之外 没有办法在 GIT 中保留源代码
  • 使用BFG时可以指定多个文件吗?

    我正在尝试删除通配符无法覆盖的多种类型的文件 我尝试使用多个 delete files 但它不接受它 还尝试将文件全部放在 delete files 之后 但它也不接受它 有没有一种方法可以将它们全部放在一个命令中 如果没有 那么我必须运行
  • Gitolite git 克隆错误

    我正在尝试在我的服务器 Macos 服务器 上设置 gitolite 我按照此处找到的安装文档中的说明进行操作 http sitaramc github com gitolite doc 1 INSTALL html http sitara
  • 使用 pgAdmin 调试 PostgreSQL 函数

    I refer this http www postgresonline com journal archives 214 Using PgAdmin PLPgSQL Debugger html启用 PostgreSQL 服务器中的调试器
  • 如何在GIT中构建标签树?

    作为 GIT 的频繁用户 我喜欢git log graph尽我所爱git tag 我负责一个大型 GIT 存储库 其中有太多分支和标签 而且我的处理速度太慢西西弗斯式的 https en wikipedia org wiki Sisyphu
  • 仅使用 git 存储未暂存的更改(不是 --keep-index)

    首先 我确实知道 keep index 这不是我想要的 因为它仍然隐藏着all更改 但将暂存的更改保留在工作树中 如果可能的话 我只想存储未暂存的文件 而无需再次添加所有更改git stash patch 如果您想存储索引 已暂存的内容 和
  • 在 Windows 下克隆 git repo 时,出现“错误:无法创建文件 <文件>...(是目录)”

    Z gt git clone git github com kennethreitz httpbin git Cloning into httpbin remote Counting objects 1073 done remote Com
  • 推送更改到 Git 不起作用

    每次我想要提交命令 git push heroku master 时 系统都会要求我在 PowerShell 中输入凭据 当我输入 heroku 凭据 默认情况下连接到 git 时 我收到错误消息 但是 当我输入我的主目录中的 netrc

随机推荐

  • 在 Dockerfile 中使用 SSH 进行 Git 克隆

    我正在尝试在 docker 映像中使用 ssh 克隆 git 存储库 并且我想在构建 dockerfile 时执行此操作 我可以使用 git clone https 以及用户名和密码来完成这项工作 但使用 ssh 会失败 我的 docker
  • .htaccess 路由 PHP

    我正在尝试在 htaccess 中为 PHP 编写一些简单的路由 我的文件现在看起来像这样 RewriteEngine On RewriteBase webservices RewriteCond REQUEST FILENAME f Re
  • 如何在 Visual Studio 中正确设置 exe 的入口点?

    我已将入口点设置为 WinMain 但是当我运行该应用程序时 它启动但不显示 然后我必须使用任务管理器将其关闭 这是 WinMain 之前的代码 include
  • 为什么 chrome 会突出显示未在样式中列出或计算的边距

    样式 下没有显示边距样式 并且如您所见 它也没有显示任何正在计算的内容 不知道这里发生了什么 但在将元素的宽度更改为 90 后我注意到了这一点 我正在使用粉底 所以也许它有一些竞争风格 我不是问如何解决我的具体问题 这就是为什么我没有发布代
  • Windows DLL实际上是如何共享的?

    通过检查 Windows 计算机中的几个 DLL 例如 KERNEL32 DLL 我注意到它们的任何部分 甚至只读数据部分 都没有设置 IMAGE SCN MEM SHARED 标志 DLL 是从 dll 文件映射的 因此只有当您读取文件的
  • C++ 变量作用域

    与我的预期相比 我的 C 代码输出不同 我希望了解它是如何执行的 include
  • 如何使用角度2中的管道过滤列表

    你能告诉我如何使用 Angular 2 中的管道来过滤列表吗 https stackblitz com edit angular qvtqeu file src 2Fapp 2Fapp component html https stackb
  • 如何找到2个以上用户的匹配时间间隔

    从给定的不同用户的时间间隔中找到最合适的时间 Rows 5 fid userid FromDateTime ToDateTime flag 62 1 2012 07 18 01 48 20 2012 07 18 02 55 20 1 63
  • SQL 查询不会仅返回一个字段的完整结果

    我在使用 VBA 执行 SQL 查询并将结果复制到 Excel 工作表中时遇到问题 当 sub 执行时 它仅复制 256 倍数的行 因此第 256 512 768 等行是唯一填充到 Excel 中的行 我从数据库复制任何其他字段都没有问题
  • Java 中的延续

    Java 中有没有好的延续性实现 如果是这样 开销是多少 JVM 的设计并没有考虑到这些事情 对吗 那么这种做法是不是有悖常理呢 请参阅 Apache Javaflowhttp commons apache org sandbox java
  • 我可以使用自动映射器将多个对象映射到目标对象吗

    UserAccount objUserAccount null AutoMapper Mapper CreateMap
  • 如何设置 PHP_AUTH_USER

    PHP AUTH USER 为空 并且系统使用Windows登录凭据 我该如何改变它 我想使用用户输入的用户名和密码 See 使用 PHP 进行 HTTP 身份验证 http php net manual en features http
  • 如果实体中没有定义标识符,Hibernate 如何在内部跟踪对象?

    根据 Hibernate 参考文档 标识符属性是严格可选的 你可以把它们放下 并让 Hibernate 在内部跟踪对象标识符 如果实体中没有定义标识符 Hibernate 如何在内部跟踪对象 进一步扩展问题 如果没有标识符 我们如何 loa
  • eval() 可以优化吗?

    eval 更改局部变量的能力给 JavaScript 优化器带来了很大的问题 我读了 javascript权威指南 这本书 eval 可以优化吗 我不明白 这并不是说eval优化 而是那些寻求优化的 JavaScript 引擎被阻止这样做e
  • 对向量的每个元素中的单词重新排序

    我想更改向量中每个元素的词序 具体来说 我想制作另一个向量 其中第一个单词现在是许多长度不同的元素的最后一个单词 Data metadata1 lt c reference1 an organism reference2 another o
  • 如何填写数据安全? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我正在为我的应用填写 Google Play 数据安全表单 我的应用程序使用 AdMob 并且没有其他收集用户信息的库 我该怎么填写呢 对
  • 双击 .jar 文件时“找不到主类”

    首先 我意识到这个问题应该很简单 而且很多人似乎都经历过 但是 看来我的问题可能是slightly与现有职位不同 我正在使用 NetBeans 编译 Java 应用程序 构建完成后 输出将正确进入 dist 文件夹 jar 文件就在那里 如
  • onSaveInstanceState中保存接口(Listener)

    保存实例状态 对于像 Integer Long String 等数据都可以 我只是将其放入包中 并在再次调用 onCreateView 时将其取回 但我的片段也有像下面这样的听众 public class SomeFragment exte
  • EPPlus 和 ClosedXML 库在使用 OpenXML 方面有何区别? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我试图在 ClosedXML EPPlus 和可能的 SpreadsheetLight 之间进行选择 我可能会出于哪些原因考虑选择其中之一
  • 如何调试大型 git 提交?

    好的 情况如下 几年前 我们对代码库中的多个文件进行了多项更改 并一次性全部提交 这些更改中的某个地方隐藏着一个错误 使用 git bisect 我很快就能够追踪到罪魁祸首的提交 但该提交中的更改量让我有点不那么热情了 使用 git bis