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:如何分析具有多文件历史记录的代码?的主要内容,如果未能解决你的问题,请参考以下文章

如何从 git 历史记录中的文件中替换文本?

如何从 Git 历史记录中永久删除提交?

如何在 Git 历史记录中 grep(搜索)已提交的代码

如何在 Git 中查看文件历史记录?

如何删除 Git 仓库中的历史提交记录

从GIT历史记录中删除文件