首页 > 解决方案 > 在模块之间移动函数时保留 Git 提交消息的顺序

问题描述

我在我的项目的专用模块中组织了函数和类。我使用 PyCharm 在 Python 中编写代码。

我经常需要对项目中的模块进行重组。

使用 Git,将功能从一个模块移动到另一个模块时如何保留所有提交消息?显然它不会自动发生(参考 intellj)。


我想出了这个解决方法:

这不是很好,但比丢失整个提交历史要好。

任何建议表示赞赏。

标签: gitpycharmcommit

解决方案


在 Git 中保留提交历史这句话是无稽之谈。

原因是提交历史;历史不过是提交。你要么有提交,所以一切都被保留了,或者你没有,所以不是。

人们通常的意思是:我重命名了某个文件,现在找不到了。 这并不奇怪,因为每个 Git 提交只是所有文件的快照。提交A有文件README.txtstarter.pyZ最后提交有README.rstalldone.py。如果在此过程中某处重命名(也许还有修改),那么,找到README.rst它的唯一方法是让 Git 行走,一次提交一次,从背靠背到直到某个时间点——比如在和——比较两个提交的内容表明,哇,,in非常像in ,所以我们称它为 aZYXMNREADME.txtMREADME.rstN重命名并停止寻找README.rst并开始寻找README.txt。就是git log --follow这样。

如果您直接从Zto跳转A,则两个文件的内容可能相差太大而无法匹配。但就Git而言,这没关系:如果你问我如何编辑文件A以使它们看起来像 中的文件Z,Git 会说,删除并使用这些内容README.txt创建一个新README.rst文件,并且这些说明有效。他们不会告诉你想要你想知道,但就 Git 而言,它们已经足够好了。

当您将函数从一个文件移动到另一个文件时,git blameGit某些部分(包括. Git 的其他部分,包括直接区分早期提交和延迟提交,通常不能:当比较任何一对提交时,重命名的文件必须与原始文件足够相似,才能使/选项起作用。您可以调整重命名查找阈值:在没有任何阈值的情况下打开时,使用 50% 的相似度索引,即两次提交中大约一半的文件必须相同,以便 Git 调用重命名git blame-C--followgit log-M--find-renames-M手术。但是这个重命名检测还需要几个其他条件来满足。通常,将函数从一个现有文件移动到另一个现有文件会导致它失败。因为git diff您有时也可以使用-B(break-pairings 标志,它最多占用两个相似性指数值),但它的用处很快就消失了。


推荐阅读