Pull Request 的命令列管理

阮一峰發表於2017-07-18

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

(完)

相關文章