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

时间:2018-08-02 19:11:37

标签: git git-log

我有以下情况:

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

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

我能想到的一种方法是还原到删除旧文件然后使用

的提交。
  

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

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

先谢谢了。

1 个答案:

答案 0 :(得分:3)

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

Git具有 commits 并提交 are 历史。就是这样,这就是您所拥有的。添加提交以添加更多历史记录。

现在,提交包含文件确实是事实,您可以要求Git遍历提交历史,但是 list 仅包含某些特定提交,即那些涉及特定提交的提交按名称归档。当您这样做时,您会立即遇到文件名称随时间变化的问题。

对于某些文件来说,“成为同一文件”意味着什么。这是一个哲学问题,这意味着它没有一个好的答案。 :-)有关极端示例,请考虑the paradox of my grandfather's axe: my father replaced the head and I replaced the handle, but this is my grandfather's axe;或更普遍的the Ship of Theseus

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

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

(有时有一些需要照顾的原因,这与操作系统的文件标识概念有关。Git并不关心这些。)