我即将在一个现有项目中移动大量文件。 在这样做之前,我希望掌握一些用于分析具有多个文件历史记录的代码的技术。
如何使用Git来询问:“这行代码是从哪里来的?” 当内容在其生命周期中通过多个文件移动时?
我知道Git不会明确跟踪重命名(出于良好的原因),所以似乎应该能够提出此问题,只是不确定如何做到这一点。如果有可视化这种情况的方法,那也很好了解。
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是一种非常有用的历史挖掘工具。git blame
是用来询问“这行代码来自哪里?”的工具。我不确定它是否处理重命名。可能会。
git blame
不能告诉你特定代码片段来自哪里 - 这就是git log
的作用。git blame
只是告诉你文件中每一行代码最后一次被谁编辑过。2)git blame
不会跟随重命名,除非你添加了--follow
参数,如被接受的答案所示(即使这样,如果文件被合并、重组等,它也会失效)。 - Sean the Bean