suchen

Heim  >  Fragen und Antworten  >  Hauptteil

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

我从某仓库A直接download了一份代码,然后自己建立了仓库B,注意,不是fork出来的,当时图方便,结果我现在希望从仓库A里同步一下作者最新的代码,然后就发现网上的同步办法没有用
/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的哪怕改动不大也没法同步?

PHPzPHPz2770 Tage vor856

Antworte allen(5)Ich werde antworten

  • PHPz

    PHPz2017-05-02 09:47:39

    在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命令就不会报错了。

    Antwort
    0
  • 天蓬老师

    天蓬老师2017-05-02 09:47:39

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

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

    Antwort
    0
  • 黄舟

    黄舟2017-05-02 09:47:39

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

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

    Antwort
    0
  • 怪我咯

    怪我咯2017-05-02 09:47:39

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

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

    作者版本是
    111
    222
    333

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

    Antwort
    0
  • PHPz

    PHPz2017-05-02 09:47:39

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

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

    Antwort
    0
  • StornierenAntwort