我有以下场景:
- 删除了提交 1 中名为 src/GetData.cs 的文件。
- 在提交 5 中创建了一个名为 src/Get/GetDataNew.cs 的文件。
- 在提交 7 中将 2 中的文件重命名为 src/Get/GetData.cs。
1 和 3 中的文件几乎相同,只是做了一些微小的更改,但由于多次迭代,我最终创建了一个全新的文件并删除了旧文件。有没有办法在文件 3 中保留/移动文件 1 的 git 历史记录?
我能想到的一种方法是恢复到我删除旧文件的提交,然后使用
git mv src/GetData.cs src/Get/GetData.cs
将其移动到新文件夹,但中间有很多其他提交和更改,所以我想避免这种情况。
提前致谢。
Git 没有文件历史记录。没有什么可以保存或恢复的。
Git has commits并承诺are历史。就是这样——这就是你所拥有的一切。添加提交以添加更多历史记录。
现在,提交确实包含文件,您可以要求 Git 遍历提交历史记录,但是list只有一些specific提交,即那些按名称触及特定文件的提交。当您这样做时,您会立即遇到名称随时间变化的文件的问题。
这涉及到某些文件是“相同”文件的含义。这是一个哲学问题,这意味着它没有一个好的答案。 :-) 对于极端的例子,请考虑我祖父的斧头的悖论:我父亲更换了头部,我更换了手柄,但这就是我祖父的斧头 http://www.stephenhicks.org/2018/03/16/my-grandfathers-axe/;或者更一般地说,忒修斯之船 https://en.wikipedia.org/wiki/Ship_of_Theseus.
Git 的答案是:如果你添加--follow
to a git log
你告诉它的命令跳过(用于列出输出目的)任何不更改我命名的文件的提交, Git 会查看文件似乎所在的提交deleted,并查明在父提交中是否存在具有其他名称的文件足够相似的内容 to call它是“同一个文件”。 Git 会always如果内容在单个提交跃点上 100% 相同(这不是合并提交),则找到此文件(并且相当快)。在其他情况下,你要抓住机会。如果 Git 发现名称发生变化,Git 会继续执行git log
正在查找更改了一个文件的提交,但现在它正在查找更改了存储在曾用名.
Git 的另一个答案是:你为什么在乎?每个快照都完全保留整个状态。如果你检查提交 1 或提交 7,为什么你关心是否src/GetData.cs
是“相同”的文件src/Get/GetData.cs
?您将在快照中永久保留(或至少只要历史记录中存在提交)具有正确名称的正确文件内容。
(有时有理由关心,与操作系统文件标识的概念。 Git 不关心这些。)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)