一次Git的“代码走失”狂欢记

106 阅读2分钟

image.png 有一天,我在一个绝赞项目上面风风火火,刚提交了几个牛逼的功能。正准备push分享给大伙儿code review的时候,一个操作竟然让我陷入了代码丢失的恐慌中!

具体操作过程是这样的:

  1. 我在feature/foo分支上开发新功能,提交了一组改动(commit id: c5f23),但没有立即push到远程
  2. 不小心点击了IDEA的“撤销提交”操作,本想redo回来,哪知道....
  3. 我试了试redo没有成功,于是我点击了idea的回滚按钮(混合模式),将代码回退到上一个版本

image.png

  1. 这时我意识到完了,我提交的那组牛逼代码没了!分支上也找不到该提交记录,本地就真的没有那段代码了

这下傻眼了,一通瞎操作,把当前分支的最新提交给踢出去了。我意识到刚才的撤销提交和reset导致HEAD指针从最新提交的c5f23分离,变成一个游离的提交不属于任何分支,再也找不回来了!

这时候我仔细搜索,发现可以通过git reflog命令查看最近的操作记录和提交点:

c5f23 HEAD@{1}: revert: Revert "fix(修改): 一次牛逼的提交"

我找到了丢失的提交点c5f23!这把我救回来了~ 我赶紧使用下面命令创建了一个临时的新分支:

git checkout -b "branch_c5f23"

随后马不停蹄的在新分支中运行了reset命令:

 git reset --hard c5f23  

命令执行后,到branch_c5f23分支一看,代码都在!我赶紧切回feature/foo分支,完成一个拯救code的merge:

git checkout feature/foo
git merge branch_c5f23

操作成功!虽然经历了翻车,但最终靠reflog找回了分离的提交点,消除了代码丢失的灾难。

教训

这次事件让我认识到几个Git的重要概念:

  • HEAD指针的重要性 - 它决定当前代码位置
  • 分离HEAD会造成游离提交
  • reflog的作用 - 可追溯提交记录

平时要注意操作,不要让有价值的提交成为游离和不可达的状态!

Git操作有风险,一定要慎重呀。