是否可以执行大规模重构,包括移动和重命名许多目录而不会丢失Git更改跟踪?
答案 0 :(得分:6)
git可以很好地处理移动/重命名目录,但要跟踪这些重命名的更改,您可能需要为您正在使用的任何命令添加一些额外的参数,或者设置几个配置选项。
这样做的原因是git只是在每次提交时存储树的状态,而不是为了从一个状态移动到另一个状态而发生的更改。如果你的源代码树中有很多文件,那么你可能需要告诉git积极尝试查找任何重命名。同样,如果您对特定文件感兴趣,则需要明确告诉git以搜索过去可能的重命名。
举一个后者的例子,典型案例是使用git log -- filename
来检查特定文件的历史记录。为了告诉git在任何可能发生的重命名之前也查找它的历史记录,你必须这样做:
git log --follow -- filename
作为另一个示例,如果树中有许多文件,git log --stat
的有用输出可能不包括所有重命名或副本,因为它需要检查所有文件对才能执行此操作。要在使用git log
和git diff
时强制git检测副本并重命名,您可以将配置选项diff.renameLimit
设置为至少树中的文件数,并设置config选项{{ 1}}到diff.renames
- 这意味着检测副本和重命名。
或者,如果您不想将这些设置为配置选项,则可以使用copies
或-M
选项-C
或git log
。这些在JakubNarębski对这个问题的回答中有更详细的描述: