在模块之间移动函数时,保留Git提交消息的顺序
我为我的项目组织了专门模块中的函数和类。我使用PyCharm在Python中编写代码 我经常需要对项目中的模块进行重组 使用Git,如何在将函数从一个模块移动到另一个模块时保留所有提交消息?显然,这不是自动发生的()在模块之间移动函数时,保留Git提交消息的顺序,git,pycharm,commit,Git,Pycharm,Commit,我为我的项目组织了专门模块中的函数和类。我使用PyCharm在Python中编写代码 我经常需要对项目中的模块进行重组 使用Git,如何在将函数从一个模块移动到另一个模块时保留所有提交消息?显然,这不是自动发生的() 我想出了一个解决办法: 由于我可以看到模块内单个功能的历史记录(我在终端中发出以下命令: git log -L :myfunction:path/to/myfile.py --follow path/to/myfile.py >> myfunction_commit
我想出了一个解决办法:
- 由于我可以看到模块内单个功能的历史记录(我在终端中发出以下命令:
git log -L :myfunction:path/to/myfile.py --follow path/to/myfile.py >> myfunction_commit_history.txt
- 我将myfunction移动到我的新文件(使用PyCharm GUI,但如果通过命令行移动它,同样适用)
- 我从myfunction_commit_history文件复制提交历史记录
a
有文件README.txt
和starter.py
,最后提交Z
有README.rst
和alldone.py
.IfREADME.rst
是一个重命名(也可能是修改)在这条路上的某个地方,唯一能找到它的方法是Git走,一次提交一次,从Z
返回到Y
返回到X
,直到在某个时刻,比如说在M
和N
之间-比较两次提交的内容表明,M
中的README.txt
wful很像N
中的README.rst
,所以让我们称之为重命名,停止查找README.rst
,转而开始查找README.txt
。这就是git log——follow
的作用
如果你直接从Z
跳到A
,两个文件的内容可能相差太大,无法匹配。但这对Git来说没关系:如果你问我如何编辑A
中的文件,使它们看起来像Z
中的文件,Git会说,删除README.txt
,然后创建一个新的README.rst
包含这些内容,并且这些指令有效。它们不会告诉您想要知道什么,但就Git而言,它们已经足够好了
当您将函数从一个文件移动到另一个文件时,Git的某些部分,包括
Git-gull
,可以逐个提交比较,搜索早期提交中的所有文件,并找到它(对于Git-gull
,您需要-C
选项,而对于Git-log
则需要-follow
选项)。Git的其他部分,包括直接区分早期提交和延迟提交,通常不能:在比较任何一对提交时,重命名的文件必须与原始文件足够相似,才能使用-M
/--find renames
选项。打开时,可以调整重命名查找阈值:-M
在没有任何阈值的情况下,使用50%的相似性索引,即Git在两次提交中必须有大约一半的文件相同才能调用该重命名操作。但此重命名检测还需要满足其他几个条件。通常,将函数从一个现有文件移到另一个现有文件将导致其失败。对于de>git diff您有时也可以使用-B
(break pairings标志,它最多占用两个相似性索引值),但它的有用性会迅速降低。如果我将标题重命名为“preserve commit messages of moved function”是否更好?当我移动函数时,这确实是我想要保留的,这肯定更合理,但是没有办法这样做,因为提交消息附加到提交。