git里有没有办法正确合并两个仓库的代码

我从某仓库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的哪怕改动不大也没法同步?

阅读 11.7k
5 个回答

在github上下载的源码默认不是git仓库,所以你是将下载下来的代码初始化为一个git仓库,这样的仓库是没有任何提交历史的。如果两个仓库没有相同的历史,是无法用git pull进行合并到远程仓库的,所以刚开始你用的那种方法会出现这样的错误:

refusing to merge unrelated histories

但是你使用--allow-unrelated-histories选项强制进行合并,的确是解决了这个问题。
但是,你后续出现的那个问题是很正常的,git并没有认为你的内容和作者的内容是完全不同的两份,只是二者产生了冲突,即在相同的地方出现了差异。遇到冲突,手动解决就可以了。而且据我猜测,之所以会产生冲突,很可能是windows换行符和Unix换行符不统一的原因(当然我们肉眼是看不出来的),这个就看你在git设置如何处理换行符了。也许远程仓库换行符统一使用的是Unix换行符(LF)或者windows换行符(CLF),而你恰好相反。关于在git设置如何处理换行符,可以参考github的官方帮助文档,当然网上也有很多资料。
另外,就像前面大神所说的,最好使用git clone命令直接克隆仓库,这样就可以保留仓库的历史提交,使用git pull命令就不会报错了。

这是因为修改了相同行导致GIT无法识别并合并,这在GIT里面叫 冲突

你需要手动解决冲突,然后commit,如何解决冲突,还请搜索 「GIT 解决冲突」

这是把你冲突的部分标示出来了,你可以选择保留哪个部分来解决冲突。

另外,你如果只是拷贝一份代码不想fork,你应该直接git clone就好了,这样你的远程主机就还是作者那个,以后用git pull就能保持更新

member 的回答已经很正确了。。
你可以使用git add -u 添加冲突文件。然后git commit -m 提交之后再git pull
至于为什么会出现你说的这种情况。
有可能你的代码是

222
这里其实有回车或者换行符号或者其他的

作者版本是
111
222
333

这样的话git就会识别这里是一个冲突,而不会进行自动合并。没有十足的把握。git不会自动合并代码。

@Fighting_Bird
经过测试,你说的是对的,坑点在于原作者项目中的.gitattributes文件里设置了

  • text=auto
    这个选项,如果设置里有这个选项,git会把它所认为的文本文档的换行符全部改成LF再提交,然后在签出的时候再转回来,然而我自己的项目没有这个设置,于是没有这个转换操作,导致文档换行符不同而合并失败

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
logo
Microsoft
子站问答
访问
宣传栏