我在一个月前做了一个提交,涉及我创建新的文件夹和子文件夹,并在我们之间移动我的源代码文件。我从那时起第一次浏览我的历史并且意识到git已经“丢失”历史记录,因为原始文件被删除然后重新添加,我想 - 即当我在我的git GUI中查看文件时(它是根据NDA,所以我不能直接讨论它,但是例如,这个存储库也在GitHub上被破坏.GitHub清楚地显示它将提交检测为一系列动作。)它只显示每个文件的历史记录,当项目文件夹时重组了。
在阅读了几个问题(Getting Git to Acknowledge Previously Moved Files,How to make git mark a deleted and a new file as a file move?)后,我比起初时更加迷失。从那些答案中听起来我根本无法解决这个问题?我真的很感激这里的任何帮助。
答案 0 :(得分:10)
在Git中,没有文件移动的概念。
某些工具(如GitHub)会考虑一个包含已删除的名为X的文件和一个已创建文件移动的名为X的文件的提交。
根据Linus Torvalds的说法,文件移动只是重构的一个特例;因此,Git不会以不同的方式对待它。与许多其他案例一样,这种特殊情况的处理留给了更高级别的工具(例如前端)。
有关此主题的更多信息,请查看Linus Torvalds的this answer。
答案 1 :(得分:3)
据我所知,你想要:
git log --follow some_file.cpp
有关详细信息,请参阅http://git-scm.com/docs/git-log。我不确定这是不是你想要的;但是在git的情况下,git跟踪内容而不是文件。问题是确定这些信息真的很贵,并且通常认为你不需要它......
答案 2 :(得分:2)
您是否尝试过设置config diff.renames
?
diff.renames
告诉git检测重命名。如果设置为任何布尔值,它将启用基本重命名检测。如果设置为“复制”或“复制”,它也会检测副本。
注意:要在重命名后跟踪单个文件的历史记录,您需要使用“git log -p --follow file
”。
答案 3 :(得分:2)
如果你想在git中移动文件夹,你可以使用 git mv 。
我在我的存储库的根目录中有一堆文件夹,并希望将它们移动到两个子目录中,因此我使用** mkdir创建了两个新目录。
然后我将文件和文件夹一次一个地移动到新目录中,如下所示:
git mv folder1/ newDirectory1/
git mv file1.txt newDirectory2/
等
我有一个案例,我想将其中一个目录重命名为 src ,我这样做了:
git mv folder2 newDirectory1/src
这导致了一组看起来像这样的文件:
repository/
newDirectory1/
folder1/
src/
newDirectory2/
file1.txt
在我完成之后,我创建了一个名为“重组”的新分支,因此我不会干扰其他开发人员在主分支中所做的工作。他继续处理这些文件,当他向主人推动新的更改时,我将这些更改合并到我的分支中,一切都按照我的希望进行。已移动的文件已从其原始位置正确引用,并已收到其提交。
答案 4 :(得分:0)
如果你真的错过了你的历史修订版(你的问题并不完全清楚实际上缺少了什么)并且它只有一个月左右,你可能还有时间 - 看看reflog;它会保留您签出的每个参考文献的副本,因此如果您犯了错误,您可以取回之前的参考文献。
默认设置是将reflog条目保留90天,它们会被git gc
过期。
git help reflog
答案 5 :(得分:0)
我会运行一个遍历所有对象的脚本。您需要先解压缩所有包文件。该脚本将检查类型,如果是提交,您将看到如果您是作者。然后检查日期。列出那些和grep以获取所需的文件名。一旦您感兴趣,请使用
创建一个分支git branch RecoveredWork hash-of-your-commit
看看你是否拥有所需的一切
git log RecoveredWork --graph --decorate
从这里你可能想要做一些过滤分支,嫁接和/或重新定位以再次链接历史。
答案 6 :(得分:0)
我可以想到一些可能性。如果事情只是乱窜,但不跟踪,那么我认为这是在两个不同的提交中完成的...一个删除然后一个重新添加。在此之前在提交中创建一个新分支,将下两个提交加载为一个提交,然后在此之后附加所有内容。
如果不是这种情况,您可能需要查看git log -M -C