1

我最近了解到git blame它的作用。我想知道 git 如何在文件中的每一行发生更改时找到它,即使是跨文件重命名也是如此。换句话说,我想知道责备算法是如何工作的。

4

1 回答 1

2

首先,该blame特性几乎存在于所有其他 SCM 中,包括 CVS。因此,使用的算法将根据您使用的工具而有所不同。

然而,基本上,实现这一点的最简单方法是从文件的最新状态开始,然后向后(朝向过去)浏览历史记录并应用每个变更集的负数。

每个受影响的行都被标记为属于最后一次提交,所有其他行都属于前一个。除此之外,您将计算后面这些行的数量。然后使用提交 n-1 和 n-2 重新启动此过程。如果行不明确属于“n-1”,它们将被忽略,因为这意味着它们已被最近的提交更改(实际上,仍将应用反向变更集,但不会更新提交编号)。否则,您应用相同的计算,更新每行所属的提交号。

然后,您只需要一直迭代直到初始提交(如果需要),但是如果您达到上面引用的“行数”达到零的状态,您知道您可以在这里停止,因为这意味着所有行都有自文件的原始状态以来已更改,无需再进一步。

于 2021-05-07T11:15:43.923 回答