Github | 如何貢獻Android開源項目和提交補丁

作者 謝恩銘,公眾號「程序員聯(lián)盟」(微信號:coderhub)。
轉載請注明出處。
原文:http://www.itdecent.cn/p/21af4f24d8db

這篇文章寫于 2016 年 8 月 11 日

內容簡介


  1. 前言
  2. 前提
  3. 開始實作
  4. 創(chuàng)建錯誤報告
  5. 提交補丁

1. 前言


之前寫了文章 Android開源項目學習 | QKSMS短信AppGit,Github和Gitlab簡介和基本使用, 今天偶然發(fā)現(xiàn)了一個 QKSMS 的問題(Bug)?。

我解決了問題, 并在 QKSMS 的 Github 頁面上提交了補丁。

正好借此來聊聊如何在 Github 上為開源項目做貢獻, 讓你的 Github 成為你的補充簡歷, 從此升職加薪, 當上總經(jīng)理, 出任 CEO, 迎娶白富美, 走向人生巔峰, 指日可待啊~

好了, 開個玩笑。還是踏踏實實做人, 好好學習, 天天向上吧!

2. 前提


首先, 你要會用 Git 和 Github。還不了解的, 去看我上面那篇關于 Git 和 Github 的文章。

Github 的頁面語言是英語, 如果你英語還不好, 或者正在入門, 請看: 對于程序員, 為什么英語比數(shù)學更重要? 如何學習

3. 開始實作


首先, 一個Github上的開源項目, 是有作者的, 有的是個人(例如QKSMS), 有的是團隊(例如Google的Sample的Github頁面: https://github.com/googlesamples) 。

QKSMS的作者是Moez Bhatti, 他活躍度很高:

QKSMS的頁面是:
https://github.com/moezbhatti/qksms

4. 創(chuàng)建錯誤報告


發(fā)現(xiàn)一個Github的開源項目的問題(issue)之后, 我們可以在項目頁面點擊Issues那個標簽欄, 去到Issues頁面:

點擊New Issue(新問題)的綠色按鈕來創(chuàng)建一個新的issue:

編輯你的issue, 點擊Submit new issue(提交新問題)來提交你的issue。

我創(chuàng)建的issue:
https://github.com/moezbhatti/qksms/issues/585

如下:

可以看到, issue的文本里, 有幾個區(qū)塊, 以后如果用Redmine, Bugzilla這類的Bug合作平臺, 也可以遵照下面的格式來描述一個bug:

  1. DESCRIPTION : 描述。issue的簡單描述。我寫的是"當在設置的Activity中旋轉屏幕, 之后再按回退鍵, QKSMS奔潰。這個問題同時存在于Google Play上下載的版本和從Github上下載編譯的版本。這個問題只發(fā)生在進入設置的子類型設置(例如: 外觀, 通用, 通知, MMS, QK Reply, 等等)中時"。
  2. STEPS : 重現(xiàn)issue的步驟。依順序寫下如何重現(xiàn)問題的步驟。
  3. EXPECTED : 期待的表現(xiàn)。也就是你期待的正確表現(xiàn)是什么。
  4. OBSERVATIONS : 實際的表現(xiàn)。也就是你觀察到的錯誤表現(xiàn)。

我還附上了Android Studio中復制過來的Logcat的奔潰報告。在Logcat from Android Studio那個區(qū)塊。

5. 提交補丁


你在代碼中做了修改, 測試你的修改沒問題了之后, 就可以向Github提交你的補丁啦~

在Git中如何制作補丁呢?

非常簡單。用

git format-patch

命令即可。

首先你在Git中提交你的修改

git add QKSMS/src/main/java/com/moez/QKSMS/ui/settings/SettingsActivity.java
git commit -m "Fix crash when backPress from SettingsActivity after Orientation changed"

然后, 用git log來查看你剛提交的commit和之前的一個commit:

git log

可以看到, 我們剛才提交的commit, 其hash值是c0c949a4a0812e27f1102e566e8c11fe82b29dc5, 而前一個commit的hash值是d50befdf6377ff42d2307ddd59628f0490c3eb86

根據(jù)

man git-format-patch

顯示的文檔所說, git format-patch 后接你的改動從哪里開始的那個commit的hash值, 因為我們的改動是基于前一個commit(hash值為d50befdf6377ff42d2307ddd59628f0490c3eb86), 因此, 要生成patch補丁, 只需:

git format-patch d50befdf6377ff42d2307ddd59628f0490c3eb86

可以看到, 它為我們生成了補丁文件:

0001-Fix-crash-when-backPress-from-SettingsActivity-after.patch

就在當前目錄里:

補丁的改動如下:

可以用

git show

來查看

補丁在這里

直接在錯誤報告里提交補丁


如果你對代碼的改動很少, 那么可以考慮制作patch(補丁)文件, 然后直接用評論附件形式上傳到你剛才創(chuàng)建的錯誤報告中:

在下面所示的方框中(Leave a comment)編輯你的comment(評論), 你隨時可以預覽你的評論, 點擊Preview(預覽)即可, 要回到編輯模式, 點擊Write(寫)。

然后看到有一段文字: Attach files by dragging & dropping or select them.

意思是: 你可以拖動文件到這個編輯框來附上你的文件, 或者也可以點擊"select them"來手動選擇文件。

不管你用哪種方式, 把文件附上之后(我這里的補丁文件名是0001-Fix-crash-when-backPress-from-SettingsActivity-after.patch.txt ), 點擊綠色的Comment按鈕, 評論就被提交了, 文件如下圖中紅框所示。

我在評論里說: "我創(chuàng)建了一個補丁, 修正了這個問題, 而且也同時修正了一個小問題, 就是在設置頁面的子類型頁面中, 如果旋轉屏幕, 會自動回到設置頁面的主頁面。不過您也許會想到更好的解決方案。"

PS: 因為Github不能提交patch結尾的文件, 所以我把補丁文件改成了以.txt結尾, 但并不妨礙打補丁。

在Git中如何打補丁呢?


非常簡單:

  1. cd到項目根目錄下
  2. 用git apply命令, 后接補丁文件的路徑
  3. git add 修改的文件
  4. git commit
  5. git push

實際操作:

cd ~/qksms
git apply ~/Desktop/0001-Fix-crash-when-backPress-from-SettingsActivity-after.patch.txt
git add QKSMS/src/main/java/com/moez/QKSMS/ui/settings/SettingsActivity.java
git commit -m "隨便你寫什么"
git push origin master   # 或者提交到其他分支

創(chuàng)建新的分支來提交補丁


如果你的改動比較多, 你就不能在錯誤報告的評論里附上一個小小補丁文件就了事了, 最好用創(chuàng)建分支的方式來提交你的pull request(提交請求)。

如果你是Github的開源項目的作者本人或者是被作者指定的貢獻者, 你可以直接git push你的branch到項目代碼倉庫, 然后可以直接創(chuàng)建pull request。

點擊Pull requests標簽, 進入Pull requests頁面:

點擊上圖中 New pull request

然后選擇你提交的分支和你要合并的目標分支。

但是, 一般我們都是游客, 沒有權限git push到開源項目的代碼倉庫。

所以需要用另一種方式來提交補丁, 可以稱之為 pull request by comparing across forks (通過對比交叉復刻來提交請求)。

首先, 我們需要fork(復刻)這個開源項目, 點擊下圖中的fork按鈕:

稍等片刻, 開源項目就被復刻到你的個人Github目錄了, 如下:

可以看到, 現(xiàn)在我自己的Github倉庫已經(jīng)有了這個開源項目的代碼, 不過標明了 "forked from moezbhatti/qksms", 就是說這個倉庫不是我自己的, 是從moezbhatti/qksms項目復刻過來的。

接著, 你用git clone來把復刻的項目拉取到本地:

首先, 點擊上圖中 Clone or download按鈕, 復制那個鏈接: https://github.com/frogoscar/qksms.git

然后在終端里輸入:

mkdir github
cd github
git clone https://github.com/frogoscar/qksms.git
cd qksms

你可以先git checkout -b來基于master分支創(chuàng)建一個你自己的分支(名字隨便取), 直接改動代碼, 然后修改代碼, 假如你的補丁, 再git add, git commit, git push。

git checkout -b enmingxie/Fix_crash_when_backPress_from_SettingsActivity_after_Orientation_changed

因為我之前已經(jīng)從其他地方創(chuàng)建了補丁, 因此, 我就不手動改代碼了, 直接用git apply來打補丁。

git apply ~/Desktop/0001-Fix-crash-when-backPress-from-SettingsActivity-after.patch

通過git status命令(上圖中看到的git st是我自己配置的alias), 我們可以看到QKSMS/src/main/java/com/moez/QKSMS/ui/settings/SettingsActivity.java文件被改變了,還沒有git add, 因此:

git add QKSMS/src/main/java/com/moez/QKSMS/ui/settings/SettingsActivity.java
git commit -m "Fix crash when backPress from SettingsActivity after Orientation changed"
git push origin enmingxie/Fix_crash_when_backPress_from_SettingsActivity_after_Orientation_changed

輸入你的github用戶名和密碼(如果你配置了SSH, 則不必輸入)。

再到Github的項目頁面, 點擊F5刷新, 可以看到剛push的enmingxie/Fix_crash_when_backPress_from_SettingsActivity_after_Orientation_changed這個branch(分支)已經(jīng)有了。

此時, 再去開源項目頁面, 首先:

  • base fork那里, moezbhatti/qksms是QKSMS的代碼倉庫。
  • base那里, master表示是QKSMS的master分支(主分支)。

選擇對應分支:

  • head fork那里, frogoscar/qksms是我的Github上的復刻的QKSMS的代碼倉庫。
  • compare那里, enmingxie/Fix_crash_when_backPress_from_SettingsActivity_after_Orientation_changed是我剛push的分支。

可以看到我的分支與開源項目(QKSMS)主分支(master)的(diff)改動了:

然后點擊 Create pull request (生成提交請求), 編輯提交請求的文本, 再點擊Submit pull request, 就完工啦!

這樣, 作者審核你的分支之后, 就可以決定是否使用你的補丁啦!

恭喜你! 第一個提交的Github補丁! 加油吧~


我是 謝恩銘,公眾號「程序員聯(lián)盟」(微信號:coderhub)運營者,慕課網(wǎng)精英講師 Oscar 老師,終生學習者。
熱愛生活,喜歡游泳,略懂烹飪。
人生格言:「向著標桿直跑」

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容