Github Pull Request的提出與采納


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

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

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

如何提出PR

如果你對Github上的某個開源項目非常感興趣,想貢獻自己的力量為其添加新功能,或者發現了代碼中的一些bug,想為其進行修復。那么可以將該開源倉庫Fork到你的倉庫列表中,並對其進行修改后,向原倉庫提交PR,請求倉庫的管理員合並你的代碼。下面假設我們的賬號為rikkaii,並向lml256賬號中的learngit項目提交PR為例,詳細的說明一下該流程:

Fork倉庫

Fork倉庫非常簡單,只需要到倉庫首頁的右上角點一下Fork按鈕即可,Github會自動在你的倉庫列表中創建該倉庫的一個副本。

如下圖,GitHub自動在你的賬戶上創建了一個副本,並在倉庫名的下方指明了該倉庫是Fork來的:

添加新功能

現在我們為該倉庫添加一些新功能:

首先將該倉庫clone到本地

$ 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分支用於開發新功能。

$ 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:

$ 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:


版權所有,未經允許不得轉載


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM