大战git五百回合

前言

昨晚真是惊心动魄的一晚,被一个简单的pull报错坑了,导致整个repo的文件不翼而飞,而且还没有在远端备份。不过抱着git会保留所有历史的想法,不停搜索解决方案把文件找回来了。

过程

GitHub对普通用户开放了private repo,所以想把一个gitee的项目搬过来。

git remote remove origin
git remote add origin git@github.com:yifanc62/SomeProject.git
git pull origin master

哦豁,报错了:
Fatal: refusing to merge unrelated histories

因为GitHub的repo在建立的时候初始化了一个README,有一个Initial commit,两边历史冲突了,所以不能直接合并。
阴差阳错看到了一篇文章:
fatal: refusing to merge unrelated histories 解决方案

文章里说,要这样:git pull --rebase origin master
恰好我刚刚看过一篇讲rebase的文章,详细的解释了rebase和merge的区别:
git rebase vs git merge详解

我觉得靠谱,于是就直接执行了,这下可有意思了,玩了一发大的,我一看又报错了,而且打开文件夹一看,我repo的文件就剩个README了。
这对于年幼的我实在是个巨大的打击,但是不能慌,在查找解决办法之后,发现是rebase执行到了一半报错,文件有冲突,需要解决merge问题然后继续,整个问题和这篇文章十分类似:
把本地的git仓库合并上传到远程某个git仓库

妈的,gitee自动生成这个README跟GitHub那个不一样。
解决了冲突以后可以继续:git rebase --continue,发现文件都回来了。
最麻烦的事情出现了,这时候用VS打开项目,发现全是Error,细一看,两个文件丢了。
怪我,我给这俩文件的namespace起名叫Log,gitignore里边恰好有这么一行“[Ll]og\”,他把这俩文件给我标记成deleted了,我甚至之后还commit了。
最后发现git可以强制回退所有操作:
Can I get back deleted files after using git rebase?

最后在多个HEAD里找,终于找到那俩文件了,心累。中间踩了不少坑,根据删除的文件查找记录什么的,没起任何作用。

附图:history

history

教训

  • 慎用git rebase
  • 你觉得能merge,git不觉得
  • gitignore文件不一定非要使用GitHub提供的版本,要打开检查有没有冲突