意外地在git中运行了命令checkout -B“branchname”

时间:2017-04-12 12:46:35

标签: git git-extensions

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

编辑: 运行git reflog后我的日志 enter image description here

2 个答案:

答案 0 :(得分:1)

注意:建议@MarcinOrlowski,首先进行包含.git文件夹的备份。

由于您的评论中不仅有一个文件,git checkout HEAD /your/file/path无效。但是,您可以尝试

git checkout -

如果不起作用,请尝试

git reset --hard HEAD

答案 1 :(得分:1)

好的,第一步是放松一下:只要你 运行Item,你的代码就不会消失!

git commit 创建或重新设置 给定 branchname 的作用。鉴于你提到的其他内容,我相信你实际上运行了git checkout -B branchname,其中(由于多种相互交织的原因)最终会产生git checkout -B UIUpdates origin/UIUpdates的效果。

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

git reset --hard UIUpdates

看起来好像你自己的提交可以从井号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 ... 到达。你可以运行:

5fc98bc

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

我们说这是正确的(这是我在整个git log 5fc98bc 输出图片中看到的唯一commit行,git reflog,紧接着是由HEAD@{6}编写的HEAD@{5}行,您当前没有名为git checkout -B的分支,因此该名称可用。然后你可以运行:

saveme

将名称git branch saveme 5fc98bc 附加到其中。现在saveme将显示提交,git log saveme将使您进入包含这些提交的分支。

理解所有这一切的关键是要知道在Git中,分支名称只是Git进入提交图的方式。名称只记录哈希ID(那些难以理解的字符串,如git checkout saveme)。这些ID实际上很重要;我们人类只需要名称

提交图表示每次提交到存储库的提交,Git通常做的是添加新提交。即使您使用明显具有破坏性的命令(例如5fc98bc)也是如此。提交本身被破坏,它们变得更难找到。但分支名称也保护提交;最终,如果他们“太难找到”,Git会垃圾收集他们并将它们扔出去。具有标识提交的分支(或标记)名称​​保护从此Grim Reaper 收集器提交,并且还保护可从到达的所有提交提交。

http://think-like-a-git.net/对此进行了详细介绍,因此您可能需要花一些时间阅读这些页面。