是否可以在git commit上手动修改move / new / edit映射?

时间:2018-06-21 10:40:18

标签: git git-rewrite-history

我已经阅读了有关如何使git实现具体行动的其他问题(123),但他们并没有回答我的真正疑问:可以在提交时,提交之前或之后(更改提交内部数据)手动处理git move理解。我愿意接受标准答案,甚至可以破解git存储库文件。

我非常重视这一点,因为在最近使用任何软件查看文件版本时,让git知道文件已被移动,编辑,替换等非常重要,因为该软件将能够相应地显示文件版本号。无论哪个文件移动或重命名开发人员。我认为这是提交者应该正确设置的重要信息,因为这样可以节省提交 不仅是FS操作,还包括开发人员的逻辑意图,项目编辑的真正含义。

使用案例:

情况1:

  • 将文件main_configuration.txt移至configurations/production/configuration.txt
  • 创建main_configuration.txt,向上一个添加类似的内容,但更改几行

git知道您在configuration.txt上编辑了几行,并添加了一个新文件configurations/production/configuration.txt。但我不想放松对生产配置文件的编辑。它不是在该提交上创建的新文件:(

情况2:

  • 删除文件a/a.txt
  • 创建具有类似内容的文件b/a.txt

git理解文件移动,但是我确实需要git历史记录来正确解释a/a.txt在此提交中已被删除,并且我需要保留已在其中创建b/a.txt的数据承诺。这是非常重要的信息,而git告诉的最终信息是一个严重错误,可能会导致分析结果。

有很多示例,而其他示例则更加具体化,但我试图使它们尽可能简单。

1 个答案:

答案 0 :(得分:1)

我想将其作为How does git handle moving files in the file system?的副本来关闭,但是您已经在问题中引用了它。我认为从评论中您已经找到了答案,但是让我们正式地提出一个答案:

  • Git存储快照。差异(差异)不会以Git实际处理文件的级别输入图片。 (它们确实出现在打包文件内的该级别“之下”,如Lasse Vågsæther Karlsen notes in a comment。值得一提的是,这些使用xdelta的修改的增量不是逐行的;它们是重新逐字节范围。所以这些不是 Git向您显示的内容!)

  • Git 存储程序员的意图。 Git只是存储每个文件的快照。它必须在git diffgit show时尝试像您所说的那样重建开发人员的逻辑意图

  • 因此,如您所得出的结论, Git能够在log命令中显示的移动信息...不会存储在提交中,而是在显示时进行计算。

    >

您应该将git diff(以及git log -p)输出作为对计算机或人的指令输出,说明如何更改左侧的文件以使其与右边的文件。更改实际上的发生方式无关紧要;如果您希望它再次发生,Git只会尝试提出最少的说明来使它再次发生。即使您将存储库中的第一个提交与最后一个提交进行比较也是如此:Git跳过所有中间提交,提取第一个和最后一个快照,并计算一个将您从第一个提交到另一个的更改集。最后。


最后的结论是,为了正确记录开发人员的意图并允许以后基于软件的文件编辑历史记录,可以将那些战略性的,可能是误解性的更改划分为多​​个提交,因此可以明确进行复制,编辑,移动或删除操作并且不能被两个动作重叠而隐藏。最终,开发人员有能力组织有据可查,易于理解,自我解释和高质量提交的更改。