ChatGPT解决这个技术问题 Extra ChatGPT

意外结账后取回更改?

以下是我的回购的状态。

[~/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)] ➔ 

我可以取回更改吗?


j
joeljpa

您可以查看的另一件事是通过您的 IDE。我不小心签出了 2 个文件,并且能够通过我的 IDE(Netbeans)的“本地历史记录”恢复更改。多么幸福啊!

如果您使用的是 Eclipse,请通过右键单击该文件并转到 Team->Show Local History 来执行此操作。


您也可以在 Eclipse 中通过右键单击文件并转到 Team->Show Local History 来执行此操作。
你刚刚救了我的命!要在 JetBrains 中执行此操作,请转到 VCS 菜单 > Local Histroy
我也遇到过,Eclipse自动刷新了文本内容;但是按 ctrl+Z 几次,我的修改又回来了,谢天谢地!
使用 Sublime Text 3,我丢失的文件中的 ctrl+z 足以恢复它们。
只是 Cmd+Z 和“从磁盘重新加载撤消”在 IntelliJ Idea 中救了我
V
VonC

我认为您无法恢复这些私有数据(“私有”,如“未添加到索引中,也未提交”,因此 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 Campbellhis answer 中使用的“检查点技术”。

stason 建议 in the comments

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' 的行为


对我来说,在 git 1.7.9.5 上,上面的别名错误并带有“意外的 EOF”。尝试替换';'和 '&&'。尝试使用“$@”而不是“$*”:strace 表示参数未传递给 execve。尝试了“f() {...}; f”。没有成功。以上内容对其他人有用吗?
此别名似乎有效:co = "!git stash push -m \"co backup\"; git stash apply; git checkout \"$*\"" 注意,我添加了一条消息来告诉其他人备份存储。
@stason 谢谢。我已将您的评论包含在答案中以提高知名度。
@VonC,我有一个更正:请在您的原始解决方案和我的更新中将 $* 替换为 $@。如果您使用 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 \"$@\"" 谢谢。
@stason 谢谢。我已经相应地编辑了答案。
G
Greg Hewgill

除非您以前曾对这些文件使用过 git addgit stash,否则很遗憾没有。如果您已添加或隐藏它们,那么您应该能够通过 git reflog 找到它们的哈希值。

我对 git checkout 的这种破坏性行为感到不自在。也许有用的增强功能是让这种 git checkout 在覆盖您的工作之前自动创建一个存储(以便通过 reflog 捕获文件)。


我真的希望 git 做到这一点。当我切换分支时,我不得不费心把我的工作藏起来,这很烦人。我希望能够输入“git checkout foo; git checkout bar”,并且假设我从分支栏开始,最终我的索引和工作目录处于与命令之前完全相同的状态,无论我做什么已修改,我已添加到索引中的内容等。
所以你想让 git 自动版本控制文件和更改而不需要你告诉它吗?
从最新的 git 版本开始,所有的 checkout 都记录在 reflog 中
s
swedishtea

使用 VS Code 可以顺利地通过 CTRL+Z 从磁盘获取本地更改。所以尝试使用IDE。


在使用无限宝石带回我的代码后感觉就像托尼斯塔克一样,几乎失去了一天的工作,干杯!
П
Писаренко Алексей

如果您使用 IntelliJ Idea,您可以在选定的项目文件夹上单击鼠标右键 -> Lokal History -> 您可以看到所有文件。


这个问题没有提到 IntelliJ Idea,所以这不太可能是一个有用的答案。
这对我很有用:)
你救我。非常感谢。那是个好主意。我丢失了文件并且不记得文件的路径以通过本地历史还原它们,但是这个建议帮助我记住了结构和名称。
J
Jonathan

如果你使用 Eclipse 作为 IDE 和 EGit,你的文件中有 Team-menu:

从列表项“团队”中右键单击您的文件 - >“显示本地历史记录”

您将看到所有版本都保存在本地,没有任何保存名称,在我的情况下,您可以轻松检查 git 功能中所有未跟踪的更改并恢复丢失的代码。


a
alexei

如果您在 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,然后运行上述。通过这种方式,我成功地恢复了三分之一丢失的文件。


D
Deep

如果 IDE 是 Android Studio,则打开已更改的文件并转到 VCS -> Local History -> Show History。打开的文件将显示在那里。


O
Oscar Zhang

我正在使用 Intellij。 CTRL + z 对我有用,它会提示你“从磁盘重新加载更改”,然后点击是。


基本上撤消你的东西会让你回到你的想法。人们只希望这是一个小小的承诺。
B
Behnam Tajadini

如果您使用 android studio 来恢复您的更改(这救了我),最好的方法是:

1-右键单击您的根项目目录(您的包名称)。 2-本地历史-> 显示历史。

https://i.stack.imgur.com/nnH7y.jpg

3-还原您想要的任何更改。

希望对您有所帮助 如有任何错误,请见谅,英语不是我的母语。


S
ShankarDaruga

如果您使用的是 IDE,并且如果它具有撤消选项,则只需撤消更改,它将撤消从磁盘重新加载,这将带回您的更改。大多数 IDE / 编辑器都有这个选项。


B
BIS Tech

1) git reflog

你可以看到像下面的输出

f7de337 (HEAD -> master, origin/master) HEAD@{0}: checkout: moving from b0b3175f8890950218bba8906ffab0d6f84bf to master

2) git checkout b0b3175f8890950218bba8906ffab0d6f84bf


R
Reinhard

就像@VonC mentioned 一样,git checkout 的歧义是这里的根本原因。但是创建检查点可能会使您的存储变得一团糟,如果维护不当,最终将无法使用。

我最终只使用 git switch 而不是 git checkout 进行分支切换。是的,你需要改变你的习惯,但从我的观点来看,这是最终的解决方案。


S
Sushil88

您无法使用 git 命令执行任何操作,但如果您使用的是 IDE,那么您可以恢复您的更改。我正在使用 PhpStorm,我们可以在其中查看文件更改历史记录。只需右键单击文件,然后单击显示本地历史记录。在外部更改选项卡下,您可以找到意外删除的本地更改。