如何使用更改恢复暂存文件,保留更改时间段的更改?

时间:2013-07-15 16:52:19

标签: git

说我编辑了一个文件

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

问题:如何恢复上一个上演版本?这可能是因为没有提交吗?

3 个答案:

答案 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 prunegit 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~

编辑:糟糕,抱歉,我没有注意到您使用新更改重新启动文件的部分。抱歉,其他答案都是正确的:这是不可能的(或者至少,不是很容易)。我会留下这个答案,以防其他人遇到类似的问题,但还没有覆盖缓存。