日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

多人开发时Git下冲突的产生和解决

發布時間:2025/3/21 编程问答 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 多人开发时Git下冲突的产生和解决 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

沖突的產生

很多命令都可能出現沖突,但從根本上來講,都是merge 和 patch(應用補丁)時產生沖突。

而rebase就是重新設置基準,然后應用補丁的過程,所以也會沖突。

git pull會自動merge,repo sync會自動rebase,所以git pull和repo sync也會產生沖突。當然git rebase就更不用說了。

沖突的類型

邏輯沖突

git自動處理(合并/應用補丁)成功,但是邏輯上是有問題的。

比如另外一個人修改了文件名,但我還使用老的文件名,這種情況下自動處理是能成功的,但實際上是有問題的。

又比如,函數返回值含義變化,但我還使用老的含義,這種情況自動處理成功,但可能隱藏著重大BUG。這種問題,主要通過自動化測試來保障。所以最好是能夠寫出比較完備的自動化測試用例。

這種沖突的解決,就是做一次BUG修正。不是真正解決git報告的沖突。

內容沖突

兩個用戶修改了同一個文件的同一塊區域,git會報告內容沖突。我們常見的都是這種,后面的解決辦法也主要針對這種沖突。

樹沖突

文件名修改造成的沖突,稱為樹沖突。

比如,a用戶把文件改名為a.c,b用戶把同一個文件改名為b.c,那么b將這兩個commit合并時,會產生沖突。

$ git statusadded by us:??? b.cboth deleted:???origin-name.cadded by them:??a.c

如果最終確定用b.c,那么解決辦法如下:

git?rm?a.c git?rm?origin-name.c git add b.c git commit

執行前面兩個git rm時,會告警“file-name : needs merge”,可以不必理會。

樹沖突也可以用git mergetool來解決,但整個解決過程是在交互式問答中完成的,用d 刪除不要的文件,用c保留需要的文件。

最后執行git commit提交即可。

內容沖突的解決辦法

發現沖突

一般來講,出現沖突時都會有“CONFLICT”字樣:

$ git pull Auto-merging?test.txt CONFLICT (content):?Merge conflict?in?test.txt Automatic merge failed; fix conflicts?and?then?commit the result.

但是,也有例外,repo sync的報錯,可能并不是直接提示沖突,而是下面這樣:

error:?project mini/sample

注:無論是否存在沖突,只要本地修改不是基于服務器最新的,它都可能報告這個錯誤,解決方法都是一樣。

這個時候,需要進入報錯的項目(git庫)目錄,然后執行git rebase解決:

git rebase remote-branch-name

沖突解決的一般過程

merge/patch的沖突解決

先編輯沖突,然后git commit提交。

注:對于git來講,編輯沖突跟平時的修改代碼沒什么差異。修改完成后,都是要把修改添加到緩存,然后commit。

rebase的沖突解決

rebase的沖突解決過程,就是解決每個應用補丁沖突的過程。

解決完一個補丁應用的沖突后,執行下面命令標記沖突已解決(也就是把修改內容加入緩存):

git add?-u

注:-u 表示把所有已track的文件的新的修改加入緩存,但不加入新的文件。

然后執行下面命令繼續rebase:

git rebase?--continue

有沖突繼續解決,重復這這些步驟,直到rebase完成。

如果中間遇到某個補丁不需要應用,可以用下面命令忽略:

git rebase?--skip

如果想回到rebase執行之前的狀態,可以執行:

git rebase?--abort

注:rebase之后,不需要執行commit,也不存在新的修改需要提交,都是git自動完成。

編輯沖突的方法

直接編輯沖突文件

沖突產生后,文件系統中沖突了的文件(這里是test.txt)里面的內容會顯示為類似下面這樣:

a123 <<<<<<<?HEAD b789 ======= b45678910 >>>>>>>?6853e5ff961e684d3a6c02d4d06183b5ff330dcc c

其中:沖突標記<<<<<<< (7個<)與=======之間的內容是我的修改,=======與>>>>>>>之間的內容是別人的修改。

此時,還沒有任何其它垃圾文件產生。

最簡單的編輯沖突的辦法,就是直接編輯沖突了的文件(test.txt),把沖突標記刪掉,把沖突解決正確。

利用圖形界面工具解決沖突

如果要解決的沖突很多,且比較復雜,圖形界面的沖突解決工具就顯得很重要了。

執行git mergetool用預先配置的Beyond Compare解決沖突:

$ git mergetool Merging: test.txtNormal merge conflict?for?'test.txt':{local}:?modified{remote}:?modified

?

上面三個窗口依次是“LOCAL”、“BASE”、“REMOTE”,它們只是提供解決沖突需要的信息,是無法編輯的。

下面一個窗口是合并后的結果,可以手動修改,也可以點擊相應顏色的箭頭選擇“LOCAL”或者“REMOTE”。

在Beyond Compare中修改沖突保存后,沖突文件(test.txt)中的沖突標記就沒有了,成了修改后的內容,一個文件的沖突編輯就完成了。

注意:

啟動Beyond Compare之后,會自動生成幾個包含大寫字母名稱、數字的輔助文件:

關閉Beyond Compare時,這幾個輔助文件都會自動刪除,但同時會生成一個test.txt.orig的文件,內容是解決沖突前的沖突現場。

默認該.orig文件可能不會自動刪除,需要手動刪掉。

出自:http://www.cnblogs.com/sinojelly/archive/2011/08/07/2130172.html

總結

以上是生活随笔為你收集整理的多人开发时Git下冲突的产生和解决的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。