说我编辑了一个文件
echo "hi" > someVersionedFile.txt
//Then I staged the file
git add .
git status
<console reads>
Changes to be committed
new file: someVersionedFile.txt
现在我对文件进行了其他更改
echo "hi again file" >> someVersionedFile.txt
//Then I restage the file with these changes
git add .
git status
<console reads>
Changed but not commited
modified file: someVersionedFile.txt
问题:如何恢复上一个上演版本?这可能是因为没有提交吗?
答案 0 :(得分:6)
你可能会这样做,但没有一个简单的命令可以帮你完成。
执行git add
时,文件已经添加到存储库中,但除了索引之外,目前没有任何指向它的文件。当您执行第二个git add
时,新的(版本)文件将添加到存储库中,索引与文件的第一个版本之间的链接将替换为新链接。但第一个目标仍在那里。
您可以使用git fsck --dangling
获取存储库中当前未被任何内容引用的blob对象列表,但是您必须逐个查看git show
,{ {1}}等确定您想要的文件。找到合适的文件后,您可以git cat-file
(也许git show HASH > somefile.txt
)。
当然,如果您从第二个git add somefile.txt
开始已经完成了git prune
,git gc
等,那么可能实际上已从您的存储库中删除了原始文件。
这是一个简单的例子:
git add
答案 1 :(得分:4)
你不能这样做。 Git只能将文件还原为以前的提交,而不是之前的阶段版本。这是因为在您进行提交之前,文件不会被输入到git的存储库中。 (您可以在Coding Horror)
了解更多关于提交的最佳做法也许您可以明智地使用undo
按钮? (如果您在编辑器中编辑了代码,显然echo
文件没有撤消。
答案 2 :(得分:1)
您的意思是您希望将恢复为分阶段版本?是的,你绝对可以做到这一点。可能最简单的方法是提交您的分阶段更改,从该提交中签出文件,然后重置您的分支:
git commit -m "Temporary commit"
git checkout HEAD -- /path/to/file_you_want_to_revert
git reset HEAD~
编辑:糟糕,抱歉,我没有注意到您使用新更改重新启动文件的部分。抱歉,其他答案都是正确的:这是不可能的(或者至少,不是很容易)。我会留下这个答案,以防其他人遇到类似的问题,但还没有覆盖缓存。