Pull Request 是開發者使用 GitHub 進行協作的利器。這個功能為用戶提供了友好的頁面,讓提議的更改在並入官方項目之前,可以得到充分的討論。
最簡單地來說,Pull Request 是一種機制,讓開發者告訴項目成員一個功能已經完成。一旦 feature 分支開發完畢,
開發者使用 GitHub 賬號提交一個 Pull Request。它告訴所有參與者,他們需要審查代碼,並將代碼並入 master 分支。
Pull Request 不只是一個通知,還是一個專注於某個提議功能的討論版
Pull Request是如何工作的
Pull Request 需要兩個不同的分支或是兩個不同的倉庫,
- 開發者在他們的本地倉庫中為某個功能創建一個專門的分支。
- 開發者將分支推送到公共的 GitHub 倉庫。
- 開發者用 GitHub 發起一個 Pull Request。
- 其余的團隊成員審查代碼,討論並且做出修改。
- 項目維護者將這個功能並入官方的倉庫,然后關閉這個 Pull Request。
例子
如何將 Pull Request 用在 Fork 工作流中。小團隊中的開發和向一個開源項目貢獻代碼都可以這樣做。
Mary 是一位開發者,John 是項目的維護者。他們都有自己公開的 GitHub 倉庫,
John 的倉庫之一便是下面的官方項目。
為了參與這個項目,Mary 首先要做的是 fork 屬於 John 的 GitHub 倉庫。她需要注冊登錄 GitHub,找到 John 的倉庫,點擊 Fork 按鈕。
選好 fork 的目標位置之后,她在服務端就有了一個項目的副本.
接下來,Mary 需要將她剛剛 fork 的 GitHub 倉庫克隆下來.她在本地會有一份項目的副本。她需要運行下面這個命令:
git clone https://github.com/user/repo.git
請記住,git clone 自動創建了一個名為 origin 的遠端連接,指向 Mary 所 fork 的倉庫。
在她寫任何代碼之前,Mary 需要為這個功能創建一個新的分支。這個分支將是她隨后發起 Pull Request 時要用到的源分支。
# 創建新分支
git checkout -b some-feature
# 編輯一些代碼
git commit -a -m "新功能的一些草稿"
為了完成這個新功能,Mary 想創建多少個提交都可以。如果 feature 分支的歷史有些亂,她可以使用交互式的 rebase 來移除或者拼接不必要的提交。對於大項目來說,清理 feature 的項目歷史使得項目維護者更容易看清楚 Pull Request 的所處的進展。
在功能完成后,Mary 使用簡單的 git push 將 feature 分支推送到了她自己的 GitHub 倉庫上(不是官方的倉庫):
git push origin some-branch
這樣她的更改就可以被項目維護者看到了(或者任何有權限的協作者)。
Mary創建了一個Pull Request
GitHub 上已經有了她的 feature 分支之后,Mary 可以找到被她 fork 的倉庫,點擊項目簡介下的 New Pull Request 按鈕,用她的 GitHub 賬號創建一個 Pull Request。Mary 的倉庫會被默認設置為源倉庫(head fork),詢問她指定源分支(compare)、目標倉庫(base fork)和目標分支(base)。
Mary 想要將她的功能並入主代碼庫,所以源分支就是她的 feature 分支,目標倉庫就是 John 的公開倉庫,目標分支為 master。她還需要提供一個 Pull Request 的標題和簡介。
在她創建了 Pull Request 之后,GitHub 會給 John 發送一條通知。
John審查了這個Pull Request
John 可以在他自己的 GitHub 倉庫下的 Pull Request 選項卡中看到所有的 Pull Request。點擊 Mary 的 Pull Request 會顯示這個 Pull Request 的簡介、feature 分支的提交歷史,以及包含的更改。
如果他認為 feature 分支已經可以合並了,他只需點擊 Merge Pull Request 按鈕來通過這個 Pull Request,將 Mary 的 feature分支並入他的 master 分支.
但是,在這里例子中,假設 John 發現了 Mary 代碼中的一個小 bug,需要她在合並前修復。他可以評論整個 Pull Request,也可以評論 feature 分支中某個特定的提交。
!
為了修復錯誤,Mary 在她的 feature 分支后面添加了另一個提交,並將它推送到了她的 GitHub 倉庫,就像她之前做的一樣。這個提交被自動添加到原來的 Pull Request 后面,John 可以在他的評論下方再次審查這些修改。
John 接受了 Pull Request
最后,John 接受了這些修改,將 feature 分支並入了 master 分支,關閉了這個 Pull Request。功能現在已經整合到了項目中,其他在 master 分支上工作的開發者可以使用標准的 git pull 命令將這些修改拉取到自己的本地倉庫。