這一文來簡要介紹一下Github Pull Request(如下簡稱PR)的使用方法:python
這裏我使用兩個GitHub帳戶來進行說明,PR接收者帳戶爲lml256,PR提出者帳戶爲rikkaii。並以lml256帳戶中的learngit倉庫進行試驗。git
若是你對Github上的某個開源項目很是感興趣,想貢獻本身的力量爲其添加新功能,或者發現了代碼中的一些bug,想爲其進行修復。那麼能夠將該開源倉庫Fork到你的倉庫列表中,並對其進行修改後,向原倉庫提交PR,請求倉庫的管理員合併你的代碼。下面假設咱們的帳號爲rikkaii,並向lml256帳號中的learngit項目提交PR爲例,詳細的說明一下該流程:bash
Fork倉庫很是簡單,只須要到倉庫首頁的右上角點一下Fork按鈕便可,Github會自動在你的倉庫列表中建立該倉庫的一個副本。測試
以下圖,GitHub自動在你的帳戶上建立了一個副本,並在倉庫名的下方指明瞭該倉庫是Fork來的:fetch
如今咱們爲該倉庫添加一些新功能:3d
首先將該倉庫clone到本地code
$ git clone git@rikkaii:rikkaii/learngit.git Cloning into 'learngit'... remote: Enumerating objects: 65, done. remote: Total 65 (delta 0), reused 0 (delta 0), pack-reused 65 Receiving objects: 100% (65/65), 5.44 KiB | 928.00 KiB/s, done. Resolving deltas: 100% (17/17), done.
咱們從master分支上新建一個特性分支,並在特性分支上面實現咱們的新功能。這裏簡要說明下什麼是特性分支:在主流的git開發模式中並不會直接在master上開發,而是在開發某個功能時新建一個分支,叫作特性分支,在其上進行開發,等到開發完成並測試完成後,再合併到master分支中,而後刪除該分支。而且特性分支的名稱要簡明扼要,方便別人明白其做用。這裏咱們建立一個python-div
分支用於開發新功能。blog
$ git checkout -b python-div Switched to a new branch 'python-div'
咱們在目錄中建立一個div.py
文件並在其編寫一些代碼:開發
# div.py # div.py def div(a, b): ans = a / b return ans
而後進行提交,並推送到GitHub:rem
$ git add div.py $ git commit -m "add div.py" [python-div 7aad1de] add div.py 1 file changed, 5 insertions(+) create mode 100644 div.py $ git push --set-upstream origin python-div ... To rikkaii:rikkaii/learngit.git * [new branch] python-div -> python-div Branch 'python-div' set up to track remote branch 'python-div' from 'origin'.
在上面的命令中,因爲python-div分支是咱們本地新建的,在GitHub遠程倉庫中並無該分支的相關信息,爲了可以將該分支的修改推送到GitHub遠程倉庫上,在推送時須要添加--set-upstream
參數,這樣會在遠程倉庫中也建立一個python-div分支,並將該分支的修改推送上去。
能夠看到,咱們的倉庫中已經有了python-div分支以及本次commit添加的div.py文件。
接下來,你能夠點擊上圖中分支名稱旁邊的的New pull Request按鈕來發起一個PR。這會自動跳轉到原倉庫下面,並選擇python-div做爲要推送的分支,以下:
至於要將python-div分支上的修改推送到原倉庫的什麼分支上,Github在這裏自動爲咱們選擇了master分支,這裏須要注意的是分支的選擇與原倉庫使用的什麼開發模式有關,通常正規的開源倉庫都會說明PR的提交規則,包括提交到什麼分支以及如何描述commit等等,這須要咱們仔細閱讀相關的要求並遵循。這裏爲了演示方便,將python-div分支的修改請求推送到原倉庫的master上,而且在上圖下面的說明欄裏也只是使用GitHub的默認說明。
接下來即可以點擊上圖下面的Create pull request按鈕來建立一個分支了。
當出現上圖的樣子後,咱們的PR就建立成功了。咱們只須要靜靜等待倉庫管理員的審覈就好了。
可是,有些事老是事與願違,有時候咱們認爲咱們的代碼沒有問題,可是卻被倉庫管理員反饋(或者被其餘開發者指出)咱們的代碼有問題,須要咱們修復。管理員經過對咱們的代碼進行審計後,指出了咱們的錯誤,Github也會將管理員與咱們之間及其餘開發者之間(這裏並無其餘開發者)對該次PR的討論反映在了時間軸上,並會以郵件的形式通知咱們:
接下來,咱們按照倉庫管理員的要求,對代碼進行完善,修改後的代碼以下:
# div.py def div(a, b): try: ans = a / b except ZeroDivisionError as e: print('error:', e) return None return ans
修改完成後,對代碼進行提交併推送到GitHub:
$ git add div.py $ git commit -m "fix zero division error" [python-div c3b73e7] fix zero division error 1 file changed, 5 insertions(+), 1 deletion(-) $ git push ... To rikkaii:rikkaii/learngit.git 7aad1de..c3b73e7 python-div -> python-div
當咱們推送完後,無需再次發起PR,Github會自動的將該次的提交反映到原來PR時間軸上,以下圖,而且Github還會向管理員發送郵件通知本次修改:
當倉庫管理者經過了本次代碼,將咱們的代碼合併到了master分支中後,咱們也會收到Github發來的關於Merge本次PR的郵件通知。
說完了如何提交PR,咱們再說一說如何接收PR。做爲一個開源項目的管理者,學會如何測試別人提出的PR並進行反饋或者合併是很必要的。這裏假設咱們的帳號爲lml256,以接收rikkaii帳號向lml256帳號中的learngit倉庫提交的PR爲例,詳細的說明一下做爲倉庫的管理者,如何測試和合並PR。
打開咱們的倉庫,在Pull Requests列表中能夠看到rikkaii向咱們的倉庫提交了一個PR
點進去能夠看到詳細的信息:
咱們能夠在Files changed欄裏對代碼進行審計,若是代碼有問題的話,能夠對每行代碼添加批註,以幫助PR提交者進行完善,寫完批註後,點擊start a review即可發起一個code review。以下:
當代碼所有都審計完後,點擊下圖中的submit review即可以提交本次的審計結果。
提交後,咱們對代碼的審計結果便會反映在該PR的時間軸上,而且GitHub會向PR發起者發送回覆通知郵件。
只在Github上憑藉眼睛看並不能發現全部的問題,在對PR正式合併前,咱們還須要對PR進行本地測試,如何使用git進行操做以下圖:
首先咱們須要將咱們倉庫的代碼clone到本地(也可能不須要clone,若是本地已經有該倉庫的話),而後拉取PR發起者倉庫的相關信息,這須要咱們先將PR發起者Fork的倉庫添加到本地倉庫的遠程倉庫:
$ git remote add PR_Sponsor git@rikkaii:rikkaii/learngit.git $ git fetch PR_Sponsor # 獲取PR發起者倉庫的相關信息 ... From rikkaii:rikkaii/learngit * [new branch] dev -> PR_Sponsor/dev * [new branch] master -> PR_Sponsor/master * [new branch] python-div -> PR_Sponsor/python-div
能夠看到,咱們從PR發起者倉庫中獲取到三個分支,其中包括爲咱們提交PR的python-div分支。
在進行測試以前,咱們還須要建立一個特性分支用於測試PR,並將python-div分支的修改merge到特性分支上進行測試:
$ git checkout -b test_pr Switched to a new branch 'test_pr' $ git merge PR_Sponsor/python-div Updating 9053d5b..c3b73e7 Fast-forward div.py | 9 +++++++++ 1 file changed, 9 insertions(+) create mode 100644 div.py
通過一番測試後,咱們確信該PR的代碼沒有問題,能夠合併代碼到PR發起者要求合併到的分支上(這裏是master)。這裏有兩種方法來處理這個問題,一是直接使用GitHub提供的Merge按鈕,這種方法比較直觀方便,可是不夠靈活,沒法處理合並衝突;二是在本地將測試後的特性分支合併到要合併的分支上,而後手動提交。儘管第二種方式處理起來比較複雜,可是卻比較靈活,能夠處理Github不能勝任的地方。這裏咱們選擇第二種:
$ git checkout master Switched to branch 'master' Your branch is up to date with 'origin/master'. $ git merge test_pr Updating 9053d5b..c3b73e7 Fast-forward div.py | 9 +++++++++ 1 file changed, 9 insertions(+) create mode 100644 div.py $ git branch -d test_pr # 這裏咱們的特性分支已沒做用,能夠刪除 Deleted branch test_pr (was c3b73e7). $ git push ... To lml256:lml256/learngit.git 9053d5b..c3b73e7 master -> master
這裏,咱們已經處理完了該PR,同時,GitHub也會檢測到咱們合併了該PR,也將其反映到該PR的時間軸上,並將該PR的狀態設置爲Merged狀態,關閉該次PR:
完
版權全部,未經容許不得轉載