不小心 运行 命令 checkout -B "branchname" in git

Accidentally ran command checkout -B "branchname" in git

我需要提交并推送我的代码。但是在 git 扩展中,在尝试推送代码时,我遇到了一个错误,我不小心点击了一个按钮,我的代码消失了。我去了 git extension log 并检查了执行的命令。 checkout -B "mybranch" 已执行。现在我的整个代码都不见了。如何取回?

编辑: 运行 git reflog 后我的日志

注意: 按照 @MarcinOrlowski 的建议,先备份 .git 文件夹。

因为它不仅是您在评论中所说的一个文件,所以 git checkout HEAD /your/file/path 不会起作用。不过,你可以试试

git checkout -

如果不行试试

git reset --hard HEAD

OK,第一步放松一点:只要你做了运行git commit,你的代码是没走!

git checkout -B <em>b运行chname</em> 所做的是 创建或重新设置给定的b运行chname。考虑到你提到的其他内容,我相信你实际上 运行 git checkout -B UIUpdates origin/UIUpdates,(出于多种相互交织的原因)最终产生了 git reset --hard UIUpdates.

的效果

根据您的 reflog 中的内容(在编辑中):

ec1226b HEAD@{0}: checkout: moving from UIUpdates to UIUpdates
...
ec1226b HEAD@{5}: branch: Reset to origin/UIUpdates
5fc98bc HEAD@{6}: commit: issues and questions templates.
ec1226b HEAD@{7}: checkout: moving from UIUpdates to UIUpdates
ec1226b HEAD@{8}: branch: Reset to origin/UIUpdates
9a4c4ef HEAD@{9}: checkout: moving from UIUpdates to UIUpdates
...

看起来您自己的提交可能可以从哈希 ID 5fc98bc 访问。你可以 运行:

git log 5fc98bc

验证一下。如果看起来不错,您应该将 new 名称附加到此提交,以便您更轻松地引用它,并确保它的保留时间比您到达的默认 30 天更长从错误中恢复过来。

假设这是正确的(这是我在整个 git reflog 输出图像 中看到的唯一 commit 行,因为 HEAD@{6} , 它后面紧跟着 git checkout -B) 写的 HEAD@{5} 行,并且您当前没有名为 saveme 的 b运行ch,因此此名称可用。然后你可以 运行:

git branch saveme 5fc98bc

将名称 saveme 附加到它。现在 git log saveme 将显示提交,git checkout saveme 将带您进入包含这些提交的 b运行ch。


理解所有这些的关键是要知道在 Git 中,b运行ch names 只是 Git 拥有的方式进入 提交图 。这些名称只是记录哈希 ID(那些难以理解的字符串,如 5fc98bc)。真正重要的是 ID;我们人类只需要名字

提交图表示曾经添加到您的存储库中的每个提交,Git 通常所做的是 添加新提交。即使您使用 git reset 这样明显具有破坏性的命令也是如此。提交本身 没有 被销毁,它们只是变得更难找到。但是 b运行ch names 也 protect 提交;最终,如果它们是 "too hard to find",Git 将 垃圾收集 它们并将它们真正扔掉。拥有一个标识提交的 b运行ch(或标签)名称 protects 从这个 Grim Reaper Collector 提交,并且还保护所有提交 可从 提交。

http://think-like-a-git.net/ 中对此进行了很好的描述,因此您可能需要花一些时间阅读这些页面。