我有以下场景:
在提交1中删除了一个名为src/getdata.cs的文件。
在commit 5中创建了一个名为src/get/getdatanew.cs的文件。
在提交7中将2中的文件重命名为src/get/getdata.cs。
1和3中的文件几乎相同,只是做了一些小改动,但是由于多次迭代,我最终创建了一个全新的文件并删除了旧文件。有没有办法保存/移动文件3中文件1的git历史记录?
我可以想到的一种方法是返回到commit,在这里我删除了旧文件,然后使用
git mv src/getdata.cs src/get/getdata.cs
将其移动到新文件夹,但其间有许多其他提交和更改,因此我希望避免这种情况。
提前谢谢。
最佳答案
Git没有文件历史记录。没有任何东西可以保存或恢复。
git有提交,提交是历史。就这样你就只有这些了。添加提交以添加更多历史记录。
现在,提交确实包含文件,您可以要求git遍历提交历史,但只列出一些特定的提交,即按名称接触特定文件的提交。当您这样做时,您会立即遇到一个文件的问题,这些文件的名称随着时间的推移而改变。
这就进入了某些文件是“相同”文件的含义。这是一个哲学问题,这意味着它没有一个好的答案。:-)对于这方面的极端例子,请考虑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
查找更改了一个文件的提交,但现在它正在查找更改了以以前的名称存储的文件的提交。
吉特的另一个回答是:你为什么在乎?每个快照完全保留整个状态。如果您签出commit 1或commit 7,为什么要关心src/GetData.cs
与src/Get/GetData.cs
是否“相同”文件?您将在正确的名称下拥有正确的文件内容,并在快照中永久保存(或至少在历史记录中存在的长度)。
(有时需要注意的是,这与操作系统的文件标识概念有关。吉特不在乎这些。)
关于git - 删除并在另一个文件夹中重新创建后,保留文件的Git历史记录,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/51660660/