0

该站点上有很多关于git mv跨名称边界检索文件的行为以及如何检索历史记录的问题。我知道 Git 实际上并没有记录文件的移动/重命名,但我并不完全理解手动这样做的问题所在。

假设我想重命名一个文件,并且我关心保持它的历史。如果我的工作流程类似于

git mv file.txt new_file.txt
<make substantial changes to new_file.txt>
git add new_file.txt
git commit -m "rename and change"

那么历史就会被打破。的输出git log --follow -- new_file.txt将只是最近的“重命名和更改”提交。

但是,如果我改为使用类似的工作流程

git mv file.txt new_file.txt
git commit -m "rename"
<make substantial changes to new_file.txt>
git add new_file.txt
git commit -m "change"

那么看来我已经避免了休息。现在,相同日志命令的输出为我提供了“更改”、“重命名”以及file.txt之前涉及的任何提交。

我意识到如果文件没有被大量编辑,那是多余的,因为在这种情况下,Git 会自行推断重命名。但就实际令人讨厌的问题而言,我能想到的最有可能的是某种合并冲突,而且我还没有找到比常规方式更糟糕的情况。

我的问题是:我错过了什么吗?像这样进行明确的“重命名”提交是否存在危险?

4

1 回答 1

0

这样做不会让事情变得更糟。目前,也没有什么比这更好的了,但是如果我能解决它,并且如果我对 Git 的更改被接受,这实际上可能会在将来git merge的某些情况下(可能带有标志参数)更好地工作。git merge有一天,也许。

(具体来说,git merge目前只git diff <base> <tip>针对这两个技巧中的每一个,而不查看它们之间的任何提交。在我看来,如果它对重命名文件的提交运行快速祖先路径扫描并组装所有这些重命名用于最终的 base-to-tip 差异。为了使扫描速度可以接受,它只需要检查精确重命名,而不是近似重命名;因此添加一个执行 rename-but-nothing-else 的提交将启用此功能额外的合并通道,如果它被添加,在更大的代码更改中找到重命名。)

(不清楚这是否增加了很多(如果有的话)价值,因为在 Git 无法检测到重命名的大间隙中重命名可能对完成合并没有任何价值。)

于 2018-02-19T22:07:24.600 回答