Git - 没有更改的提交包含错误
Git - Commit with no changes contains bug
考虑这段 git 历史。如果我检查第二个突出显示的提交(或它上面/更新的任何提交),那么它包含一个我可以在屏幕上看到的错误(错误的细节不太相关)。
如果我签出第三次提交(或它下面/更早的任何提交),那么我就不会再在屏幕上看到错误。
如您所见,第二个提交包含 0 个更改的文件,其中有 0 个添加和 0 个删除。
这两个提交之间的切换如何引入或删除我试图修复的错误!?我不知道在两次提交之间更改了哪些文件?
更新
上图并非严格真实,实际情况如下。我没有意识到 GIT 中会发生这种情况,如果有人可以解释如何在 "Ensure we always return an integer" 提交中重新引入 NO BUG,那就太好了!
我将评论以下文字的实际含义:
Showing 0 changed files with 0 additions and 0 deletions
这只是意味着底部(第二个)提交与之前的提交相比没有任何变化。因此,如果签出此提交解决了错误,这并不一定意味着该提交是引入更改以修复它的原因。相反,一些较早的提交是负责任的。对于图表,请考虑:
A -- B -- C
该错误是在提交 C
中引入的,但未出现在提交 A
中。由于提交 B
实际上是空操作,因此它也不存在错误。
你听说过git bisect吗?
执行并执行此命令后,将准确指出引入错误的提交。
简单地说,你首先执行命令并给它一个你知道没有错误的 "starting point"(一个提交 SHA),然后你给它一个 "ending point"(也是一个提交SHA) 你知道 DID 有错误,然后 git 将进行分而治之的过程,并会为你检查版本,在每次检查时,你测试并查看错误是否存在,然后你告诉 git(坏与好),git 将根据您的输入继续搜索。最后,它会显示引入错误的提交。
值得一试,而且操作简单(而且非常有趣)。
历史很少是一条直线
在您更新的图形图像中,您在顶部有较新的提交,在底部有较旧的提交。一切都被强制排成一条整齐的直线。但这是对现实的扭曲看法,就像 每个 观点都是扭曲的一样。 (如果需要,我们可以介绍爱因斯坦和相对论来证明这一点,但我们只是假设我们喜欢从我们现在坐/站的位置来看事物,而不是事物回到过去时的样子我们没有今天的观点。明天或明年我们会有另一个观点!)
让我们以不同的方式重绘这段历史,让事情变得更清晰。我们将把较旧的作品放在左边,较新的作品放在右边,然后平行画 ,像这样:
...--o--o---o
\
X--X--X <-- master
/
...--o---X--X <-- feature/buggy
^
|
bug introduced
其中 X
表示有错误的提交。请注意,在底行的第一个有问题的提交发生在顶行显示的一个好的提交之后,然后第二个有问题的提交与顶行的最后一个好的提交同时(甚至稍早) .该错误显然是在我标记的地方首次引入的。
现在,如果我们垂直绘制这个线性化的,顶部有较新的提交,我们得到:
.
.
.
X (still has bug introduced by merge)
X (bug first introduced by merge)
o (commit from the top row, not broken)
X (bug in feature/buggy - commit from the bottom row)
X (bug in feature/buggy)
o (commit from the top row, not broken)
.
.
.
在线性化视图中,有问题的提交被好的提交分开。在 "correct"(或至少 less-distorted)视图中,一次查看一个 "leg" 的历史记录,错误的提交都是连续的。
您在更新的图形中显示的实际视图有一个提交,其 日志消息 说 Merge remote-tracking branch 'AWS/...
(这被切断),但这不是合并提交(包含两个或更多parents 的提交)。这是由 git merge --squash
或在某些 Web 界面上单击标记为 "squash and merge" 的按钮进行的合并。这些提交是通过使用 Git 的 合并机制 进行的,但不记录正确的历史记录。1 所以在这种情况下,唯一我知道这是来自严酷的经验:我以前见过这种确切的问题。我在此处绘制的图表显示了如果合并是常规合并而不是挤压合并,情况会如何。
None 在这里很重要,但是您组织中的某个人可能应该花一些时间来了解 Git 如何在 fine-grained 级别工作,以便找到并以后更容易修复错误。
1这通常是故意的:想法是为了让未来的调查更容易而对历史撒谎,即使事实上它使以后的调查更加困难。此 "squash" 功能的效果如何取决于使用它的人的技能和知识。任何盲目使用它的人都是用错了,就像任何人在没有学习如何安全使用电动工具的情况下使用电动工具一样,即使他们不小心正确使用了它们也是如此。
考虑这段 git 历史。如果我检查第二个突出显示的提交(或它上面/更新的任何提交),那么它包含一个我可以在屏幕上看到的错误(错误的细节不太相关)。
如果我签出第三次提交(或它下面/更早的任何提交),那么我就不会再在屏幕上看到错误。
如您所见,第二个提交包含 0 个更改的文件,其中有 0 个添加和 0 个删除。
这两个提交之间的切换如何引入或删除我试图修复的错误!?我不知道在两次提交之间更改了哪些文件?
更新
上图并非严格真实,实际情况如下。我没有意识到 GIT 中会发生这种情况,如果有人可以解释如何在 "Ensure we always return an integer" 提交中重新引入 NO BUG,那就太好了!
我将评论以下文字的实际含义:
Showing 0 changed files with 0 additions and 0 deletions
这只是意味着底部(第二个)提交与之前的提交相比没有任何变化。因此,如果签出此提交解决了错误,这并不一定意味着该提交是引入更改以修复它的原因。相反,一些较早的提交是负责任的。对于图表,请考虑:
A -- B -- C
该错误是在提交 C
中引入的,但未出现在提交 A
中。由于提交 B
实际上是空操作,因此它也不存在错误。
你听说过git bisect吗?
执行并执行此命令后,将准确指出引入错误的提交。
简单地说,你首先执行命令并给它一个你知道没有错误的 "starting point"(一个提交 SHA),然后你给它一个 "ending point"(也是一个提交SHA) 你知道 DID 有错误,然后 git 将进行分而治之的过程,并会为你检查版本,在每次检查时,你测试并查看错误是否存在,然后你告诉 git(坏与好),git 将根据您的输入继续搜索。最后,它会显示引入错误的提交。
值得一试,而且操作简单(而且非常有趣)。
历史很少是一条直线
在您更新的图形图像中,您在顶部有较新的提交,在底部有较旧的提交。一切都被强制排成一条整齐的直线。但这是对现实的扭曲看法,就像 每个 观点都是扭曲的一样。 (如果需要,我们可以介绍爱因斯坦和相对论来证明这一点,但我们只是假设我们喜欢从我们现在坐/站的位置来看事物,而不是事物回到过去时的样子我们没有今天的观点。明天或明年我们会有另一个观点!)
让我们以不同的方式重绘这段历史,让事情变得更清晰。我们将把较旧的作品放在左边,较新的作品放在右边,然后平行画 ,像这样:
...--o--o---o
\
X--X--X <-- master
/
...--o---X--X <-- feature/buggy
^
|
bug introduced
其中 X
表示有错误的提交。请注意,在底行的第一个有问题的提交发生在顶行显示的一个好的提交之后,然后第二个有问题的提交与顶行的最后一个好的提交同时(甚至稍早) .该错误显然是在我标记的地方首次引入的。
现在,如果我们垂直绘制这个线性化的,顶部有较新的提交,我们得到:
.
.
.
X (still has bug introduced by merge)
X (bug first introduced by merge)
o (commit from the top row, not broken)
X (bug in feature/buggy - commit from the bottom row)
X (bug in feature/buggy)
o (commit from the top row, not broken)
.
.
.
在线性化视图中,有问题的提交被好的提交分开。在 "correct"(或至少 less-distorted)视图中,一次查看一个 "leg" 的历史记录,错误的提交都是连续的。
您在更新的图形中显示的实际视图有一个提交,其 日志消息 说 Merge remote-tracking branch 'AWS/...
(这被切断),但这不是合并提交(包含两个或更多parents 的提交)。这是由 git merge --squash
或在某些 Web 界面上单击标记为 "squash and merge" 的按钮进行的合并。这些提交是通过使用 Git 的 合并机制 进行的,但不记录正确的历史记录。1 所以在这种情况下,唯一我知道这是来自严酷的经验:我以前见过这种确切的问题。我在此处绘制的图表显示了如果合并是常规合并而不是挤压合并,情况会如何。
None 在这里很重要,但是您组织中的某个人可能应该花一些时间来了解 Git 如何在 fine-grained 级别工作,以便找到并以后更容易修复错误。
1这通常是故意的:想法是为了让未来的调查更容易而对历史撒谎,即使事实上它使以后的调查更加困难。此 "squash" 功能的效果如何取决于使用它的人的技能和知识。任何盲目使用它的人都是用错了,就像任何人在没有学习如何安全使用电动工具的情况下使用电动工具一样,即使他们不小心正确使用了它们也是如此。