我在我的项目的专用模块中组织了功能和类。我使用PyCharm在Python中进行编码。
我经常需要对项目中的模块进行重组。
使用Git,在将功能从一个模块移动到另一个模块时,如何保留所有提交消息?显然,它不会自动发生(ref on intellj)。
我想出了这种解决方法:
因为我可以看到模块内部单个功能的历史(ref on stackoverflow)我在终端中发出以下命令:
git log -L :myfunction:path/to/myfile.py --follow path/to/myfile.py >> myfunction_commit_history.txt
我将myfunction移至my_newfile(使用PyCharm GUI,但如果通过命令行将其移至my_newfile,则同样适用)
我从myfunction_commit_history文件复制提交历史记录
虽然不好,但是比丢失整个提交历史要好。
任何建议都值得赞赏。
Git中的短语保存提交历史记录是胡说八道。
原因是提交are历史记录;历史什么都不是[[but提交。您要么拥有提交,那么所有内容都被保留,或者您没有,因此没有。
人们通常的意思是:我重命名了一些文件,现在找不到了。
这并不奇怪,因为每个Git提交只是所有文件的快照。提交A
具有文件README.txt
和starter.py
,最后提交Z
具有README.rst
和alldone.py
。如果README.rst
是沿途某处的重命名(也许还进行了修改),那么,唯一的<< find >>方法就是Git可以走,一次提交,即从Z
回到[ C0]返回到Y
,直到某个时候(例如X
和M
之间)比较两个提交的内容表明,[[wha-hey,N
中的README.txt
是一个M
中的README.rst
非常糟糕,因此我们称<< rename >>并停止寻找N
并开始寻找README.rst
。这就是README.txt
所做的。如果直接从git log --follow
跳到Z
,则两个文件的内容可能相差太大,无法匹配它们。但这就Git而言还可以:如果您问我如何编辑A
中的文件以使其看起来像A
]中的文件,Git会说,删除Z
并使用以下内容创建新的README.txt
和这些指令起作用
。他们没有告诉您您想知道的内容,但是就Git而言,它们足够好。将功能从一个文件移动到另一个文件时,Git的某些部分,包括README.rst
,可以进行逐个提交的比较,在较早的提交中搜索all文件,然后找到它(对于[ C0],则需要git blame
选项,而git blame
是-C
。 Git的其他部分,包括直接将较早的提交与较晚的提交进行区分,通常是不行的:比较任何一对提交时,对于--follow
/ git log
选项,重命名的文件必须与原始文件足够相似。工作。您可以调整重命名查找阈值:-M
在没有任何阈值的情况下打开时,使用50%的相似性索引,即,两次调用中文件的大约一半必须相同,Git才能调用重命名操作。但是,此重命名检测还需要满足其他几个条件。通常,将功能从一个现有文件移动到另一个现有文件将导致其失败。对于--find-renames
,有时也可以使用-M
(中断配对标志,该标志最多包含两个相似性索引值),但是此操作的用度很快下降。