10

假设我编辑了一个文件

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

问题:如何恢复上一个分阶段的版本?由于没有提交,这可能吗?

4

3 回答 3

6

您可能可以做到这一点,但没有一个简单的命令可以为您做到这一点。

当您这样做时git add,该文件已经添加到存储库中,但目前除了 index.html 之外没有任何指向它的内容。当您执行第二次git add时,新的(版本的)文件被添加到存储库中,并且索引和文件的第一个版本之间的链接被新链接替换。但是第一个对象仍然存在。

您可以使用来获取存储库中当前未被任何东西引用的 blob 对象列表,但是您必须使用、等git fsck --dangling逐一检查它们以确定您想要的文件。一旦你找到了正确的文件,你就可以(也许)。git showgit cat-filegit show HASH > somefile.txtgit add somefile.txt

当然,如果你在第二个之后做了任何git prune,git gc等等git add,那实际上可能已经从你的存储库中删除了原始文件。

这是一个简单的例子:

$ git init foo
Initialized empty Git repository in foo/.git/
$ cd foo
$ echo blah > foo.txt
$ git add foo.txt
$ echo blarg > foo.txt
$ git add foo.txt
$ git fsck --dangling
Checking object directories: 100% (256/256), done.
dangling blob 907b308167f0880fb2a5c0e1614bb0c7620f9dc3
$ git show 907b308167f0880fb2a5c0e1614bb0c7620f9dc3
blah
$
于 2013-07-15T18:08:31.277 回答
4

你不能这样做。Git 只能将文件恢复到以前的提交,而不是以前的暂存版本。这是因为在您提交之前,该文件不会被输入到 git 的存储库中。(你可以在Coding Horror阅读更多关于提交的最佳实践)

也许您可以明智地使用undo按钮?(如果您在编辑器中编辑过代码,显然echo对文件的 ing 没有撤消)。

于 2013-07-15T17:40:01.527 回答
1

你的意思是你想恢复分阶段的版本?是的,你绝对可以做到。可能最简单的方法是提交您的分阶段更改,从该提交中签出文件,然后重置您的分支:

git commit -m "Temporary commit"
git checkout HEAD -- /path/to/file_you_want_to_revert
git reset HEAD~

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

于 2013-07-15T18:18:08.903 回答