我有一个文件,假设叫file.txt。我用git mv命令把它改名为file1.txt,然后创建了一个叫file.txt的新文件并对其进行操作。不幸的是,我还没有将这个新文件添加到git中。问题在于,我使用了git stash命令,然后又用git stash apply命令,但新的file.txt文件却消失了...有没有办法找回它?
git stash save
的作用。它只保存已跟踪文件的更改,未跟踪文件不会被git stash
保存。当您将file.txt移动到file1.txt时,新的file.txt是一个未跟踪的文件,不会被git stash
保存。这不是一个bug,而是git stash
的行为方式。也许应该更清楚地说明git stash
的文档。git stash save
的文档所述,它将在保存更改后执行git reset --hard
。正是git reset --hard
覆盖了新的file.txt。有人可能会认为如果要覆盖未跟踪的文件,git reset --hard
应该生成警告,但我仍然不会称之为bug。它正在执行它应该执行的操作。git stash save
不会保存未跟踪的文件(也许不应该)。git stash
正在回滚并覆盖未提交的数据,就需要一些通知。 - mačekgit status
在原始文件移动并创建新文件后对工作树状态的描述——这几乎说明了一切。 - Dan Mouldinggit stash
操作应该会使文件内容丢失,所以这是 git stash
的一个 bug。它使用 reset --hard
将修改后的文件覆盖为 HEAD 版本。由于 stash 正在重置到文件的已跟踪版本,它应该确保已保存要覆盖的任何版本。git stash
应该是一个安全的操作,它不像 reset --hard
要求 git 丢弃东西。我认为观察到的 stash 行为是不可接受的。 - CB Bailey这看起来是一个严重的问题(即数据丢失)在stash中。请报告此问题。不幸的是,我认为没有任何方法可以恢复新的file.txt
。
这个bug已经在git >=1.7.1.1版本中被修复。
为了处理未提交的文件,建议使用git stash -u
命令(http://www.kernel.org/pub/software/scm/git/docs/git-stash.html),此功能从Git版本1.7开始提供。
这篇文章旨在简单说明重建过程,而不会让您陷入评论区。 注意:使用 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