Git:如何分析具有多文件历史记录的代码?
Posted
技术标签:
【中文标题】Git:如何分析具有多文件历史记录的代码?【英文标题】:Git: how to analyze code that has a multi-file history? 【发布时间】:2011-01-06 23:28:32 【问题描述】:我即将在现有项目中移动大量文件。在此之前,我想牢牢掌握一些用于分析具有多文件历史记录的代码的技术。
如何使用 git 来询问:“这行代码是从哪里来的?”内容在其生命周期内何时在多个文件中移动?
我知道 git 没有明确地跟踪重命名(有充分的理由)所以看起来我应该能够问这个,我只是不确定如何。如果有方法可以将其可视化,那也太好了。
【问题讨论】:
【参考方案1】:我建议查看 git 工具箱中的三个工具。第一个是责备,和 cvs 中的非常相似。它向您显示最后一次提交文件中的每一行。如果您想查看之前的内容,您可以获取触及该行的提交并查看之前的提交。
git show <sha1_of_interesting_commit>^ -- file/path
你可以重复指责,看看之前发生了什么。
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 是一个非常有用的历史挖掘工具。
【讨论】:
【参考方案2】:git blame
是你用来问“这行代码从哪里来的?”。我不知道它是否处理重命名。可能会。
【讨论】:
git blame 不利于检测行移动(尤其是在重构代码时)。我的意思是,如果一个开发人员写了这行代码,那么下一个开发人员出于某种原因向上或向下移动了该行 - git blame 将显示后者。 我认为这个答案没有帮助,因为 1)git blame
不会告诉您任何特定代码的来源——这就是 git log
的用途。 git blame
只是告诉您最后一个编辑文件中每个现有代码行的人。 2) git blame
不跟随重命名,除非您添加 --follow
参数,如接受的答案所示(即使这样,如果文件被合并、重组等,它也会崩溃)。以上是关于Git:如何分析具有多文件历史记录的代码?的主要内容,如果未能解决你的问题,请参考以下文章