git强制push怎么恢复

以前看过一个段子,说硅谷的一名码农因为git push -f强行抹掉了同事的提交记录而被枪杀。

万万没想到我今天也碰上这样的事故😭。

前情提要

事情是这样的,我检查出一个接口经过中间件处理出现了异常,在调试过程中,通过回滚代码库版本来寻找这个错误是什么时候添加的,然后回滚到了昨天的记录,这时产品过来找我商量他的设计的事情,于是我一边摘下耳机一边按了个pu(我是想按pull的)。因为zsh补正到我上一次使用的命令正好是强制推送,结果等我回过神来手指已经动完了。

心存一丝侥幸的我赶紧打开公司的gitlab,不出意料地今天辛苦耕耘的成吨代码提交记录消失的一干二净——😱

我的第一反应就是打开谷歌(在中国,翻墙是违法的),recover git push force几个单词甩到谷歌脸上去,连续狂翻好几页,找到了一个解决方案

正文

首先明确一点,即使你强行覆盖了代码库,你的提交记录也不会回滚。虽然你在对应分支的代码库提交记录上只能看到强制推送的版本及其之前的记录,但是你的个人commit记录还是存在的。

因此,不要慌,先右上角点开你的头像,找到Profile,然后下面的Activity记录了你今天提交的一举一动。

每次提交都会生成一段哈希码,如下图的5c39eaea

点击这个链接,会打开跳到记录你提交情况的diff增量页面,手动在网址最后加上.patch,就会得到一条补丁记录。右键保存到本地文件比如叫001.patch。把你需要恢复的commit逐一按时间升序如此操作,这样就得到了补丁序列。

接下来,你可以在shell里使用git am 001.patch来将增量更新补回本地分支里,记得按时间升序的顺序打补丁哦!如果版本没对上,导致patch failed,可以手动到对应文件的路径,找到冲突生成的文件,对比修改;或者执行git am --abort取消补丁,然后切换到正确的版本。

或者,也可以通过JetBrains家的IDE,直接把补丁文件拖动到IDE中,就会自动合并,即使出现了冲突,也可以以图形化界面来查看解决冲突问题。

最后,重新commit一下,push回代码库即可。

闲话

如果那个码农被枪击的段子是真的,那他死的真是太悲惨了,如果知道这种解决方式说不定还能活下来。

经验告诉我们,提交代码还是不要掉以轻心。幸好此次事故是发生在我自己的分支上,一天工作差点泡汤我都心累不已;要是和别人合作的情况下把对方的提交记录给覆盖了,可能真的要被人给打死XD


gitchore

1204 Words

2020-03-07 06:54 +0800