Chapter 4 GitHub Desktop-group
小情境
讓我們用以下的小情境想像一下利用版本控制進行團隊開發時,最重要的三個概念:
1. 開設分支(Branch)
小瑜與小宜被分配到要完成同一個報告,他們也決定要透過版本控制來協作這次的報告,藉此減少必須碰面的時間成本與協商成本。
若他們彼此都修改同一份檔案,小瑜負責人物介紹,小宜負責歷史沿革,突然之間收到通知,老師要求就人物介紹的章節先跟他進行meeting,請問小瑜要怎麼辦?
他可以熬夜完成人物介紹,但是小瑜的歷史沿革可能來不及…..要刪掉嗎?
小宜OS: 那我不就要重寫?
不刪掉呢?(小瑜OS: 給老師看到未完成品我要怎麼應對!?)
神啊!能不能讓我們在平行時空下編輯同一份檔案?
所以有了分支Branch!
2. 進行pull request
小瑜以及小宜開設了一個屬於自己的分支,分別在自己的分支上撰寫所分配到的報告內容,截止期限要到了,準備繳交的時候才想起原來彼此都只有一部分的成果,怎麼辦呢?總不能永遠都傳檔案給對方,要對方打開檔案去找我寫的那個章節在哪,這份報告有20000字將近三十頁耶…..真麻煩@@
神啊!能不能讓兩個平行時空收斂啊!!??
於是有了pull request,可以把別人的程式段落拉進來,或者將自己的程式段落送出去給別人。
3. 解決衝突(Resolve Conflict)
小瑜是組長,於是小宜送了一個pull request給她,這時才想起彼此都有對一開始的研究動機修正了一些,這時候到底要用誰的內容呢?
…..比文采嗎?比誰先改完嗎?比誰改得多嗎?
好像都不太對……
神啊!能不能讓兩個平行時空收斂的時候可以絕對的穩定?
有時候需要有人resolve conflict
組長小瑜手動解決衝突後,趕在23:59送出信件,一切大功告成!終於可以洗洗睡了~~
是不是很方便呢?
畢竟隔壁組的還在討論要用哪個圖呢XD
branch
在Github Desktop裡面開設branch

輸入適當的branch(分支)名稱

是不是就產生一個branch(分支)了呢?一樣地第一次同步雲端也是Publish

雲端的GitHub也有了對應的branch囉!

branch名稱建議是Task-orientation較佳,也易於辨認。
bug-fix (O)
certain username (O)
一群亂碼SDAJFLSDAJLKFJSLDAKF (X)
master
具體來說稱作master branch
,其實也是一個branch,通常理解為主幹道(有一點點特殊意義XD),通常會將整個程式專案的穩定版本(已經達成高度共識的版本放在master
),團隊開發者再從這個地方開所需的branch出去,並且定期回顧與更新。
pull request
在branch上新增一點東西

Github Desktop確實偵測到有內容的不同

同步到雲端Github

開啟Github(pull request在Github上操作較方便)

設定要從ShowBranch這個分支併入master這個分支

會審核是否可以成功合併(否則需要排解衝突conflicts)

此時回到Github的master branch看看,是否有對應內容產生了?

疑問1 :此時本地端的master branch之下的檔案也有變化了嗎?
疑問2 :此時GitHub上面的ShowBranch分支裡的東西有不見嗎?
pull request可以在任兩個branch之間執行,包含有無涉及
master branch
。branchX
進到master branch
或者反過來master branch
進到branchX
都沒問題。branchX
到branchY
,或反過來,也都沒問題。
設定合併來源與對象
base: 準備要被塞內容進去的那個branch
compare: 準備要送內容出去的那個branch
pull request
伴隨著就是程式審核(code review),通常會需要寫說明本次pull request
是修正了哪些地方等等細節的描述。
Resolve Conflict
在master上新增一點東西(在第五行)

Github Desktop確實偵測到有內容的不同

在ShowBranch分支上新增一點東西(也在第五行)

同理,Github Desktop確實偵測到有內容的不同

出現了Cannot automatically merge的狀況!

照樣可以點擊創造pull request,會告知問題是哪一個檔案,並點選Resolve Conflicts

進入檔案內容手動調整

最後在第六行,改成一段全新的文字

順利解決衝突,base端的master,也確實有了解決衝突後的結果

疑問1 :此時當初compare端的ShowBranch,也有變成解決衝突後的結果嗎?
進入檔案手動調整內容時候,
======
意思是隔開兩個branch的內容,無實質意義。衝突的修正,兩個branch分別的內容都可以留下,或擇一,或刪除並新增內容。
面對衝突原則上只能手動處理,當衝突部分很多,或者有很多個檔案的時候,可以尋求進階的指令來因應以節省時間。