我从某仓库A直接download了一份代码,然后自己建立了仓库B,注意,不是fork出来的,当时图方便,结果我现在希望从仓库A里同步一下作者最新的代码,然后就发现网上的同步办法没有用
https://segmentfault.com/q/10...
我用的这个方法,先是报fatal: refusing to merge unrelated histories
google了以后我就加了--allow-unrelated-histories参数
这下倒是能跑起来,然后合并源码的结果哭笑不得,git似乎无法识别这种情况下的源码差别,比如有个代码文件我完全没改过,是源作者自己更新了
我的版本是
111
222
作者版本是
111
222
333
理论上合并应该直接把333合并到我的源码就行了,但是,git这种情况里认为我的内容和作者的内容是完全不同的两份,于是它把代码变成了这样
<<<<<<<<<head
111
222
========
111
222
333
>>>>>>>>>>aasdasfsdfsdf
为啥会这样呢,没有解决办法吗,只有fork有办法同步源仓库吗,非fork的哪怕改动不大也没法同步?
在github上下载的源码默认不是git仓库,所以你是将下载下来的代码初始化为一个git仓库,这样的仓库是没有任何提交历史的。如果两个仓库没有相同的历史,是无法用
git pull
进行合并到远程仓库的,所以刚开始你用的那种方法会出现这样的错误:但是你使用
--allow-unrelated-histories
选项强制进行合并,的确是解决了这个问题。但是,你后续出现的那个问题是很正常的,git并没有认为你的内容和作者的内容是完全不同的两份,只是二者产生了冲突,即在相同的地方出现了差异。遇到冲突,手动解决就可以了。而且据我猜测,之所以会产生冲突,很可能是windows换行符和Unix换行符不统一的原因(当然我们肉眼是看不出来的),这个就看你在git设置如何处理换行符了。也许远程仓库换行符统一使用的是Unix换行符(LF)或者windows换行符(CLF),而你恰好相反。关于在git设置如何处理换行符,可以参考github的官方帮助文档,当然网上也有很多资料。
另外,就像前面大神所说的,最好使用
git clone
命令直接克隆仓库,这样就可以保留仓库的历史提交,使用git pull
命令就不会报错了。