Git - 将文件标记为新文件而不是移动/复制

时间:2017-03-09 16:22:42

标签: git atlassian-sourcetree

有没有办法强制git将文件视为新文件而不是移动/复制?

3 个答案:

答案 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.jsHelper.js提取一小堂课,
    • 用两行和导出的符号创建一个新的index.js文件,
    • 如果您在第一次提交中修改了导入,请在第二次提交中再次修改它们。

使用选项2时,某些git命令(例如git rebasegit log --follow)将检测回购记录的历史记录中的重命名步骤,因为它们始终检查历史记录中一次提交的历史记录。时间。

其他一些命令(不是每个提交差异的提交,而是“全局”差异)仍将作为选项1。

例如:如果您打开一个合并请求(请考虑githubgitlabAzure 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"而不是"移动",可能最好的选择是删除文件并将其添加到分开提交的新位置。