以下是我的回购的状态。
[~/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)] ➔
我可以取回更改吗?
答案 0 :(得分:49)
您可以通过IDE查看另一件事。我不小心检查了2个文件,并能够通过我的IDE(netbeans)的“本地历史记录”恢复更改。真是太幸福了!
答案 1 :(得分:44)
我认为你不能恢复那些私有数据(“私有”,如“没有添加到索引中,也没有提交”,因此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完成或'{{1的行为}}“
答案 2 :(得分:21)
除非您之前曾使用过git add
或git stash
这些文件,否则很遗憾。如果您已添加或隐藏它们,那么您应该能够通过git reflog
找到它们的哈希值。
我从未对git checkout
的这种破坏性行为感到满意。也许一个有用的增强功能是让这种git checkout
在覆盖你的工作之前自动创建一个存储(以便通过reflog捕获文件)。
答案 3 :(得分:5)
以下内容可能适用于您在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
如果包含工作副本的分区是根分区,它可能拒绝重新安装,然后尝试终止所有服务,如果仍然没有,则使用Live CD / USB / PXE关闭和启动,如{{ 3}},然后运行上面的内容。我成功地以这种方式恢复了三个丢失的文件中的一个。
答案 4 :(得分:3)
如果你使用 Eclipse作为IDE 和 EGit ,你的团队菜单上有你的文件:
在我的情况下,您将看到所有版本都保存在本地而没有任何保存名称,但是,您可以轻松地检查git功能中所有未经跟踪的更改并恢复丢失的代码。
答案 5 :(得分:3)
如果IDE是Android Studio,则打开已更改的文件,然后转到VCS->本地历史记录->显示历史记录。打开的文件将显示在此处。
答案 6 :(得分:0)
使用git命令无法做任何事情,但如果您使用的是IDE,则可以恢复更改。 我正在使用PhpStorm,我们可以看到文件更改历史记录。 只需右键单击文件,然后单击显示本地历史记录。 在“外部更改”选项卡下,您可以找到意外删除的本地更改。
答案 7 :(得分:0)
如果您使用的是IDE,并且具有撤消选项,则只需撤消更改,它就会撤消从磁盘重新加载的操作,这将使更改恢复。大多数IDE /编辑器都有此选项。
答案 8 :(得分:0)
我正在使用Intellij。 CTRL + z 对我有用,它将提示您“从磁盘重新加载更改”,然后单击“是”。
答案 9 :(得分:0)
1)System.Runtime.dll 4.2.1.0
您可以看到下面的输出
git reflog
2)f7de337 (HEAD -> master, origin/master) HEAD@{0}: checkout: moving from b0b3175f8890950218bba8906ffab0d6f84bf to master
答案 10 :(得分:0)
使用 VS Code 可以顺利进行,通过CTRL + Z从磁盘取回本地更改。因此,请尝试使用IDE。
答案 11 :(得分:-1)
如果使用 IntelliJ Idea ,则可以在选定的项目文件夹-> Lokal History ->上单击鼠标右键。所有文件。