有没有办法强制git将文件视为新文件而不是移动/复制?
答案 0 :(得分:8)
简短的回答是:否,git
不允许您存储有关文件移动方式的信息。
git
跟踪内容,而不跟踪 diff 。
git
显示信息时:
$ git diff --name-status HEAD^ HEAD
M fileA # fileA has been modified
R oldB -> fileB # fileB has been renamed
A fileC # fileC has been created
通过比较两个提交的内容,它实际上已经计算了此信息。它尚未存储以下信息:“实际上是从fileA复制了fileC,并且将fileA重新创建为新文件。”
如果两个文件在两次提交中都具有相同的名称,则git diff
将始终计算“此文件已被修改”。
选项1:保留您的历史记录,并继续使用它。
选项2:您可以尝试在两次提交中完成
创建第一个提交,唯一的操作是将文件index.js
重命名为MyLib.js
,
MyLib.js
而不是index.js
创建第二个提交,在其中应用您实际想要查看的修改
MyLib.js
到Helper.js
提取一小堂课,index.js
文件,使用选项2时,某些git
命令(例如git rebase
或git log --follow
)将检测回购记录的历史记录中的重命名步骤,因为它们始终检查历史记录中一次提交的历史记录。时间。
其他一些命令(不是每个提交差异的提交,而是“全局”差异)仍将作为选项1。
例如:如果您打开一个合并请求(请考虑github
,gitlab
,Azure Devops
...),则“合并请求”界面仍会向您显示:
index.js
已被修改MyLib.js
是一个全新文件答案 1 :(得分:1)
我假设您使用git mv
移动该文件,这就是Git将其报告为已被移动的原因。像这样:
git mv file.txt newfolder
但是Git不知道它看不到的东西,所以如果你从文件系统中移动文件,Git会把新位置的文件视为新文件:
mv file.txt newfolder
您可以git add
此文件将其添加到索引中。在此之后,您可以选择从Git中删除原始文件:
git add newfolder/file.txt
git rm file.txt
请记住,这意味着Git无法使用此方法跟踪此文件的历史记录。虽然使用git mv
也会使跟踪移动文件的历史记录变得困难,但至少可以使它成为可能。
答案 2 :(得分:0)
Git非常聪明地确定移动文件的时间(如果删除文件并将其添加到同一提交中的新位置,Git会发现该文件已被移动)。
如果您确实希望将该文件视为" new"而不是"移动",可能最好的选择是删除文件并将其添加到分开提交的新位置。