以下是我的回购的状态。
[~/rails_apps/jekyll_apps/nepalonrails (design)⚡] ➔ gst
# On branch design
# Changed but not updated:
# (use "git add/rm <file>..." to update what will be committed)
# (use "git checkout -- <file>..." to discard changes in working directory)
#
# modified: _layouts/default.html
# deleted: _site/blog/2010/04/07/welcome-to-niraj-blog/index.html
# deleted: _site/blog/2010/04/08/the-code-syntax-highlight/index.html
# deleted: _site/blog/2010/05/01/showing-demo-to-kalyan/index.html
# deleted: _site/config.ru
# deleted: _site/index.html
# deleted: _site/static/css/style.css
# deleted: _site/static/css/syntax.css
# modified: static/css/style.css
#
no changes added to commit (use "git add" and/or "git commit -a")
偶然地,我做了git checkout -f
,现在我不应该做的改变已经消失了。
[~/rails_apps/jekyll_apps/nepalonrails (design)⚡] ➔ git co -f
[~/rails_apps/jekyll_apps/nepalonrails (design)] ➔ gst
# On branch design
nothing to commit (working directory clean)
[~/rails_apps/jekyll_apps/nepalonrails (design)] ➔
我可以取回更改吗?
您可以查看的另一件事是通过您的 IDE。我不小心签出了 2 个文件,并且能够通过我的 IDE(Netbeans)的“本地历史记录”恢复更改。多么幸福啊!
如果您使用的是 Eclipse,请通过右键单击该文件并转到 Team->Show Local History 来执行此操作。
我认为您无法恢复这些私有数据(“私有”,如“未添加到索引中,也未提交”,因此 git 不知道),除非您为当前工作目录设置了其他备份过程。
即使 Git Aliases page 中没有提出这一点,我也会主张为结帐提供某种别名(例如 alias rm /bin/rm -i
的用法):
[alias]
co = !sh -c 'git stash; git stash apply; git checkout "$@"'
,其中“git stash; git stash apply
”是 Brian Campbell 在 his answer 中使用的“检查点技术”。
co = "!git stash push -m \"co backup\"; git stash apply; git checkout \"$@\""
注意,我添加了一条消息来告诉其他人的备份存储。 –
这个问题让我想起了关于 ycombinator(摘录)的这种行为的辩论:
我用 git 丢失了很多数据。其中大部分与删除数据时不要求确认的听起来无害的命令有关。例如, git checkout filename 等价于 svn revert filename。当然 git checkout branchname 做了一些完全不同的事情。如果一个分支和一个文件共享相同的名称,git 将默认切换分支,但这并不能阻止 bash 自动完成破坏这一天。这是一个疯狂的想法:如果你有一个无害的动作和一个危险的动作,不要用相同的命令标记它们。
也许很烦人,但这是用户错误,而不是设计错误。使用 git,如果我想无损地丢弃我的工作副本,我可以“git stash”。根据您的逻辑,“rm”是有缺陷的,因为当您通过 -f 而不是 -i 时它不会要求确认。嗯,是的。对不起。
如果 rm somename 等同于 apt-get update,并且 rm othername 是 rm -fr othername,那么您的类比会更准确。尽管如此,根据当前目录中是否有一个名为 foo 的文件,“get checkout foo”会做两种完全不同的事情之一是不对的
这是另一个疯狂的想法:不要在肮脏的工作树上运行'git checkout ...'。问题解决了。另一个:不要重用文件名作为分支名。老实说:我也有同样的问题,粗心地调用 'rm' 毁了我的一天,但是当我喃喃自语时,这是因为我的懒惰/愚蠢,而不是 bash 完成或 'rm' 的行为
co = "!git stash push -m \"co backup\"; git stash apply; git checkout \"$*\""
注意,我添加了一条消息来告诉其他人备份存储。
$*
替换为 $@
。如果您使用 git co entry1 entry2
,$*
将不起作用 - 它会抱怨 error: pathspec 'entry1 entry2' did not match any file(s) known to git
。应该改为:co = "!git stash push -m \"co backup\"; git stash apply; git checkout \"$@\""
谢谢。
除非您以前曾对这些文件使用过 git add
或 git stash
,否则很遗憾没有。如果您已添加或隐藏它们,那么您应该能够通过 git reflog
找到它们的哈希值。
我对 git checkout
的这种破坏性行为感到不自在。也许有用的增强功能是让这种 git checkout
在覆盖您的工作之前自动创建一个存储(以便通过 reflog 捕获文件)。
使用 VS Code 可以顺利地通过 CTRL+Z 从磁盘获取本地更改。所以尝试使用IDE。
如果您使用 IntelliJ Idea,您可以在选定的项目文件夹上单击鼠标右键 -> Lokal History -> 您可以看到所有文件。
如果你使用 Eclipse 作为 IDE 和 EGit,你的文件中有 Team-menu:
从列表项“团队”中右键单击您的文件 - >“显示本地历史记录”
您将看到所有版本都保存在本地,没有任何保存名称,在我的情况下,您可以轻松检查 git 功能中所有未跟踪的更改并恢复丢失的代码。
如果您在 Linux 上使用 vim,以下内容可能适用。
如果文件在活动缓冲区中打开,那么只要您不在 vim 中重新加载文件,您就可以获得文件内容,并且可以通过保存来恢复。 .
如果文件没有在活动缓冲区中打开,而是脏的,那么源目录中应该有一个 .swp 文件,其中还包含可以通过 vim -r file.swp 恢复的内容副本。
如果文件既没有在前缓冲中打开也没有脏文件,并且如果您的工作副本位于 ext3 或 ext4 分区上,则 extundelete 可能能够找到最近删除的 .swp 文件和/或旧版本的源文件。将分区重新挂载为只读,例如 mount -o remount,ro /mnt/point,然后运行 extundelete --recover-directory /path/to/working/copy /dev/sdaX 如果包含工作副本的分区是root 分区,它可能会拒绝重新挂载,然后尝试杀死所有服务,如果仍然不行,则关闭并使用 Live CD/USB/PXE 启动,如 GRML,然后运行上述。通过这种方式,我成功地恢复了三分之一丢失的文件。
如果 IDE 是 Android Studio,则打开已更改的文件并转到 VCS -> Local History -> Show History。打开的文件将显示在那里。
我正在使用 Intellij。 CTRL + z 对我有用,它会提示你“从磁盘重新加载更改”,然后点击是。
如果您使用 android studio 来恢复您的更改(这救了我),最好的方法是:
1-右键单击您的根项目目录(您的包名称)。 2-本地历史-> 显示历史。
https://i.stack.imgur.com/nnH7y.jpg
3-还原您想要的任何更改。
希望对您有所帮助 如有任何错误,请见谅,英语不是我的母语。
如果您使用的是 IDE,并且如果它具有撤消选项,则只需撤消更改,它将撤消从磁盘重新加载,这将带回您的更改。大多数 IDE / 编辑器都有这个选项。
1) git reflog
你可以看到像下面的输出
f7de337 (HEAD -> master, origin/master) HEAD@{0}: checkout: moving from b0b3175f8890950218bba8906ffab0d6f84bf to master
2) git checkout b0b3175f8890950218bba8906ffab0d6f84bf
就像@VonC mentioned 一样,git checkout
的歧义是这里的根本原因。但是创建检查点可能会使您的存储变得一团糟,如果维护不当,最终将无法使用。
我最终只使用 git switch
而不是 git checkout
进行分支切换。是的,你需要改变你的习惯,但从我的观点来看,这是最终的解决方案。
您无法使用 git 命令执行任何操作,但如果您使用的是 IDE,那么您可以恢复您的更改。我正在使用 PhpStorm,我们可以在其中查看文件更改历史记录。只需右键单击文件,然后单击显示本地历史记录。在外部更改选项卡下,您可以找到意外删除的本地更改。
Team->Show Local History
来执行此操作。