我從某倉庫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的就算改動不大也沒辦法同步?
在github上下載的原始碼預設不是git倉庫,所以你是將下載下來的程式碼初始化為一個git倉庫,這樣的倉庫是沒有任何提交歷史的。如果兩個倉庫沒有相同的歷史,是無法用
git pull
進行合併到遠端倉庫的,所以剛開始你用的那種方法會出現這樣的錯誤:但你使用
--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
指令就不會報錯了。這是把你衝突的部分標示出來了,你可以選擇保留哪個部分來解決衝突。
另外,你如果只是拷貝一份代碼不想fork,你應該直接
git clone
就好了,这样你的远程主机就还是作者那个,以后用git pull
就能保持更新這是因為修改了相同行導致GIT無法辨識並合併,這在GIT裡面叫
冲突
你需要手動解決衝突,然後commit,如何解決衝突,也請搜尋 “GIT 解決衝突”
member 的回答已經很正確了。 。
你可以使用git add -u 新增衝突檔案。然後git commit -m 提交之後再git pull
至於為什麼會出現你說的這種情況。
有可能你的程式碼是
222
這裡其實有回車或換行符號或其他的
作者版本是
111
222
333
這樣的話git就會辨識出這裡是一個衝突,而不會進行自動合併。沒有十足的把握。 git不會自動合併程式碼。
@Fighting_Bird
經過測試,你說的是對的,坑點在於原作者專案中的.gitattributes檔案裡設定了
text=auto
這個選項,如果設定裡有這個選項,git會把它所認為的文本文檔的換行符全部改成LF再提交,然後在簽出的時候再轉回來,然而我自己的專案沒有這個設置,於是沒有這個轉換操作,導致文檔換行符不同而合併失敗