Git 整理筆記 (二)

LUFOR129
8 min readSep 10, 2021

遠端倉庫

打RPG的時候,隊友的佔位與分配是很重要的! 後排玩家是要對準BOSS的弱點來個會心一擊,還是一個大招砸在前排戰士的頭上,最依賴的就是合理的分配負責區域。寫code也一樣,減少摩擦、劃分區域、互相幫助,才是好的團隊合作。

通常團隊會開一個團隊成員都能專案(Repository),會開一個遠端的倉庫來存放code。無論公開私人、Github還是Gitlab,皆可。這裡介紹Github為主。

如上圖,按步驟點一點就能夠開一個新的專案了,建立好後會獲得一個該專案的URL。打開你的本地端程式。

  • git remote add <遠端名稱> <URL> 連結本地端與遠端倉庫
  • git push <遠端名稱> <分支名稱> 把本地端的code推上遠端

如上圖,將本地端的master,推上了遠端的origin/master。其他人如何獲取遠端code呢?在某一個資料夾底下輸入:

  • git clone <URL> 把遠端的code、commit 下載到當前資料夾 (給沒有code的人)
  • git pull <遠端名稱> 把遠端最新版的code更新到本地端 (給已有code的人)

其實git pullgit fetchgit merge的合體,關於多人協作,我們在明天詳細講講,先提到一下。

  • git fetch 獲得遠端資訊
  • git merge 合併兩個分支

分支

分支(branch)是git多人協作的一個很重要的工具,在遠端倉庫中,多人一起push會導致程式衝突。為了避免每次push會有大量衝突,建議開發模式是多分支開發,每一個開發者會有自己的一個分支,當開法feature完成後合併到主幹分支。

  • git branch <分支名> 建立新的分支
  • git branch -v 查看分支
  • git checkout <分支名> 切換到分支 (HEAD的移動)

你可以把分支想像成有人複製了一份code,可以讓你隨意修改。修改滿意後或是審核通過後再讓你把修改內容合併回原始的主要程式內(master)。如下圖:

我們有了兩個branch (master、feature/person_1),他們各自對Apple.txt有了commit,為了方便看,可以使用Visual Studio Code的Git History來查看,如下圖:

綠色的是本地端、紅色的是遠端(origin master)。可以看到遠端的倉庫版本落後於本地端的版本,我們可以再加上一個README.md(顯示在專案進入點的文件)後上傳端,流程與之前大同小異。

# 在master新增了一個README.md並修改後
git add .
git commit -m "添加README"
git push origin master

這樣就能成功推上遠端了,讓遠端與本地端master同步。

其實checkout就是HEAD的移動,所以除了checkout不同分支外,你也可以checkout到同條支線其他commit點上,如此便能看到不同commit時間點的code。

  • git checkout <哈希值(前七碼)> HEAD移動到其他commit上
  • git checkout <branch-name> HEAD移動回最新的commit上

開分支

具體上要開那些branch呢? 我習慣大致簡化分成三種

  • master 上到production的版本,沒把握不要改動他
  • develop 開發版,開發過程的主要幹線,讓feature去修改他
  • feature/人 團隊的個人開發,開發一個段落merge到develop版

如上圖,團隊主要開發分支會在develop上。每天早晨主管核對完每個人的任務後,每個人會各自開發她們的feature,如人物(b1)開發feature/b1,人物(b2)開發feature/b2。完成自己的任務,或是快下班了,再將今天開發的東西merge給develop,當develop開發成熟後,就可以將develop merge給master,完成這一次的版本更新。

詳細參考: https://nvie.com/posts/a-successful-git-branching-model/

Merge

Feature開發完成後要併回develop,首先我們要先知道是誰合併誰。merge合併就像是吸收的動作,git status看一下現在處於哪個分支,並且要吸收掉哪個其他分支。

# 想要develop merge掉feature/b1
# 先切換到develop
git checkout develop
# 合併
git merge --no-ff feature/b1
# --no-ff是合併後分支保留的意思

如果沒有加上 — no-ff默認會把被合併的分支消滅,所以加上讓feature/b1繼續走下去。如下圖,成功合併。

假如今天feature/b2也修改了同一個檔案,並且嘗試給develop merge呢?會產生衝突

git merge --no-ff feature/b2
# 噴錯
# Auto-merging Apple.txt
# CONFLICT (content): Merge conflict in Apple.txt
# Automatic merge failed; fix conflicts and then commit the result

此時進入人工調整merge的時候,此時visual studio code會自動偵測那些地方有衝突,你必須手動去修改這些衝突。點選incomming(要變的)還是accept current (保留原始code)

決定後保存並commit,並且切換到b2,換他merge develop來同步最新的更新

git commit -am "合併b2"
git checkout feature/b2
git merge --no-ff develop
# 將這次的改變推上遠端倉庫
git checkout develop
git push origin develop

可以看到紅色為develop主幹道,feature/b1(綠色)與feature/b2(藍色) 對develop進行merge,merge完後再繼續進行開發。 (如果沒有 — no-ff分支會消失)

pull requests

簡單講一下正常的CI/CD軟體開發流程,通常開發人員不允許直接merge到master:

  1. 多人開設feature 對develop進行開發
  2. 當develop開發到一定版本後會進行pull requests到master(要求將develop的內容merge給master)。
  3. 通常master只有專案主管有權限修改,避免太多修改導致混亂。
  4. 專案技術主管省查develop的code後允許merge,(master) git merge develop
  5. master branch受到變動,因此啟用CI/CD流程,將會自動將master的程式部屬到production機器上

下面來講一下怎麼pull request,其實github點一點就好。

此時Project Owner就會收到pull request的請求。點選merge pull requests即可。

--

--