Github Pull Request的提出與採納

這一文來簡要介紹一下Github Pull Request(如下簡稱PR)的使用方法:python

  • 做爲PR的提出者,如何對某個倉庫提交PR,如何根據倉庫管理者對所提交PR的反饋對PR進行完善
  • 做爲PR的接收者,如何對PR進行測試,對提出者進行反饋以及合併PR到倉庫中。

這裏我使用兩個GitHub帳戶來進行說明,PR接收者帳戶爲lml256,PR提出者帳戶爲rikkaii。並以lml256帳戶中的learngit倉庫進行試驗。git

如何提出PR

若是你對Github上的某個開源項目很是感興趣,想貢獻本身的力量爲其添加新功能,或者發現了代碼中的一些bug,想爲其進行修復。那麼能夠將該開源倉庫Fork到你的倉庫列表中,並對其進行修改後,向原倉庫提交PR,請求倉庫的管理員合併你的代碼。下面假設咱們的帳號爲rikkaii,並向lml256帳號中的learngit項目提交PR爲例,詳細的說明一下該流程:bash

Fork倉庫

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文件。

發起PR

接下來,你能夠點擊上圖中分支名稱旁邊的的New pull Request按鈕來發起一個PR。這會自動跳轉到原倉庫下面,並選擇python-div做爲要推送的分支,以下:

至於要將python-div分支上的修改推送到原倉庫的什麼分支上,Github在這裏自動爲咱們選擇了master分支,這裏須要注意的是分支的選擇與原倉庫使用的什麼開發模式有關,通常正規的開源倉庫都會說明PR的提交規則,包括提交到什麼分支以及如何描述commit等等,這須要咱們仔細閱讀相關的要求並遵循。這裏爲了演示方便,將python-div分支的修改請求推送到原倉庫的master上,而且在上圖下面的說明欄裏也只是使用GitHub的默認說明。

接下來即可以點擊上圖下面的Create pull request按鈕來建立一個分支了。

當出現上圖的樣子後,咱們的PR就建立成功了。咱們只須要靜靜等待倉庫管理員的審覈就好了。

修正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。做爲一個開源項目的管理者,學會如何測試別人提出的PR並進行反饋或者合併是很必要的。這裏假設咱們的帳號爲lml256,以接收rikkaii帳號向lml256帳號中的learngit倉庫提交的PR爲例,詳細的說明一下做爲倉庫的管理者,如何測試和合並PR。

審計PR

打開咱們的倉庫,在Pull Requests列表中能夠看到rikkaii向咱們的倉庫提交了一個PR

點進去能夠看到詳細的信息:

咱們能夠在Files changed欄裏對代碼進行審計,若是代碼有問題的話,能夠對每行代碼添加批註,以幫助PR提交者進行完善,寫完批註後,點擊start a review即可發起一個code review。以下:

當代碼所有都審計完後,點擊下圖中的submit review即可以提交本次的審計結果。

提交後,咱們對代碼的審計結果便會反映在該PR的時間軸上,而且GitHub會向PR發起者發送回覆通知郵件。

對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

Merge代碼

通過一番測試後,咱們確信該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:


版權全部,未經容許不得轉載

相關文章
相關標籤/搜索