首页 > 解决方案 > 需要紧急 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

完成此操作后,我被带回了上次连接到头部的状态(在我的项目中返回)。

我搞砸了吗?或者有什么办法可以让我恢复原状?

标签: gitgithubsavecommitgit-commit

解决方案


首先,你没有搞砸。当您遇到这种奇怪的情况时,最好在尝试修复之前进行完整备份(包括隐藏文件夹),以防万一。

git reflog是你的朋友,它会显示你过去所做的提交的哈希值。在您的情况下,您已经签出了 master,然后从 master 创建了一个分支,其名称是您分离头中最后一次提交的哈希值。这反过来又使git checkout提交变得困难,因为当您输入提交的哈希时,git 假定您指的是具有相同名称的分支。

我试图重新创建您的情况,并提出了一个逐步恢复丢失代码的计划:(仅在进行完整备份后尝试)

  1. git reflog找到您要恢复的提交的哈希(最有可能采用 ie "47a7bdc (HEAD -> master, 7a1.....5b7) HEAD@{3}: commit: 2" 的格式)
  2. git branch -d <"long hash you copied">这也可能是您在 reflog 中找到的哈希
  3. git checkout <the hash of the commit you want to recover>

此时,您在分离的头上拥有了最后一次提交的状态。

  1. git branch tmp <the hash of the commit you want to recover>用你的分离提交真正创建 tmp 分支,就像你可能想要的那样
  2. git checkout master回到你的主分支,因为创建一个新分支会自动更改它
  3. git merge tmp将刚刚创建的 tmp 分支合并回主分支

此时 git 可能会抱怨合并冲突,如果是这样 - 您必须手动解决这些问题,然后为该合并创建一个新的 commti。

附加提示:

  • 总是检查git status你的状态
  • 用于git log --graph --oneline --all获得视觉参考
  • 我听说一些 git GUI 会删除 reflog 信息,以避免这些问题 a) 仅使用 CLI b) 在您不确定自己在做什么的情况下总是进行完整备份

推荐阅读