紧急 Git 需要帮助 - 丢失了大部分提交

Urgent Git help needed - lost most commits

所以我在做一个项目,早期我不小心脱离了 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 个十六进制字符结尾的引用

git merge tmp

这里git说"already up to date"

git branch -d tmp

输出:删除分支 tmp

这样做之后,我又回到了上次连接到头部的状态(wayyy 回到我的项目中)。

我搞砸了吗?或者有什么方法可以让我恢复原来的状态?

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

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

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

  1. git reflog 找到您要恢复的提交的哈希值(最有可能的格式是“47a7bdc (HEAD -> master, 7a1.....5b7) HEAD@{3}:提交:2" )
  2. git branch -d <"long hash you copied"> 这也可能是您在 reflog
  3. 中找到的哈希
  4. 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 回到你的 master 分支,因为创建一个新分支会自动改变它
  3. git merge tmp将刚刚创建的tmp分支合并回master分支

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

其他提示:

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