如何调试大型 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 提交? 的相关文章

  • 如何禁用 GitHub 中的拉取请求?

    我试图了解如何禁用 github 中的 拉取请求 问题一 我们正在尝试使用变基工作流程 这意味着如果不是快速推进 那么使用拉取请求可能会有害 一种解决方案 为我想要禁用拉取请求的分支设置分支权限 或者将我添加为任何进入 master 的内容
  • 如何在 Netbeans 中调试 Java Web 应用程序?

    我曾多次在 Netbeans 中调试 Java 桌面应用程序 但从未调试过 Java Web 应用程序 我尝试以同样的方式调试它 但它不起作用 我制作了一个index html网页 该页面上有一个 表格 用户提交表单后 请求将发送至 ser
  • git 如何查找分支源自的提交哈希

    假设我从主分支分支到主题分支 然后在主题分支上进行了一些提交 是否有命令告诉我主题分支源自的主分支上的提交哈希 理想情况下 我不必知道我做了多少次提交 试图避免 HEAD 5 我已经用谷歌搜索过 但似乎无法找到答案 谢谢 use git m
  • 如何关闭分支而不将其从 git 的历史记录中删除?

    我想提交并关闭其分支 而不将其从历史中删除 有了水银我会commit close branch then update转到上一个 然后继续工作 有了 git 我很困惑 没有与 Git 中关闭分支完全相同的方法 因为 Git 分支比 Merc
  • 在 .gitconfig 中隐藏 GitHub 令牌

    我想将所有点文件存储在 GitHub 上 包括 gitconfig 这需要我将 GitHub 令牌隐藏在 gitconfig 中 为此 我有一个 gitconfig hidden token 文件 这是我打算编辑并放在隐藏令牌的 git 下
  • 为什么“git描述-dirty”在描述干净结帐时添加“-dirty”后缀?

    我刚刚发现 dirty选项git describe看起来它应该做一些非常有用的事情 即在输出中附加一个后缀git describe当工作树脏时 但是在我的一些存储库上似乎并非如此 git status On branch 8 30 noth
  • git-svn 如何知道要提交到哪个分支?

    我的存储库是 SVN 我使用 git 进行所有开发 我们有一个标准布局 我用以下命令初始化了我的本地存储库git svn init s
  • SSL 适用于浏览器、wget 和curl,但不适用于 git

    我有一个网站 用于托管 redmine 和几个 git 存储库 这非常适合 http 但我无法使用 https 进行克隆 即 git clone http mysite com git test git 工作正常 但是 git clone
  • 为别名命令添加“git help”?

    我已经实现了一个 Git 命令并使用 git 别名将其连接到 Git 但是有没有办法连接 Git 帮助 我在 Windows 上运行 如果我发出git help mycmd我收到一个弹出窗口 告诉我 Git 找不到 git mycmnd h
  • 如何使用 git --word-diff 显示空格差异?

    为了说明问题 参见diff https github com nim lang Nim commit 47c7fd037ed28b7de3d120b003d059d30e18f128 diff split diff 8af935b2312d
  • http.h:6:23: 致命错误:curl/curl.h:没有该文件/目录

    我在 CentOS 7 中下载 git 包 wget https www kernel org pub software scm git git 2 0 1 tar gz tar xzf git 2 0 1 tar gz 当我编译git时
  • Xcode 6.1“Xcode 调试器中内置的 Swift REPL 可以检查和操作正在运行的应用程序”不起作用

    对于 Xcode 6 1 更新点之一是 Xcode 调试器内置的 Swift REPL 可以检查和操作 你的跑步应用程序 我创建了空项目 在 viewDidLoad 中设置了一个断点 当应用程序在断点处停止时 我在 Xcode 控制台中输入
  • 如何恢复已删除的远程分支

    我们的远程主分支被删除 我有主存储库的本地副本 但它已经过时了 我可以通过将最后一个已知的提交哈希值插入 URL 来查看 github 中的分支 但未能成功恢复它 我尝试了几个步骤来恢复它 git reset hard 16deddc05c
  • 在种子项目上构建时如何组织 git 存储库

    我正在基于从 github 克隆的种子项目 MEAN io 构建一个网站 如何将这些文件与我自己的文件分开 由于该种子提供了广泛的文件框架 因此我自己的文件分布在整个项目中 我希望能够从种子中提取更新 但不能将其与我添加的文件混合 我知道我
  • Git:忽略版本控制文件

    gitignore 文件对于忽略一些我们不想控制的文件非常有用 不幸的是 当文件已处于版本控制之下时 它无法使用 例如 我的 gitignore 已添加到 git 中 文件可能与我的同事想要的不同 例如我想忽略 Vim 文件 每当我对此文件
  • 在 python 中找不到 git 可执行文件

    我试图使用访问密钥克隆 git 存储库 但是当我尝试运行它时 它抛出一个异常 说找不到 git 可执行文件 但我已经安装了 git 并且 in it py 显示了正确的路径 C Program Files Git bin 我还安装了 git
  • 我如何才能看到 Github 风格的东西,例如 git -repo 的打孔卡和时间线?

    我正在寻找一个可以可视化 git repo 工作的软件 我喜欢 Github 的一些功能和 Bitbucket 的一些功能 所以我不想使用它们 因为它们并不完美 我正在寻找创建类似视觉特征的方法 下面你可以找到一些部分 但仍然缺少很多谜题
  • 设置 git 别名,但调用它会给出“找不到命令”

    我想在 git 中设置一个别名来计算存储库中的总行数 因此我进入 Git Bash 并输入以下内容 git config global alias linecount ls files z xargs 0 wc l 我输入命令后 没有出现错
  • 调用堆栈中的“外部代码”是什么意思?

    我在 Visual Studio 中调用一个方法 并尝试通过检查调用堆栈来调试它 其中一些行标记为 外部代码 这到底是什么意思 方法来自 dll已被处决 外部代码 意味着该dll没有可用的调试信息 你能做的就是在Call Stack窗口中单
  • Git 实验分支还是单独的实验存储库?

    我正在开发一个 Android 应用程序 并且在整个开发周期中一直使用 Git 现在 我想构建并发布实验性功能 供人们尝试和安装 同时仍将原始的 稳定的应用程序安装在他们的设备上 现在 这意味着我需要使用不同的包名称 这会更改开发项目中的一

随机推荐

  • 在 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