首页 > 解决方案 > 在我进入另一个分支并返回后,我看不到我在 git 分支中所做的文件更改

问题描述

我克隆了我的存储库。从我克隆到的文件夹中创建了一个项目。对 5 个文件进行了更改,运行了测试。一切都好。然后我意识到我没有创建分支,我所有的更改都在“主”分支中。我'git add \path\to\file(s)',但我没有提交它们。我惊慌失措。我通过执行创建了一个新分支“X” git checkout -b 'X'。没有意识到,通过这样切换,所有内容已经从“主”进入“X”,根据互联网的提示,我这样做 git checkout master path/to/file(s) which were changed in master是为了将这 5 个文件带入分支“X”。现在意识到我的错误,我进入“master”查看我的文件更改。他们不在'master'或'X'分支中!当我运行时,'git status'我看到以下内容。`在分支主上你的分支在'origin/master'之前 通过 3065 次提交。(使用“git push”发布你的本地提交)

` 变化去哪儿了?如何恢复它们?这是 4 天的工作,牺牲了我的感恩节假期。有人会在这里帮助我吗?我在 IntelliJ 工作。生无可恋。非常感谢。

标签: javagit

解决方案


首先,在运行任何其他 git 命令或尝试其他任何操作之前,使用 .git 文件夹压缩整个项目。

您最简单的选择可能是使用 intelliJ 本地历史记录: https ://www.jetbrains.com/help/idea/local-history.html

据我记得,它是默认启用的,您应该可以轻松取回已删除的文件: https ://blog.jetbrains.com/idea/2008/01/using-local-history-to-restore-deleted-文件/

但是,即使使用 git,也只有一切都没有丢失。当您发出git add命令时,您已经为这些文件创建了 git blob。当你这样做时,git checkout master .它们不再在 git 索引中,但在 git 进行垃圾收集之前,它们仍然物理地在 .git 中。

我尝试在本地对您的情况进行建模,在使用另一个分支的更改更新本地索引后,我看到以下悬空 blob 代表先前添加的文件:

$ git fsck
Checking object directories: 100% (256/256), done.
dangling tree 4b825dc642cb6eb9a060e54bf8d69288fbee4904
dangling blob f2734a2fe05bfe4293d5a408c7e2ce849cbc62b2

我做到了git fsck --lost-found,在.git\lost-found\other\f2734a2fe05bfe4293d5a408c7e2ce849cbc62b2文件中我确实找到了更新的测试文件的内容。

您可以在免费的 Pro Git 书籍的Git Internals - Plumbing and Porcelain一章中找到有关 git 如何在内部存储内容的更多信息。它还提供了许多有用的低级命令,可以在紧急情况下为您提供帮助。

为了确保这种情况不再发生,我建议使用 Git Tools - Reset Demystified一章。git checkout它解释了不同命令行选项、git reset带/不带路径、带/不带分支的确切行为。


推荐阅读