git - Git丢失了历史,而我只重命名了文件而不更改内容
问题描述
根据这篇文章https://coderwall.com/p/_csouq/renaming-and-chang-files-in-git-without-losing-history
如果内容没有改变,Git 在重命名时不会丢失历史记录。当我至少在 VSCode 中尝试过时,它似乎并不正确。
我错了还是文章错了?互联网上关于该主题的信息是如此矛盾。
解决方案
TL;博士
git log --follow file
如果文件在重命名的提交中保持相同或非常相似,则会找到重命名操作。
细节
重命名文件后,请git log --follow file
尽最大努力弄清楚进行了哪些重命名操作file
。如果您有一个仅包含该git mv
操作的提交,那么弄清楚它是微不足道的并且每次都有效。如果你在同一个提交中重命名和修改,你会让问题变得更难。有时git log --follow file
确实会弄清楚,但并非总是如此。
当然,主要的警告是git log --follow
一次只能处理一个文件。所以你保留了历史,是的,但如果你想跟踪所有发生的重命名,这是相当多的工作。
一个测试的例子
我刚刚创建了一个文件,然后在同一次提交中对其进行了重命名和修改:
seq 1 100 > seq
git add seq
git commit -m'seq: count to 100'
git mv seq seq2
echo 101 >> seq2
git add seq2
git commit -m'git mv seq seq2 and append 101'
此时,git log --follow
追溯seq2
至seq
,发现重命名操作即使与(非常小的)内容更改相结合。
现在,让我们做一个更大的改变:
git mv seq2 seq3
seq 200 300 >> seq3
git add seq3
git commit -m'git mv seq2 seq2 + append 200..300'
现在 Git 忘记了重命名:git log --follow seq3
只找到创建它的一个提交并停在那里。我必须这样做git log --follow -- seq2
才能获得涉及seq2
和的较早历史seq
。
某处可能有一些文档说明 Git 可以容忍多少更改并且仍然可以找到重命名,但我不知道在哪里。
空间效率
还有空间效率的考虑,在你分享的链接中提到:如果你的git mv
操作独立于一个没有其他文件更改的提交中,则旧文件的最后一次提交和新文件的第一次提交将共享同一个 blob (这总是在两个文件相同时发生),并且其他提交将能够存储为更改集。如果您在重命名时进行编辑,则会阻止 Git 进行此优化,因为它不会在两个名称之间创建链接。
推荐阅读
- html - 如何防止页脚推高粘性侧边栏
- python - 调试此 python 文件时如何检查另一个 python 文件中的值?
- ibm-cloud - 网关超时 (502) 发生在 Cloud Functions API 调用的 Web 操作上
- android - Flutter:缓存图像网络提供程序未在(发布模式应用程序)真实构建应用程序中加载图像。(但仅在模拟器中加载图像)
- json - 我正在尝试检查数据库中是否存在不和谐的用户 ID,但该命令仅在用户存在时运行。Python
- javascript - 在 VSCode 中调试 Aleph 应用程序
- python - 从维恩图中隐藏一些标签
- reactjs - 使用reactjs在html表格中显示多个下拉列表
- flutter - 视图控制器必须符合flutter方法通道中的QPRequestProtocol?
- java - Selenium by JAVA,试图点击登录按钮