我不小心删除了git仓库中的本地文件更改。他们没有被强迫,甚至被推。我做了什么:git status(然后显示了没有提交的文件,我意外地删除了这个命令名为“smdr”的整个文件夹):git checkout -- smdr然后文件更改消失。我怎样才能恢复这些文件(在git checkout 之前将所有内容都恢复回来-- smdr命令)?
o8x7eapl1#
你不能和Git在一起。文件未提交,因此不在历史记录中。你只是得到了索引中的(不存在的)版本git checkout。你唯一的希望就是你的备份系统。
git checkout
m3eecexj2#
您可以使用任何给定的选项:
输入git reflog并 checkout 你需要的提交,它会将你的仓库“恢复”为“已删除”的提交。
git reflog
另一个选项是使用git revert SHA-1,这将恢复您的提交。它将简单地撤消您的更改
git revert SHA-1
Git reset将检查给定sha-1的内容。它会将你的分支设置为与SHA-1相同的状态
d6kp6zgx3#
除了Matthieu Moy's accepted answer之外,我发现我们可以遵循这个明显但令人惊讶的好实践,以防止此类“结帐”事故再次发生。“还有一个疯狂的想法:不要在肮脏的工作树上运行'git checkout...'。问题解决了。”这(1)是我在使用git checkout .丢弃任何未暂存/未提交的更改后停止的最多的一次。我现在使用的命令,这是作出更适合这一点:git reset。git reset用于取消暂存更改,git reset --hard用于当您完全确定要永久放弃更改时。git stash也是你的好朋友,在你丢弃它们之前把它们藏起来不会有什么坏处。让这两个成为一种习惯,并使用git checkout只在分支之间切换(大多数情况下)对我来说非常好。
git checkout .
git reset
git reset --hard
git stash
更新:一年后,我采用了两种新的做法,并且已经使用了很长一段时间,这可能会有所帮助。我已经将git reset替换为较新的git restore。我合并它和“你确定吗?“bash(2)中的确认函数以获得额外的注意。confirm && git restore .现在是我删除所有未暂存更改的首选命令。
git restore
confirm && git restore .
第二个是checkout的-p, --patch选项(它适用于许多其他命令,如add,这非常有用)。它允许您交互式地选择带有确认的代码块。因此,如果你只想删除一些更改,git checkout -p现在更安全了,默认情况下它不会影响阶段性更改。(1)fr 0 sty于2010年5月13日在Hacker News辩论中发表的评论的相关部分。我从VonC for "Get back the changes after accidental checkout?"的答案中得到了这个(2)在the answer for "In Bash, how to add 'Are you sure [Y/n]' to any command or alias?"中,了解如何创建用于重要命令的通用确认函数。
checkout
-p, --patch
add
git checkout -p
3条答案
按热度按时间o8x7eapl1#
你不能和Git在一起。文件未提交,因此不在历史记录中。你只是得到了索引中的(不存在的)版本
git checkout
。你唯一的希望就是你的备份系统。
m3eecexj2#
您可以使用任何给定的选项:
Git reflog
输入
git reflog
并 checkout 你需要的提交,它会将你的仓库“恢复”为“已删除”的提交。Git恢复
另一个选项是使用
git revert SHA-1
,这将恢复您的提交。它将简单地撤消您的更改Git重置
Git reset将检查给定sha-1的内容。它会将你的分支设置为与SHA-1相同的状态
d6kp6zgx3#
除了Matthieu Moy's accepted answer之外,我发现我们可以遵循这个明显但令人惊讶的好实践,以防止此类“结帐”事故再次发生。
“还有一个疯狂的想法:不要在肮脏的工作树上运行'git checkout...'。问题解决了。”
这(1)是我在使用
git checkout .
丢弃任何未暂存/未提交的更改后停止的最多的一次。我现在使用的命令,这是作出更适合这一点:git reset
。git reset
用于取消暂存更改,git reset --hard
用于当您完全确定要永久放弃更改时。git stash
也是你的好朋友,在你丢弃它们之前把它们藏起来不会有什么坏处。让这两个成为一种习惯,并使用
git checkout
只在分支之间切换(大多数情况下)对我来说非常好。更新:一年后,我采用了两种新的做法,并且已经使用了很长一段时间,这可能会有所帮助。我已经将
git reset
替换为较新的git restore
。我合并它和“你确定吗?“bash(2)中的确认函数以获得额外的注意。confirm && git restore .
现在是我删除所有未暂存更改的首选命令。第二个是
checkout
的-p, --patch
选项(它适用于许多其他命令,如add
,这非常有用)。它允许您交互式地选择带有确认的代码块。因此,如果你只想删除一些更改,git checkout -p
现在更安全了,默认情况下它不会影响阶段性更改。(1)fr 0 sty于2010年5月13日在Hacker News辩论中发表的评论的相关部分。我从VonC for "Get back the changes after accidental checkout?"的答案中得到了这个
(2)在the answer for "In Bash, how to add 'Are you sure [Y/n]' to any command or alias?"中,了解如何创建用于重要命令的通用确认函数。