Visual Studio C# 利用git和Github協同開發時產生沖突的解決辦法
- 前言:在前兩天的助教作業中,發現了自己沒有辦法解決在用vs開發C#的窗體項目的過程中產生的沖突問題,在查閱了資料,詢問了一些人以后,總結一下,不知道是否完全正確,但基本上可以解決大部分沖突。
- 過程使用工具列表:
-
-
- git
- github
- Visual Studio
- TortoiseGit
-
3. 其中TortoiseGit只是輔助工具,在本次博客中描述的所有利用TortoiseGit進行的操作都可以使用git進行相應的操作,其中的對應關系,在熟練掌握git命令行以后就會明白,這里就不一一介紹了,因為TortoiseGit是圖形化界面,所以放在這里易於理解。
1、第一步:擁有個人的Github賬號,並創建一個倉庫
1.1 在注冊成功個人的Github賬號以后,可以看到如下界面,點擊"New"即創建新倉庫,進入下一界面

1.2 進入創建新倉庫的界面,接下來就是按照圖中的描述,將各信息填完,未說明的部分默認就可以。填完信息以后點擊“Create repository”即可。

1.3 接下來會自動進入倉庫界面,在這個界面可以對倉庫進行一些簡單的管理, 這次不介紹其他功能,單純介紹如何解決協同開發過程中產生的沖突。

2、第二步:協同開發
2.1 這里為了模擬協同開發,我在本地重新創建了兩個文件夾,用來模擬兩個程序員在合作開發本次項目。

2.2 接下來就是從Github上將倉庫克隆到本地的這兩個文件夾內。
2.2.1 先復制倉庫地址

2.2.2 在test1文件內右擊空白處,可以看到“Git Bash here”,點擊以后進入git的命令行界面。

2.2.3 接下來按照圖片中的介紹克隆遠程倉庫到本地

文件test2也做相同的操作
這樣

2.3 這樣兩個文件夾內都是最新的倉庫的版本。接下來我們創建一下分支。
2.3.1 首先我們先創建一個dev分支,並同步到遠程,這個分支是兩個人的共同的主開發分支

2.3.2 接下來在兩個倉庫內為每個倉庫都創建一個個人的開發分支,並同步到遠程,這里我為test1文件夾里的倉庫創建了分支dev-01,為test2文件夾里的倉庫創建了分支dev-02,具體操作跟上面創建主開發分支一樣

2.3.3 接下來在每個文件夾內都切換至對應的個人分支,在個人分支里進行開發,隨后的推送也應該推送到個人的分支,也就是dev-01和dev-02,而不要直接推送至dev分支。
2.4 接下來就是具體的開發過程
2.4.1 先 test1 內添加一個新項目。項目的初始結構如圖所示。

2.4.2 接下來就是用git的一系列操作,add-> commit-> push ,這里我用TortoiseGit,
先是添加。

然后會出現一個文件的列表,直接點確定就可以了。然后會出現如下界面

可以直接點確定旁邊的提交,也可以點擊確定退出這個界面,從右鍵的菜單中進入提交界面


出現下面的界面,即表示提交成功

接下來,因為我們遠端還有一個github替我們管理着倉庫,所以我們還要同步到遠端的個人分支上
右鍵菜單中選擇“同步”

接下來點擊推送即可,這里要注意遠端分支是否為個人的開發分支,然后origin的值是否是遠端的倉庫地址,一般按照前面的操作來,這里的數據就是正確的,如果有錯誤,可以檢查一下這兩個值

推送成功后,就會出現如下畫面

2.5 接下來是展示一下如何在遠端的Github上進行merge的操作。
2.5.1 如圖所示,點擊 “New pull request”

2.5.2 即使前面沒有切換到個人的開發分支,也可以在任意一個分支內點擊“New pull request”,按照圖片所示,還是可以在下圖的界面中切換分支的。點擊“create pull request”

2.5.3 接下來點擊“Merge pull request”,然后會讓你確認一下,繼續點擊“confirm merge”就可以了


2.5.4 出現如下界面即表示merge成功了

2.6 接下來就是用test2文件夾來模擬另一個人的開發
2.6.1 因為test2的倉庫內還沒有任何文件,所以先將遠程中dev分支內的最新內容拉取下來

2.6.2 如下圖所示,選擇正確的遠端分支,並勾選上“合並”選項,點擊確定后,即可進行拉取操作

2.6.3 本來test2 的倉庫內是沒有任何內容的,成功進行拉取后就會出現相應的文件

2.6.4 打開項目后,並添加一個新的窗體form2

2.6.5 接下來就按照 2.4.2 的步驟操作即可,這里就直接跳到如下圖所示的界面,這里我們可以很清楚的看到幾個紅字,也就是github不能自動合並了,這是為什么了呢?這里我們先來回顧一下我們之前做了什么
首先,我們讓test1和test2都處於倉庫的最新版本,也就是啥也沒有
然后我們在test1和test2的開發過程中切換至各自的開發分支,同步到遠端倉庫(github)時也是推送到各自的個人分支
然后我們將dev-01的內容成功merge到了dev中,這樣應該發現問題所在了把,也就是,test2開發的時候基於的遠程倉庫版本是什么都沒有的,跟test1是一樣的,但是test1先於test2 merge到了dev分支中,所以現在的dev已經不是當初的dev了,這個時候如果test2還想要合並的話,在沒有沖突的情況下還是可以合並的,但是因為存在了沖突,所以我們接下來進入重頭戲,也就是解決沖突。

2.7 解決沖突
2.7.1 首先還是先拉取最新的dev分支的內容到本地test2文件內的dev-02分支上。
按照前面講述的操作后,會發現出現了如下的界面,提示git 未能順利結束,並彈出一個提示框,這個的出現很正常,因為你在遠端想要合並的時候就已經知道有沖突了,所以在這里自然是不能正常合並成功了。我們需要解決掉沖突文件。這里題外話一句,我們現在拉取的是最新的dev,所以解決了沖突以后,一般來說是可以成功在遠端進行merge操作的,至於不一般的情況,暫時本人還沒遇到,以后如果有遇到的話再繼續補充。
這里直接點擊確定就可以啦!

2.7.2 點擊確定以后,會繼續彈出一個框,點擊是可以查看一下變更情況,這里我們點擊“是”來展示一下

2.7.3 點擊以后出現如下界面,我們可以看到存在一個沖突,這就是我們需要解決的。

2.7.4 首先我們用記事本打開一下這個文件,我們會發現一個神奇的東西,首先要說明一下,這個沖突文件內的格式是xml格式。針對vs 的C#窗體項目來說,這個文件內容出錯,是無法正確打開項目的。
紅色圈起來的部分就是沖突的部分,

2.7.5 我們在未修改任何東西的情況下嘗試打開該項目,會出現這個報錯的情況,在我的嘗試下,這個的報錯,就是上面那個文件內容出錯了。

2.7.6 接下來為大家介紹兩種解決該沖突的辦法
第一種:
第一步:直接刪除掉紅框內這部分看起來奇奇怪怪的東西,這樣刪除以后,可以保證項目可以打開,但是聰明的大家肯定會發現,刪除掉的是form2的一些內容,所以對form2肯定會產生影響


第二步:我們打開項目發現的確沒有看到form2在項目資源里,解決辦法很簡單,再把form2手動添加一下就可以啦,因為form2的文件是存在的,只是未加載到項目中

第二種:
這一種方法很簡單,只有一步,刪除掉紅線划掉的三行內容即可,這三行是git在合並時自動加上的,用來標注改動的內容,我們需要手動解決這個沖突的原因就在於這,因為自動加了一些內容,所以刪除就好了,至於這三行標注中間的內容,就是我們和最新版本不一樣的地方,我們需要人為決定是否保留。
刪掉三行內容后,項目就可以正常打開了,還可以看見form1和form2。


2.7.7 至此我們就解決了該次沖突,因為本次只是演示,沖突文件只有這一個,其他的沖突大致上解決方法都差不多,代碼文件基本上都是可以用記事本打開的,或者有其他的打開軟件也可以,如果沖突文件打開以后是亂碼,那很有可能這個文件是不應該出現在倉庫里的,因為倉庫更多地是用來管理代碼和一些必要的啟動的文件,如果是本地開發工具的自動生成文件,是要忽略掉的,不然非常容易產生解決不了的沖突,這也就是我們為什么在github上創建倉庫的時候添加了對應的忽略文件,其他開發過程大多也可以找到相應的忽略文件。
2.7.8 然后我們就繼續2.4.2的步驟,依舊是跳過,當然在過程中可能會出現與2.4.2 中不完全一樣的內容,隨機應變即可,基本上閉着眼睛繼續下一步操作就可以了,不需要修改太多的內容,然后一般就可以成功合並了,代碼中如果出現這樣的情況也一樣操作就可以了。
下面展示會出現的一些新界面



然后再推送到遠端即可。
2.7.9 接下來就要說一下另一個問題,雖然本地的沖突解決了,但是遠程同樣也需要推送最新的內容上去,這里可能會出現一個問題就是明明將最新的版本同步到github了,但是實際上github上並沒有顯示最新的提交,至於為什么會這樣,我也不知道了。所以這里再補充一個解決merge沖突的辦法;在gituhub端修改沖突文件。具體操作步驟為雖然產生沖突但依舊create pull request -> resolve conflict (這是一行小灰色字體,在之前confirm merge 的那個地方可以找到)
然后就會進入沖突文件的界面,一樣進行手動修改就可以了,最后再點擊merge,confirm merge即可進行合並操作了。



至此基本上就能解決沖突並且成功合並了。
