首页 > 解决方案 > Git丢失了历史,而我只重命名了文件而不更改内容

问题描述

根据这篇文章https://coderwall.com/p/_csouq/renaming-and-chang-files-in-git-without-losing-history

如果内容没有改变,Git 在重命名时不会丢失历史记录。当我至少在 VSCode 中尝试过时,它似乎并不正确。

我错了还是文章错了?互联网上关于该主题的信息是如此矛盾。

标签: git

解决方案


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追溯seq2seq,发现重命名操作即使与(非常小的)内容更改相结合。

现在,让我们做一个更大的改变:

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 进行此优化,因为它不会在两个名称之间创建链接。


推荐阅读