搜尋

首頁  >  問答  >  主體

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的就算改動不大也沒辦法同步?

PHPzPHPz2768 天前852

全部回覆(5)我來回復

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

    回覆
    0
  • 天蓬老师

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

    這是把你衝突的部分標示出來了,你可以選擇保留哪個部分來解決衝突。

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

    回覆
    0
  • 黄舟

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

    這是因為修改了相同行導致GIT無法辨識並合併,這在GIT裡面叫 冲突

    你需要手動解決衝突,然後commit,如何解決衝突,也請搜尋 “GIT 解決衝突”

    回覆
    0
  • 怪我咯

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

    member 的回答已經很正確了。 。
    你可以使用git add -u 新增衝突檔案。然後git commit -m 提交之後再git pull
    至於為什麼會出現你說的這種情況。
    有可能你的程式碼是

    222
    這裡其實有回車或換行符號或其他的

    作者版本是
    111
    222
    333

    這樣的話git就會辨識出這裡是一個衝突,而不會進行自動合併。沒有十足的把握。 git不會自動合併程式碼。

    回覆
    0
  • PHPz

    PHPz2017-05-02 09:47:39

    @Fighting_Bird
    經過測試,你說的是對的,坑點在於原作者專案中的.gitattributes檔案裡設定了

    • text=auto
      這個選項,如果設定裡有這個選項,git會把它所認為的文本文檔的換行符全部改成LF再提交,然後在簽出的時候再轉回來,然而我自己的專案沒有這個設置,於是沒有這個轉換操作,導致文檔換行符不同而合併失敗

    回覆
    0
  • 取消回覆