Github 的一大特色就是 Pull Request 功能(簡寫為 PR)。
對於多人合作的專案,該功能簡直必不可少。大部分人都是使用 Web 介面(如上圖),本文介紹如何在命令列下處理 PR,翻譯自 Cédric Beust 的文章。
一、Pull Request 是什麼?
Github 官方文件的定義如下。
"Pull Request 是一種通知機制。你修改了他人的程式碼,將你的修改通知原來的作者,希望他合併你的修改,這就是 Pull Request。"
Pull Request 本質上是一種軟體的合作方式,是將涉及不同功能的程式碼,納入主幹的一種流程。這個過程中,還可以進行討論、稽核和修改程式碼。
二、Pull Request 的流程
第一步,你需要把別人的程式碼,克隆到你自己的倉庫,Github 的術語叫做 fork。
第二步,在你倉庫的修改後的分支上,按下"New pull request"按鈕。
這時,會進入一個新頁面,有Base 和 Head 兩個選項。Base 是你希望提交變更的目標,Head 是目前包含你的變更的那個分支或倉庫。
第三步,填寫說明,幫助別人理解你的提交,然後按下"create pull request"按鈕即可。
PR 建立後,管理者就要決定是否接受該 PR。對於非程式碼變更(比如文件),單單使用 Web 介面就足夠了。但是,對於程式碼變更,Web 介面可能不夠用,需要命令列驗證是否可以執行。
三、git am
git am
命令用於將一個 patch 檔案,合併進入當前程式碼。
Github 對每個 PR 會自動生成一個 patch 檔案。我們下載該檔案,合併進原生程式碼,就可以在本地檢視效果了。
$ curl -L http://github.com/cbeust/testng/pull/17.patch | git am
上面程式碼中,curl
的-L
參數列示,如果有302跳轉,curl
會自動跟進。後面網址裡面的/cbeust/testng
是目標倉庫,pull/17
表示該倉庫收到的第17個 PR。
如果 PR 只包含一個 commit,那麼也可以直接下載這個 commit 的 patch 檔案。
$ curl https://github.com/sclasen/jcommander/commit/bd770141029f49bcfa2e0d6e6e6282b531e69179.patch | git am
上面程式碼中,網址裡面的/sclasen/jcommander
是程式碼變更所在的那個倉庫。
四、建立遠端倉庫
另一種方法是為 PR 建立一個遠端分支,追蹤提交者的倉庫。
# 建立遠端倉庫,指向 PR 提交者的倉庫 $ git remote add nullin git://github.com/nullin/testng.git # 從該遠端倉庫拉取程式碼 $ git fetch nullin # 將該倉庫的某個分支合併到當前分支 $ git merge kneath/error-page # 推送到自己的倉庫 $ git push origin master
五、cherry-pick
有時,PR 裡面包含好幾個 commit,但是你只想合併其中的一個或幾個。
這時可以使用cherry-pick
命令,挑出你感興趣的 commit。
# 建立遠端分支,追蹤提交者的倉庫 $ git remote add nullin git://github.com/nullin/testng.git # 從該遠端倉庫拉取程式碼 $ git fetch nullin # 只將感興趣的 commit 加入當前程式碼 $ git cherry-pick commit1 $ git cherry-pick commit2 # 推送到自己的倉庫 $ git push origin master
(完)