【问题标题】:Best way to recover staged files after deleting via a *NIX 'rm'?通过 *NIX 'rm' 删除后恢复暂存文件的最佳方法?
【发布时间】:2018-10-17 19:50:49
【问题描述】:

在这种情况下恢复文件的“最佳实践”推荐方法是什么:

用户在其 Linux 工作区中修改文件。她运行“git add”并将它们分阶段。她没有承诺。时间流逝。她不小心使用 '/bin/rm' (not 'git rm') 删除了所有修改过的文件。

现在,“git status”将它们报告为“已删除”(正确)。它建议为每个运行“git reset HEAD file”和“git checkout -- file”(不正确)。这导致每个人的最新 (HEAD) 版本都留在她的工作区中,而不是那些包含她分阶段更改的版本。除了运行“git fsck”并尝试解析各种 SHA 引用之外,用户现在应该做什么来恢复她最初上演的更改?

【问题讨论】:

  • this answer 了解git-recover
  • 谢谢!是的,'git-recover' 脚本/博客有一些非常有用的信息,所以可以很好地解决它。不过,我仍然担心“git status”建议首先会导致悬空对象。
  • 请记住,git status 建议是针对“我如何取回我的文件?”这个问题,而不是“我如何获得我的已修改且尚未签入的文件返回?” rm 命令导致悬空对象,而不是 git resetgit checkout
  • 啊……好吧,明白了。是的,这更有意义。我想相信 git 按照这个建议做了正确的事:-)

标签: git


【解决方案1】:

如果文件已添加但未提交,则它们最初位于索引/阶段。使用rm 后,git status 给出的第二个建议(即git checkout -- <file>)是正确的,因为它将文件从索引中检出并进入工作目录。

我假设您已按以下顺序运行了列出的两个命令:

git reset HEAD <file>
git checkout -- <file>

不幸的是,这导致 reset 命令首先从索引中删除暂存文件,将其恢复到较早提交的版本并丢弃这些更改。然后checkout把这个文件放到目录下。

您可以轻松地对此进行测试:

git init
echo "my content" > somefile.txt
git add somefile.txt
git commit -am "commit"
echo "more content" >> somefile.txt
git add somefile.txt
rm somefile.txt
git status
git checkout -- somefile.txt

现在git-recover 可能是一个选项,但我从未使用过。

【讨论】:

  • 好的,我们实际上经历了一个非常相似的场景,就像你提到的那样,确认“git checkout -- foo.c”是我们首先要使用的命令,而不是'reset HEAD '。将其归结为学习曲线 :-) 工程师正在使用“git-fsck”和“git show”恢复文件。
猜你喜欢
  • 1970-01-01
  • 2014-05-02
  • 2012-08-24
  • 1970-01-01
  • 2014-09-14
  • 2014-09-06
  • 2017-10-07
  • 2016-01-17
  • 1970-01-01
相关资源
最近更新 更多