Git:如何分析具有多文件历史记录的代码?

7

我即将在一个现有项目中移动大量文件。 在这样做之前,我希望掌握一些用于分析具有多个文件历史记录的代码的技术。

如何使用Git来询问:“这行代码是从哪里来的?” 当内容在其生命周期中通过多个文件移动时?

我知道Git不会明确跟踪重命名(出于良好的原因),所以似乎应该能够提出此问题,只是不确定如何做到这一点。如果有可视化这种情况的方法,那也很好了解。

2个回答

5
我建议您查看git工具箱中的三个工具。第一个是blame,它与cvs中的相似度非常高。它可以显示文件中每一行最后一次被修改的提交记录。如果您想查看之前的内容,可以选择该行被修改的提交记录并查看前一个提交记录。
git show <sha1_of_interesting_commit>^ -- file/path

您可以重复执行“blame”命令以查看之前发生的情况。
git blame <sha1_of_interesting_commit>^ -- file/path

第二个工具是使用--follow来追踪文件的重命名。
git log --follow -- file/path

第三个,也可能是最有用的工具,是日志中的鹤嘴锄选项。它会搜索历史记录,查找包含给定文本的已删除、引入或更改行的更改。这对于跟踪诸如函数名称之类的事物非常有用。它可能是在特定提交的文件中新添加的,但它是否来自不同的源文件?是在同时添加了调用它,还是在移动之前添加的?

git log -S"Interesting_Function"

如果您使用补丁或状态选项(例如-p--stat),则输出将仅限于那些实际涉及搜索字符串的更改文件,除非您还使用--pickaxe-all,其中将显示整个更改。
git grep结合使用以显示字符串的所有当前出现位置,pickaxe是一种非常有用的历史挖掘工具。

0

git blame 是用来询问“这行代码来自哪里?”的工具。我不确定它是否处理重命名。可能会。


1
git blame 不适合检测行移动(特别是在重构代码时)。我的意思是,如果一个开发人员编写了该行代码,然后另一个开发人员由于某种原因将该行代码上移或下移 - git blame 将显示后者。 - Eimantas
我认为这个答案并不是很有帮助,因为:1)git blame不能告诉你特定代码片段来自哪里 - 这就是git log的作用。git blame只是告诉你文件中每一行代码最后一次被谁编辑过。2)git blame不会跟随重命名,除非你添加了--follow参数,如被接受的答案所示(即使这样,如果文件被合并、重组等,它也会失效)。 - Sean the Bean

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接