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

cle*_*ssi 6 git git-log

我有以下场景:

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

1 和 3 中的文件几乎相同,只是做了一些微小的更改,但由于多次迭代,我最终创建了一个全新的文件并删除了旧文件。有没有办法在文件 3 中保留/移动文件 1 的 git 历史记录?

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

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

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

提前致谢。

tor*_*rek 7

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

\n\n

Git 有提交,并且提交已成为历史。这就是\xe2\x80\x94,这就是你所拥有的一切。添加提交以添加更多历史记录。

\n\n

现在,提交确实包含文件,您可以要求 Git 遍历提交历史记录,但仅列出一些特定的提交,即按名称触及特定文件的提交。当您这样做时,您会立即遇到名称随时间变化的文件的问题。

\n\n

这涉及到某些文件是“相同”文件的含义。这是一个哲学问题,这意味着它没有一个好的答案。:-) 对于这方面的极端例子,请考虑我祖父的斧头的悖论:我父亲更换了头部,我更换了手柄,但这是我祖父的斧头;或者更一般地说,忒修斯之船

\n\n

Git 的答案是:如果您添加--follow到一个git log命令,其中您告诉它跳过(用于列出输出目的)任何不更改我命名的文件的提交,Git 将查看该文件似乎已存在的提交删除,并查明在父提交中是否存在具有其他名称的文件,该文件具有足够相似的内容,可以将其称为“同一文件”。如果内容在单个提交跃点(不是合并提交)中 100% 相同,Git 将始终(并且很快)找到该文件。在其他情况下,你要抓住机会。如果 Git 发现名称已更改,Git 会继续查找git log更改了一个文件的提交,但现在它正在查找更改了存储在先前名称下的文件的提交。

\n\n

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

\n\n

(有时需要关心,与操作系统的文件身份概念有关。Git 不关心这些。)

\n