git - 需要紧急 Git 帮助 - 丢失了大多数提交
问题描述
所以我在做一个项目,一开始我不小心脱离了 Head,但我仍然保持提交等。然后我意识到我与头部分离,所以我尝试执行以下操作以重新连接到头部:
git log -n 1 (I copied the commit)
git checkout master
git branch (long hash I copied)
git merge tmp (here I realize I forgot to name the branch so I typed again:
git branch tmp (long has I copied)
我在这里收到关于重命名(长哈希)如何不明确的警告,Git 通常从不创建以 40 个十六进制字符结尾的 ref
git merge tmp
这里git说“已经是最新的”
git branch -d tmp
输出:已删除的分支 tmp
完成此操作后,我被带回了上次连接到头部的状态(在我的项目中返回)。
我搞砸了吗?或者有什么办法可以让我恢复原状?
解决方案
首先,你没有搞砸。当您遇到这种奇怪的情况时,最好在尝试修复之前进行完整备份(包括隐藏文件夹),以防万一。
git reflog
是你的朋友,它会显示你过去所做的提交的哈希值。在您的情况下,您已经签出了 master,然后从 master 创建了一个分支,其名称是您分离头中最后一次提交的哈希值。这反过来又使git checkout
提交变得困难,因为当您输入提交的哈希时,git 假定您指的是具有相同名称的分支。
我试图重新创建您的情况,并提出了一个逐步恢复丢失代码的计划:(仅在进行完整备份后尝试)
git reflog
找到您要恢复的提交的哈希(最有可能采用 ie "47a7bdc (HEAD -> master, 7a1.....5b7) HEAD@{3}: commit: 2" 的格式)git branch -d <"long hash you copied">
这也可能是您在 reflog 中找到的哈希git checkout <the hash of the commit you want to recover>
此时,您在分离的头上拥有了最后一次提交的状态。
git branch tmp <the hash of the commit you want to recover>
用你的分离提交真正创建 tmp 分支,就像你可能想要的那样git checkout master
回到你的主分支,因为创建一个新分支会自动更改它git merge tmp
将刚刚创建的 tmp 分支合并回主分支
此时 git 可能会抱怨合并冲突,如果是这样 - 您必须手动解决这些问题,然后为该合并创建一个新的 commti。
附加提示:
- 总是检查
git status
你的状态 - 用于
git log --graph --oneline --all
获得视觉参考 - 我听说一些 git GUI 会删除 reflog 信息,以避免这些问题 a) 仅使用 CLI b) 在您不确定自己在做什么的情况下总是进行完整备份
推荐阅读
- javascript - 网页性能分析
- reactjs - 制作由 Formik 控制的 DraftJS 编辑器:字符串值不能很好地转换为 EditorState
- swift - 如何以编程方式从 TableView 执行 segue
- inversion-of-control - 使用类
作为 Haxe 中的 Map 键 - javascript - 如何使用默认导出在 TypeScript 类型中描述 JavaScript 类静态工厂方法?
- node.js - Node/Express:使用异步等待的 API
- python - 为什么 pygame 需要 time.sleep 在退出之前播放声音?
- excel - 根据 Excel 标准对最大值求和
- javascript - Javascript 装饰器监听器
- angular - FormGroup 指令如何在模板驱动的表单中使用?