奇怪的git案例 - git stash后跟git stash应用丢失的未提交数据?

时间:2010-04-10 15:57:12

标签: git git-stash data-loss

我有一个文件,比如file.txt我已经把git mv file.txt写到了file1.txt,然后我创建了一个名为file.txt的新文件并对其进行了处理。不幸的是我没有将该文件添加到git中。无论如何问题是我做了git stash,然后是git stash apply,但新的file.txt消失了......无论如何要把它取回来?

4 个答案:

答案 0 :(得分:9)

这里的问题主要是对git stash save的误解。它仅保存对跟踪的文件的更改。 git stash不会保存未跟踪的文件。当您将file.txt移动到file1.txt时,新的file.txt是一个未跟踪的文件,git stash 保存。这不是一个错误,它只是git stash行为的方式。可能是git stash的文档应该更加明确。

作为git stash save州的文档,保存更改后,它会执行git reset --hard。正是git reset --hard覆盖了新的file.txt。有人可能会争辩说,如果未覆盖的文件被覆盖,git reset --hard应该会生成警告,但我仍然不会将此称为错误。它正在做它应该做的事情。

这里要理解的重要事项 - 以及可以为您节省多少麻烦的是git stash save 不保存未跟踪的文件(并且可能不应该)

答案 1 :(得分:4)

这看起来像藏匿中的严重(即数据丢失)错误。请报告。不幸的是,我不相信有任何办法让新file.txt回来。

此错误现已在git> = 1.7.1.1中修复。

答案 2 :(得分:2)

以后,使用git stash -u来存储未提交的文件(http://www.kernel.org/pub/software/scm/git/docs/git-stash.html)您可以从git版本1.7我相信。

答案 3 :(得分:1)

这篇文章的目的是简单地说明娱乐过程而不会被塞进评论中。 注意:使用Git版本1.7.0.2

要重新创建:

~/test $ git init
~/test $ echo "hello" > file.txt
~/test $ git add .
~/test $ git commit -m "init commit"

~/test $ git mv file.txt file1.txt
~/test $ echo "new data" > file.txt
~/test $ git stash
~/test $ git stash apply

~/test $ cat file.txt
cat: file.txt: No such file or directory

~/test $ cat file1.txt
hello