git - 在模块之间移动函数时保留 Git 提交消息的顺序
问题描述
我在我的项目的专用模块中组织了函数和类。我使用 PyCharm 在 Python 中编写代码。
我经常需要对项目中的模块进行重组。
使用 Git,将功能从一个模块移动到另一个模块时如何保留所有提交消息?显然它不会自动发生(参考 intellj)。
我想出了这个解决方法:
因为我可以看到模块内单个函数的历史记录(stackoverflow 上的 ref),所以我在终端中发出以下命令:
git log -L :myfunction:path/to/myfile.py --follow path/to/myfile.py >> myfunction_commit_history.txt
我将 myfunction 移动到 my_newfile (使用 PyCharm GUI,但同样适用于通过命令行移动它)
我从 myfunction_commit_history 文件中复制提交历史
这不是很好,但比丢失整个提交历史要好。
任何建议表示赞赏。
解决方案
在 Git 中保留提交历史这句话是无稽之谈。
原因是提交是历史;历史不过是提交。你要么有提交,所以一切都被保留了,或者你没有,所以不是。
人们通常的意思是:我重命名了某个文件,现在找不到了。 这并不奇怪,因为每个 Git 提交只是所有文件的快照。提交A
有文件README.txt
和starter.py
,Z
最后提交有README.rst
和alldone.py
。如果在此过程中某处重命名(也许还有修改),那么,找到README.rst
它的唯一方法是让 Git 行走,一次提交一次,从背靠背到直到某个时间点——比如在和——比较两个提交的内容表明,哇,嘿,in非常像in ,所以我们称它为 aZ
Y
X
M
N
README.txt
M
README.rst
N
重命名并停止寻找README.rst
并开始寻找README.txt
。就是git log --follow
这样。
如果您直接从Z
to跳转A
,则两个文件的内容可能相差太大而无法匹配。但就Git而言,这没关系:如果你问我如何编辑文件A
以使它们看起来像 中的文件Z
,Git 会说,删除并使用这些内容README.txt
创建一个新README.rst
文件,并且这些说明有效。他们不会告诉你想要你想知道,但就 Git 而言,它们已经足够好了。
当您将函数从一个文件移动到另一个文件时,git blame
Git的某些部分(包括. Git 的其他部分,包括直接区分早期提交和延迟提交,通常不能:当比较任何一对提交时,重命名的文件必须与原始文件足够相似,才能使/选项起作用。您可以调整重命名查找阈值:在没有任何阈值的情况下打开时,使用 50% 的相似度索引,即两次提交中大约一半的文件必须相同,以便 Git 调用重命名git blame
-C
--follow
git log
-M
--find-renames
-M
手术。但是这个重命名检测还需要几个其他条件来满足。通常,将函数从一个现有文件移动到另一个现有文件会导致它失败。因为git diff
您有时也可以使用-B
(break-pairings 标志,它最多占用两个相似性指数值),但它的用处很快就消失了。
推荐阅读
- stata - 根据指标变量(Stata)按教育组计算失业率
- windows - 通过powershell在windows 10中添加国际英文键盘
- ios - 在 iOS Swift 上打开 http 深层链接
- node.js - 使用 nodejs aws-sdk 将较大的文件上传到 s3 的最佳方法是什么?MultipartUpload vs ManagedUpload vs getSignedURL 等
- python - 如果密码简单循环
- python - 代码在切换的弹出窗口上找不到元素
- javascript - 如何在 React 中为元素添加样式?
- python - 如何提高计算使用连续性的算法的速度?
- python-3.x - 使用 beautifulsoup 获取元属性
- reactjs - ++ 将值增加 2 而不是 1