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

标签 git

有什么方法可以强制 git 将文件视为新文件而不是移动/复制?

用例:

  • 我有一个大文件,index.js
  • 我正在从该文件中提取一个小类到 Helper.js (仅 index.js 的 10%)和重命名 index.jsMyLib.js . MyLib.js将有一些与从 Helper.js 导入符号相关的小改动.
  • 我需要重新创建 index.js作为一个新的 2 行文件,仅从 Helper.js 重新导出符号和 MyLib.js .

  • 我希望提交历史记录重命名 index.jsMyLib.js并处理 2 行 index.js作为新的,但 git 将 MyLib.js作为全新的,index.js因为丢失了 99% 的内容,只剩下那 2 行。

    最佳答案

    简短的回答是:不,git不允许您存储有关文件移动方式的信息。
    git跟踪内容,而不是差异。

    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
    

    它实际上是通过比较两个提交的内容来计算这些信息的。它没有存储信息:“实际上 fileC 是从 fileA 复制的,而 fileA 是作为新文件重新创建的”。

    如果两个文件在两个提交中具有相同的名称,git diff将始终计算“此文件已被修改”。

    选项1:保留您拥有的历史,并接受它。

    选项 2:您可以尝试在两次提交中进行
  • 创建第一个提交,其中唯一的操作是重命名文件 index.jsMyLib.js ,
  • 如果您需要代码“工作”——例如,以便可以在此提交上运行单元测试或集成测试——更新其他模块以便它们导入 MyLib.js而不是 index.js
  • 创建第二个提交,在其中应用您实际想要查看的修改
  • MyLib.js 中提取一个小类至Helper.js ,
  • 新建index.js包含两行和导出符号的文件,
  • 如果您在第一次提交中修改了导入,请在第二次提交中再次修改它们。


  • 使用选项 2,一些 git命令(例如 git rebasegit log --follow)会检测 repo 历史记录中的重命名步骤,因为它们总是一次检查一个提交的历史记录。

    其他一些不查看每个提交差异但查看“全局”差异的命令仍将表现为选项 1。

    例如:如果您打开一个 merge 请求(想想 githubgitlabAzure Devops ...), merge 请求界面仍会为您呈现:
  • 文件 index.js已修改,
  • 文件 MyLib.js是一个全新的文件
  • 关于Git - 将文件标记为新文件而不是移动/复制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42700418/

    相关文章:

    来自 Visual Studio 的 git clone(使用 Git 源代码管理提供程序)

    java - 禁用 Maven 内部版本号插件

    eclipse - 如何为新的 eclipse (neon) java 项目初始化 git

    android - 将闭源 aar maven repo 部署到 github

    git - 如何更改使用 --bare 克隆的 git 存储库以匹配使用 --mirror 克隆的存储库?

    GitHub,推送错误: the remote end hung up unexpectedly

    Git 撤消 merge 尝试

    c++ - git merge 没有冲突就代表一切正常吗?

    git - 查看 Visual Studio Git 提交时,如何打开文件的本地副本?

    git - Visual Studio 2013 RC 和源代码控制