gpt4 book ai didi

git - Git 可以跟踪单个函数从一个文件到另一个文件的移动吗?如何?

转载 作者:IT王子 更新时间:2023-10-29 00:37:00 26 4
gpt4 key购买 nike

有好几次,我听到这样的说法:如果将单个函数从一个文件移动到另一个文件,Git 可以跟踪它。例如,this entry说,“Linus 说如果你将一个函数从一个文件移动到另一个文件,Git 会告诉你移动过程中那个函数的历史。”

但是我对 Git 的一些底层设计有一点了解,但我不明白这是怎么可能的。所以我想知道……这是一个正确的陈述吗?如果是这样,这怎么可能?

我的理解是 Git 将每个文件的内容存储为一个 Blob,并且每个 Blob 都有一个全局唯一标识,该标识来自其内容和大小的 SHA 哈希。 Git 然后将文件夹表示为树。任何文件名信息都属于树,而不属于 Blob,因此文件重命名例如显示为对树的更改,而不是对 Blob 的更改。

因此,如果我有一个名为“foo”的文件,其中包含 20 个函数,还有一个名为“bar”的文件,其中包含 5 个函数,我将其中一个函数从 foo 移动到 bar(结果为 19 和 6,分别),Git 如何检测到我将该函数从一个文件移动到另一个文件?

根据我的理解,这将导致存在 2 个新的 blob(一个用于修改后的 foo,一个用于修改后的 bar)。我意识到可以计算出一个差异来表明该函数已从一个文件移动到另一个文件。但我看不出函数的历史记录如何可能与 bar 而不是 foo 相关联(无论如何不是自动的)。

如果 Git 实际上要查看单个文件的内部,并计算每个函数的 blob(这将是疯狂的/不可行的,因为你必须知道如何解析任何可能的语言),然后我就能看到这是怎么可能的。

那么……这个说法对不对?如果它是正确的,那么我的理解中缺少什么?

最佳答案

此功能通过 git blame -C <file> 提供.

-C option 驱动 git 尝试在正在审查的文件中添加或删除文本 block 与在相同变更集中修改的文件之间找到匹配项。附加-C -C , 或 -C -C -C扩展搜索。

使用 git blame -C 在测试库中亲自尝试你会看到你刚刚移动的代码块起源于它所属的原始文件。

来自 git help blame 手册页:

The origin of lines is automatically followed across whole-file renames (currently there is no option to turn the rename-following off). To follow lines moved from one file to another, or to follow lines that were copied and pasted from another file, etc., see the -C and -M options.

关于git - Git 可以跟踪单个函数从一个文件到另一个文件的移动吗?如何?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4908336/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com