Git + GitHub 版本控制教學 (5) - 使用 GitHub 與團隊合作

Github 提供了開發者一個遠端可以協作的 git 空間。讓團隊可以一起在上面開發同一個專案。除此之外還有 review、任務管理、文件、自動化佈署等等各式各樣可以幫助開發的功能。如何使用 Github 創建 Repo 等基本用法在網路上已經有很多教學,這篇文章會著重在於團隊們協作開發的流程。

Git + GitHub 版本控制教學 (5) - 使用 GitHub 與團隊合作

Github 提供了開發者一個遠端可以協作的 git 空間。讓團隊可以一起在上面開發同一個專案。除此之外還有 review、任務管理、文件、自動化佈署等等各式各樣可以幫助開發的功能。如何使用 Github 創建 Repo 等基本用法在網路上已經有很多教學,這篇文章會著重在於團隊們協作開發的流程。

連接本地的 Git 與 Remote 的 Github Repository

使用 GitHub 時,我們會有一個本地的 Git project 去連向遠端的 GitHub repo。我們可以在本地使用 git remote -v 看看當下的 project 有沒有指向任何遠端的 repo。

git remote -v

上面的意思代表的是我們的本地專案已經連到了遠端 thoth-tw/thoth 這個 repo,origin 是那個遠端地址的暱稱 (一個本地專案可以連多個遠端地址)。連上之後,每當我們要把本地的版本推上遠端時,我們可以使用 git push origin [branch name] 推到你要的遠端 branch 上(第一次需要用 --set-upstream 像是 git push --set-upstream origin feature1 把本地的的 feature1 接上遠端 origin 的 feature1 )。

一個本地的專案事實上可以同時街上多個遠端 repo:

# 新增
git remote add user1 https://github.com/user1/thoth.git

# 更新 remote 對應的暱稱以及其地址
git remote set-url user1 https://github.com/user1/thoth.git

# git remote -v 
origin https://github.com/thoth-tw/thoth.git
user1 https://github.com/user1/thoth.git
user2 https://github.com/user2/thoth.git
user3 https://github.com/user3/thoth.git
...

為什麼能有多個,那就要探討 GitHub 提供的 fork 功能。每個人都可以對看得到的 repo 做 fork,它其實就是一個複製的功能。fork 完後我們會得到一個在自己帳號底下一個一模一樣的 repo。但從此之後你的 repo 不會在跟原本的 repo 同步,它會停在 fork 當下的那個版本。因為有了 fork ,一個 repo 可以存在在不同地方,當然我們也可以把本地的 repo 一次接上多個 remote url,可以更靈活的更新不同位置 fork 出來的 repo。

Pull Request

open a pull request

剛使用 GitHub 時,最令人疑惑的就是 Pull Request (PR) 這個字眼了。當我們接到一個任務時,我們的開發流程會是:

  1. 開一個新的 branch 做任務。
  2. 任務完成後,push 到遠端 repo 相對應的 branch。
  3. 在這時候我們想請求這個 branch 的改動被合併到主要的 (master/main) branch 裡。Pull Request (PR) 就是這個意思,請求主要的分支 pull 我們這個分支的改動。
  4. 一個 PR 裡我們可以寫上標題以及任務的描述。GitHub 同時也會顯示我們目前 branch 跟主要 branch 的差異 (code diff),多了哪一行、少了哪一行都會被標示地很清楚。Reviewer 可以查看這個 PR、留言,以及 approve 這個 PR。
  5. 一旦 PR 沒問題了,可以點 PR 裡的 merge 按鈕來把這個 PR 合進主要的 branch。
PR 裡的 code diff
merge pull request

Fork repo 來協同開發

我個人遇過不同的開發方式。在比較小的團隊裡,團隊成員共同維護一個 repo。大家會在同一個 repo 裡開 branch、push 等。在比較大的團隊裡,為了避免大家在 repo 裡創建大量的 branch 導致衝突,大家會先 fork 主要的 repo,然後在自己的 repo 上做開發,發 PR 時是可以把自己 forked repo 上的分支指到主要 repo 裡的分支的。這樣的好處也包含的權限上的控管,可以避免太多人有主 repo 的權限。

只用這種方式開發的話我們在本地通常會設置兩個 remote url,一個是自己 fork 的 repo,一個是主 repo:

origin https://github.com/myusername/project.git
upstream https://github.com/team/project.git

這樣我們在拉最新版本時就可以從 upstream 拉(主 repo),推 code changes 時則可以推到 origin (自己的 forked repo)。 然後發 PR 時如上面所說從 forked repo 指向主 repo。

我們甚至可以設置一些限制,像是至少有一個或兩個 reviewer 的 approval 才能 merge PR,可以更安全的讓更多人進行同時開發。