3

我有一个包含很多行的文件,并希望通过将其拆分为多个文件来重构它。git blame通过简单地复制/粘贴,我将在ing时丢失已提交行及其作者的历史记录。有没有办法复制/粘贴这些行并保留他们的作者?

4

1 回答 1

3

Git 不会记录特定代码行的作者(或提交者)。

Git 所做的——它所做的一切——是记录一个完整的快照,并与一组元数据配对:作者姓名/电子邮件/日期、提交者姓名/电子邮件/日期、父提交。

各种工具,例如git loggit showgit diffgit annotate(或git blame),以各种方式使用记录的数据。特别git blame是代码会将每个提交与其父级进行比较。如果在此特定提交中添加或更改了某些行,它会将提交的作者分配给整行并报告结果。

这意味着很容易让该工具将某些特定的更改行集分配给某个特定的作者:将该名称设置为作者进行提交。

这也意味着很容易意外地更改文件的每一行(例如,通过将行终止符从 LF-only 更改为 CRLF 或反之亦然)并“获取作者身份”该文件的每一行。但这一切意味着,当您使用 时git blame,您需要知道如何使用该工具:您需要了解它的局限性。

有些人——我包括我自己在内——会争辩说,如果为了重构而移动代码,你应该“拥有”被移动的行。原作者可能已经编写了原始代码,但不是以那种形式。例如,该行在for i in expr两个不同的函数和/或文件中意味着非常不同的东西。如果您移动了足够大的块,则代码可能会保留其“真正含义”,并且……也许不会。Git 会将原行的原作者保留在原处,任何理解的人git blame都不会只看新的重构代码,而是继续沿着代码回溯历史以找到它的原作者,预重构。

尽管如此,如果您想拆分“作者”和“提交者”,Git 为您提供了一种(每次提交)方式来做到这一点。

于 2017-08-22T14:39:51.860 回答