1. 程式人生 > >多人開發時Git下衝突的產生和解決

多人開發時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 status
    added by us:    b.c
    both deleted:   origin-name.c
    added 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.txt

Normal 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檔案可能不會自動刪除,需要手動刪掉。

相關推薦

開發Git衝突產生解決

衝突的產生 很多命令都可能出現衝突,但從根本上來講,都是merge 和 patch(應用補丁)時產生衝突。 而rebase就是重新設定基準,然後應用補丁的過程,所以也會衝突。 git pull會自動merge,repo sync會自動rebase,所以git pul

Laravel框架的PHP網站GIT開發

一、環境搭建 需要的軟體包括:Mysql(資料庫)、Git(GitHub管理程式碼)、Nginx(本地執行環境)、Php、Notepad++(編輯軟體)、phpMyAdmin(執行需要)。電腦路徑配置path: 二、使用GitHub下載程式碼 將URL貼上到此處即可

從程式碼結構優化redis快取的方式, 還在為開發專案混亂的redis key煩惱嘛?

我們目前資料層次按照效能來分    頂層 : redis     中間層: es     底層: mysql 目前針對一些比較繁瑣棘手的, 但是可以花點時間

Git分支開發過程中處理衝突的經驗教訓

最近在專案開發中遇到一個問題,不同分支的程式碼產生大量衝突,導致合併麻煩。這也算是一個教訓。值得記錄下來反思。 不同分支程式碼的衝突問題 已上線分支為 master,我負責的分支為 A,另外有人負責的分支是 B,恰恰因為專案需求的原因,A 和 B 分支上的某個類會被我們同時改動

git如何利用分支進行開發

轉 ::https://www.cnblogs.com/kexianting/p/8525732.html   在使用git時,假如遠端倉庫有 dev 和 master 兩個分支,master 作為一個穩定版分支,可用於直接釋出產品,日常的開

git開發步驟

第一步,先提交自己的修改到自己的分支 第二步,下載master分支的內容 第三步,合併master到自己的分支 第四步,驗證以及解決衝突 第五步,把自己的分支合併到master 第六步,推送master分支 第七步,切換會自己的分支

GIT進行開發的模擬流程

一、準備環境 win:開發者一,本機windows lin:開發者二,虛擬機器linux project:使用github的公共倉庫 因為兩臺主機都將金鑰放在了倉庫擁有者,所以兩邊遠端提交程式碼後都將直接合併到分支 二、模擬一次流程 1. 拉取專案到本地 

Docker模擬協作進行Git操作

git dcoker laravel 今天我們利用Docker模擬出兩個終端,來進行git提交操作開始前的準備1.安裝docker應用,命令行輸入docker -v如果出現上面的提示就說明docker下載成功了!然後讓我們啟動docker服務service docker start接下來我們要拉取

GitHub之開發一個項目

github上 工具 andro itl lac 知識庫 clas color 寫代碼 首先我們要簡單知道github跟Git的區別。git是版本控制工具, github是一個面向開源及私有軟件項目的托管平臺,也是程序員交流的地方。 接下來就開始講怎麽多人一起開發

css-modules [webpack4x] (開發防止全域性汙染)

Css-modules作用:   簡介: 用人話說, 類似於將原類名 .bs 自動生成為 .btn-bs-3uUDV   優點: 因為是雜湊運算, 所以每次引用都會自動生成一個新的雜湊, 多人開發時候不會類名衝突, 不用打字首   此文配置依賴構建工具: webpack 4x step1 

css-modules [webpack4x] (開發防止全局汙染)

amp step -m 效果 -s select 簡介 bubuko info Css-modules作用:   簡介: 用人話說, 類似於將原類名 .bs 自動生成為 .btn-bs-3uUDV   優點: 因為是哈希運算, 所以每次引用都會自動生成一個新的哈希, 多人開

開發的基礎---元件化程式設計,仿COM篇

引言:     在大型專案的開發中,隨著開發進度的進行,我們經常碰到模組之間耦合度太高的問題:由於開發人員經常要在別的模組中呼叫自己實現的功能,經常隨意在某個函式中隨意新增呼叫程式碼,造成了被修改的那個函式體過長,邏輯混亂。另一個問題是隨意包含標頭檔案:開發人員在開發中經常

理解git衝突產生的原因

例子一 1.master 新建檔案1.txt。 111 bug code 2.切出功能分支test,此時內容保持不變。同時開發了一點新的功能。 111 bug code new code int test 3.此時發現:master上的程式碼有bug,緊急修復了b

iOS開發 - 不小心刪除了Copy Bundle Resources怎麼辦?(開發頻繁新增刪除圖片導致圖片路徑重複,編譯報錯)

Copy Bundle Resources在iOS中至關重要,如果一不小心刪除了這一項,整個工程就廢了,無法執行。Copy Bundle Resources存在於Build Phases中,一般來說很少會有人注意到它,即使不小心刪除了也很難發現少了什麼,何況是不小心刪除的,就更不知道怎麼

SourceTree最新使用方法以及github開發方法

SourceTree基本使用 好久沒有使用過gitHub管理專案了,今天得閒總結下最新版本的使用教程: (以下以SourceTree For Mac V2.3.2中文版為例,託管平臺以Github為例) 1.百度搜索SourceTree進行下載安裝,不解釋了. 2

(轉載)如何用PHP開發一個完整的網站 講解開發流程 開發

引言: 一個清楚的目標定位學習 PHP 才更有動力和方向,約有 30% 的 PHPer 因為學習到一半而沒有明確的方向而最終放棄或擱淺。 手頭收藏一些好的常用類或方法,能提高我們的開發的速度。如:分頁、上傳、字元過濾、資料庫操作、生成 HTML HTML HTML 、檔

Android studio與github的使用(開發原始碼同步問題)

之前和朋友一起寫一個Android APP,程式碼不算難,只是要我們一起寫,這就出了一些程式碼合併上以及同步的問題。 今天講的主要是GitHub上分支保持與主幹原始碼同步的問題。 之前使用的時候就是專案掛在筆者的GitHub上,別人修改的程式碼提交一個pull reque

高德或者微信SHA1 除錯,正式keystore。開發共享SHA1。

1、做正式版本的KeyStore時,生成時,一定要將 MD5 : 和 SHA1: 儲存起來。否則後期需要用指令獲取。 2、高德地圖除錯SHA1 獲取 Windows:依次在 eclipse 中開啟 Window -> Preferan

使用github進行開發

1.開發的一個人先將專案先提交到github上。 2.其他開發人員該專案fork到自己的github上。 3.其他的開發人員在自己的github上修改了之後,然後pull request相關的commit。 4.建立專案者可以選擇是否合併專案。

碼雲上傳(單人與開發的不同)

先來一個不規範的上傳碼雲,一般用於單人開發。git pull 從服務端抓取git add *        新增全部git commit -m “xxx”   提交  xxx為提示資訊git push -u origin master (或git push)詳細:1.