如何将代码重构为新文件并保留GIT历史记录? [英] How do I refactor my code to a new file and preserve git history?
本文介绍了如何将代码重构为新文件并保留GIT历史记录?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
因此,我希望将大文件的一部分提取到新文件中,并保留git历史记录,这样我就可以运行git blame
并像重构之前一样查看更改。
推荐答案
在Git中,历史是提交。没有文件历史记录。这与大多数其他版本控制系统不同:跟踪"文件标识"的那些其他VCS需要您通知它们新文件path/to/new.ext
派生自path/to/existing.ext
,以便它们可以将新文件的历史记录与旧文件的历史记录相关联。类似地,他们需要您通知他们有关文件重命名的信息-尽管有些,如ClearCase,可以通过简单地充当工作树的文件系统来自动检测重命名。Git不需要任何这些,因为它不是以这种方式工作的。%1
a
)与另一个(b
)进行比较时,Git会尝试(在比较时动态地)发现某个文件a/path/to/name
是否与另一个文件b/some/other/path/to/anothername
"相同"。比较程度和判定这些是相同文件还是不同文件的算法取决于Git命令。git diff
命令从查看实际路径名开始:如果它们相同,则文件相同,2否则,它们可能不同。"可能"部分是重命名检测的用武之地,如果您已经启用它的话。常规git diff
还具有-C
和--find-copies-harder
来启用"文件复制自"检测。使用-C
两次(或--find-copies-harder
)将设置为查找要从a
提交中的任何文件复制的新文件(这被认为成本太高,无法自动执行;通常情况下,只有被认为"已修改"的文件才会被视为副本源候选文件)。
git blame
命令略有不同(a
和b
提交只是自动成为每个提交的父级和子级),但它仍然有-C
选项。它的-C
工作方式略有不同:一个-C
查找-C
从a
和b
之间修改的文件中复制的行。使用-C
两次查找从COMMITa
中的任何文件复制的此类行,并使用三个-C
标志,它将"更难找到副本":它将查看每次COMMIT中的每个文件,以查找复制的代码。
因此,在大多数情况下,您只能在git blame
上使用一个-C
。如果复制的代码来自未修改的文件,则应使用-C -C
。如果您认为某些代码在很多转之前就被删除了,然后又复活了,并且您想要找到原始源代码,那么可以使用三个-C
。请注意,git blame
的-C
选项启用git blame
的-M
选项,该选项检测移动的代码(因此与git diff
的-M
选项-文件重命名检测完全不同,git log --follow
、3始终处于启用状态)。
1与其他VCS相比,这是Git的一个很好的优势,因为Git可以检测人类忘记的情况,还可以在比较"相距很远"的版本时检测重命名。这对Git来说是一个可怕的缺点,因为它必须检测案例,即使人类不会忘记,因此也会错过重命名。这对Git来说是一个很大的优势,因为未来更智能的算法会以更好的方式利用现有的数据。简而言之,为什么它更好,为什么它更糟,这是有争议的,但最终只是不同。
2对于git diff
,您可以使用其-B
选项有条件地分离这些自动配对的"同名表示相同文件"配对。这对git blame
不可用,但对于不进行这种配对的git blame
是不必要的。
3由git log
中的--follow
启用的代码是一个可怕的黑客攻击,基本上只适用于git blame
所需的一种情况。请勿尝试将--follow
与逆序git log
一起使用。
这篇关于如何将代码重构为新文件并保留GIT历史记录?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文