2016年9月2日 星期五

Social Coding ~ GitHub使用介紹

本文是我發表在公司月刊上的文章,介紹如何使用GitHub來參加開源專案或是自己開一個新的專案~沒使用過GitHub的朋友可以參考看看。

前言

GitHub是目前最火紅的程式碼管理庫,以前工程師在撰寫程式往往都只有一個人或是小小的一個團隊進行程式開發,程式在開發的過程中可能只有自己或是少數幾個人進行交流,這樣的方式是比較封閉的,能夠讓腦力激盪出的火花有限,由於GitHub的興起提供了一個程式交流的平台,工程師們可以開放他們所撰寫的程式和軟體開源放到GitHub上,讓其他人來進行使用,當使用過這些軟體後,別的工程師可能發現到程式可以改進的地方,可以讓這些程式或軟體的功能變的更好用、更強大,於是也幫忙開始撰寫程式,透過GitHub這個平台大家可以相互的溝通、交流,當你的程式碼有改動時,其他有在關注的人可以收到程式變更的訊息,當你的程式有bug時,會有人主動回報給你,GitHub也提供了很多社交網路具有的功能:例如:按讚、關注、評論...等。儼然形成了一個很大的社群,大家在上面進行程式開發、討論,當你有一個很棒的主意,架構了一個很好的系統,但是你一個人可能沒辦法很快的完成它,就好像你設計了一個很精美的建築,你自己一個人可能要花上好幾十年的時間才能完成所有的工作。但是如果有世界上其他很厲害的人一起來幫你一起打造,也許只要花幾個星期或是幾個月的時間就可以完成它。這就是Social Coding的魅力,集合眾人之力一同打造更好的軟體或系統。

身為一個工程師的我們有滿腔的熱血想要協助別的工程師進行開發,但是要怎麼入門呢?本篇文章就用一個實際的例子來教導大家如何運用GitHub來進行Social Coding。

新增儲存庫

當在GitHub上找不到合適的專案,自己就可以建立一個屬於自己的開源專案,在GitHub頁面中有一個"New repository",點選之後就會進入到新增的頁面中(如圖1所示),輸入所要建立的儲存庫名稱,選擇是否要建立專案的README說明文件,還有是否直接加入.gitignore及專案的授權方式(如:GPL、MIT License...等),按下"Create repository"即可建立屬於你自己的專案。
圖1 新增儲存庫

README.md說明文件

GitHub在新增遠端儲存庫時,會詢問是否要新增一個readme.md(如圖1所示),這是一個使用Markdown語法的文件,Markdown是用來作為一種網路內容的寫作用語言,它運用一些簡單的符號來協助建立標題等格式化的排版功能,讓文件更容易閱讀、編寫,相關的語法可以參考:1(Markdown文件),當你建立了一個新的儲存庫後,就可以編寫README.md,把跟這個儲存庫相關的資訊寫在這個檔案中,就可以在GitHub的首頁中看到這個被編譯排版過的Markdown的文件內容(如圖2所示),因為它是顯示在首頁的內容中,若你建立一個良好的readme說明文件,其他使用者搜尋進入到你的端遠儲存庫頁面時,就可以很容易了解你專案的目的、用途及如何使用它。
圖2 README.md

尋找及加入專案

GitHub裡面資源非常多,也由於資源太豐富了,想要找到你要的資訊可以透過一些簡單的搜尋技巧來幫忙:
1. 基本搜尋:當開啟Github的首頁時,最上方就有一個Search bar,只要輸入關鍵字就可以搜尋到跟關鍵字相關的管理庫(repo)。
2. 搜尋檔案中的關鍵字:當想要找管理庫(repo)的檔案中有某些關鍵字時,可以在搜尋列中先輸入關鍵字,空一格後加入in:file,即可針對檔案來進行搜尋的動作。
3. 搜尋檔案名稱及路徑:也可以針對檔案名稱及路徑進行搜尋,只要在搜尋列中輸入filename:檔案名稱即可搜尋有該檔案名稱的管理庫(repo);在搜尋列中輸入path:路徑名稱即可搜尋有該路徑名稱的管理庫(repo)。
4. 搜尋某個程式語言的關鍵字:當想要針對某個程式語言進行搜尋,可以在關鍵字後面空一格後加入language:語言名稱(例:language:c++),就可以只搜尋該語言的關鍵字相關的管理庫(repo)資訊。
透過這些搜尋技巧可以快速的找到自己想要專案。

Clone & Fork

當在GitHub上看到了一個很不錯的專案,想要把儲存庫(Repository)複製回到自己本機來進行程式開發,GitHub上有二種方式來進行:Clone和Fork,這二方式有什麼差異呢?很多第一次使用GitHub的人一定都會有這樣的疑問,Clone的指令是從遠端的儲存庫上把所有的內容全部複製回到自己的本機,建立自己本機的儲存庫及工作目錄;而Fork指令是把對方的遠端儲存庫複製一份到自己遠端的儲存庫裡,並且在新建的遠端儲存庫中留下來源端的連結, Fork是在遠端進行與本地端無關,若要把資料複製回自己的本機則還需要再下Clone指令把內容複製回來,這二者的差異在直接Clone對方的儲存庫,若你沒有編寫的權限,那就無法再將自己修改的程式碼提交回去;而Fork別人的儲存庫等同於建立一份自己的遠端儲存庫,你就可以自由的在自已的儲存庫上進行提交更新。Fork回來的專案可以從專案的網頁上看出這個專案Fork的來源出處(如圖3所示)。
圖3 Fork來出處及如何建立合併請求

Pull Request

前面提到的使用Fork可以建立自己遠端的儲存庫,並進行程式提交及更新,但當你在自己遠端儲存庫上完成自已的程式及提交後,如何把這個更新提交貢獻給原來的作者呢?可以使用Pull Request功能來發送一個合併請求(如圖3所示),按下New pull request後,GitHub會先進行儲存庫比對,檢查要合併的分支是否會有衝突,若沒有程式碼衝突就可以在下方描述你的程式修改說明,請對方可以看一下你所撰寫的程式碼,並可以告訴原作者你修改了那些項目內容,這些內容是對原專案有幫助的,請他合併進入到他的專案中(如圖4所示)。
圖4 合併請求

程式審查

當新增完pull request,儲存庫的開發者便會收到通知,他可以連進到該儲存庫的管理頁面中針對你的提交進行Code Review,查看你的程式碼是不是開發規範及對這個專案是不是真的有幫助,若有幫助他就會把你的程式碼合併(merge)到他的儲存庫中(如圖5所示),這個pull request是以一個討論串的型式,作者群跟專案相關的開發者都可以在這個討論串進行發言表達意見,也可以幫忙協助進行程式碼審查的工作,若你的程式碼可能有些部分需要再進行修改,開發者也可以針對這些內容的部分,給你一些建議請你再進行修改,修改完成後符合原作者的要求,他就會把你的程式合併進他的儲存庫,當你對這個專案貢獻度越來越高時,原作者也可以邀請你直接加入專案一起進入開發,這個時候你就可以直接對原作者的儲存庫進行直接的PUSH及PULL,也可以幫助其他開發者進行程式審查及提供意見,當然還是要符合作者所定訂的開發規範來進行協同合作。
圖5 pull request合併

問題追蹤(Issue Tracking)

程式在開發上總是會有新的需求或是Bug的出現,當這些問題發生時若能有個地方可以做資訊匯整及記錄,那就可以進行簡單的專案管理,在GitHub上就提供了問題追蹤(Issue Tracking)的功能,當你使用專案時發現這個專案有Bug或是你對這個專案有比較好的功能性建議,都可以透過問題追蹤的功能來與專案的開發者進行溝通,使用的方式很簡單直接點選專案端遠儲存庫網頁上的Issues的頁籤,按下New issue並輸入問題的標題及內容描述來新增問題追蹤(如圖6所示),若是Bug回報最好能提供詳細的操作步驟,讓開發者可以更快的找到問題的發生點,盡快的幫你解決這個問題,每個Issue都是一個討論串的形式,每個關心這個專案的人都可以加入討論及回覆。
圖6 新增問題追蹤

每個問題都會有一個問題的編號,問題追蹤的功能也可以結合git的程式碼提交(commit),當開發者收到這個問題回報,針對這個問題進行程式開發修改完成後,透過程式碼提交(commit)時,在提交的提交訊息(message)中可以加入"closed #問題編號"或是"fixed #問題編號",代表這次的提交(commit)修正了這個問題,當提交被推送(PUSH)回後端儲存庫時,提交訊息裡所標示的問題編號的問題就會被關閉(如圖7所示),當然開發者也可以從問題頁面中直接手動的方式將問題關閉,代表這個問題討論串己經結束了。
圖7 提交關閉問題

總結

透過上述的介紹,可以了解到Social Coding在GitHub的運作流程,透過Fork及Clone等功能,可以很輕易就取得別人開發好的完整程式專案;透過pull request及issue tracking等功能,讓每個對專案有興趣的人都可以加入討論並且進行協同合作,讓專案可以一直的迭代、改進變的更加完整。Social Coding讓你不再是一個人開發程式,而是可以找到一群志同道合的工程師一起討論、一起開發,完成許多又好又棒的開源程式,相信大家也忍不住想大顯身手一番了吧?趕快開啟GitHub網站,一起進入這個Social Coding的美妙世界吧!