我有以下情况:
1和3中的文件几乎相同,只是做了些微的更改,但是由于多次迭代,我最终创建了一个全新的文件并删除了旧文件。有什么办法可以在文件3中保存/移动文件1的git历史记录?
我能想到的一种方法是还原到删除旧文件然后使用
的提交。git mv src / GetData.cs src / Get / GetData.cs
将其移动到新文件夹,但是之间还有很多其他提交和更改,因此我想避免这种情况。
先谢谢了。
答案 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.cs
与src/Get/GetData.cs
是否是“相同”文件?在快照中永久保存(或至少只要提交存在于历史记录中)的正确名称下,您将拥有正确的文件内容。
(有时有一些需要照顾的原因,这与操作系统的文件标识概念有关。Git并不关心这些。)