在另一个文件夹中删除并重新创建后保留 Git 文件历史记录

Preserve Git history of file after deleting and recreating in another folder

我有以下情况:

  1. 删除了提交 1 中名为 src/GetData.cs 的文件。
  2. 在提交 5 中创建了一个名为 src/Get/GetDataNew.cs 的文件。
  3. 在提交 7 中将 2 中的文件重命名为 src/Get/GetData.cs。

1 和 3 中的文件几乎相同,只有细微的变化,但由于多次迭代,我最终创建了一个全新的文件并删除了旧文件。有没有办法preserve/move git文件3中文件1的历史记录?

我能想到的一种方法是恢复到我删除旧文件的提交,然后使用

git mv src/GetData.cs src/Get/GetData.cs

将其移动到新文件夹,但中间还有很多其他提交和更改,所以我想避免这种情况。

提前致谢。

Git 没有文件历史记录。没有什么可以保留或恢复的。

Git 有 提交 并提交 历史记录。就是这样——这就是你所拥有的。添加提交以添加更多历史记录。

现在,提交确实包含文件,您可以要求 Git 遍历提交历史,但 list 只有一些 specific 提交,即那些按名称接触特定文件的提交。当您这样做时,您会立即 运行 遇到文件名称随时间变化的问题。

这涉及到某些文件成为 "the same" 文件的含义。这是一个哲学问题,这意味着它没有很好的答案。 :-) 对于这方面的极端例子,请考虑 the paradox of my grandfather's axe: my father replaced the head and I replaced the handle, but this is my grandfather's axe; or more generally, the Ship of Theseus.

Git 的答案是:如果您将 --follow 添加到您告诉​​它的 git log 命令中 skip (用于输出列表)任何不更改我命名为 、Git 的文件的提交都会查看文件似乎已被 删除 的提交,并找出是否在在父提交中,有一个具有其他名称的文件具有 足够相似的内容 调用 "the same file"。如果内容 100% 相同,Git 将 总是 找到此文件(并且很快),跨单个提交跃点,这不是合并提交。在其他情况下,你会抓住机会。如果 Git 发现名称已更改,Git 将继续执行 git log 查找更改一个文件的提交,但现在它正在查找更改存储在 [=30 下的文件的提交=]曾用名.

Git的另一个答案是:你为什么关心?每个快照都完整地保留了整个状态。如果您检查提交 1 或提交 7,您为什么关心 src/GetData.cs 是否是 "the same" 文件作为 src/Get/GetData.cs?您将在快照中永久保存正确名称下的正确文件内容(或至少只要提交存在于历史记录中)。

(有时有理由关心,与 操作系统的 文件标识概念有关。Git 不关心这些。)