git幫助閱讀開源專案

sigoden發表於2017-05-19

為什麼要閱讀開源專案

  • 原始碼是唯一的真實

  • 加深對專案的理解

  • 學習自己沒有的知識

  • 學習他人的寫法,有助於自己程式碼質量的提高

開源專案難點

  • 不知道從哪兒開始

  • 檔案太多,無法屢清楚結構

  • 程式碼太多,測試編譯時耗費太多時間

  • 內容太多,難以全面理解

開源專案特點

開源專案最早只是一個idea, 這個idea是這個專案的根,隨著專案的發展,特性會越來越多,架構可能會調整,但這個idea總是不變的,它是整個專案的精華.
而我們如果想要理解一個開源專案,弄懂這個idea是必須的, 很多時候我們就是為了深入理解這個idea才產生閱讀原始碼的動機。

隨者這個idea的實現,這個專案算是誕生了。但隨著越來越多特性的加入,越來越多程式碼的提交,這個idea越來越深的掩藏起來。所以我們可以從早期版本入手.

最早完成idea的版本中這個idea是最清晰的,程式碼量是最少的,也是我們理解這個專案的最佳時機.

使用git幫助理解開源專案

早期版本是切入開源專案的好時機,git是版本控制領域的佼佼者,使用git幫助理解開源專案

逆序檢視日誌
git log --reverse
找一個感興趣的版本切入
git checkout <commit-id>
導航與對比
  • 切換當前提交的上一次提交

git checkout HEAD~
  • 切換當前提交的下一次提交

git log --reverse --pretty=%H master | grep -A 1 $(git rev-parse HEAD) | tail -n1 | xargs git checkout;
  • 比較上一個分支與當前分支

git diff HEAD~..HEAD
追蹤檔案的變更歷史
git log --follow path/to/source_file

根據需要,可以專門閱讀該檔案相關的某個特定的commit,很多時候專案第一版的程式碼會比最新版的程式碼簡單很多,閱讀舊版的程式碼可能會比較容易。如果是為了修復bug而讀程式碼,這樣的變更歷史有時候可以提示我們哪個commit可能引入了bug。

查詢欄位(函式名,變數名)
git grep -w func -A100 -B100

假設有一個內部函式叫做func(), 沒有文件,如何知道這個函式怎麼用?除了閱讀內部函式的實現和閱讀例項,基本上沒有其他方法。對於這種情況
可以批量找到func的用例,在vim裡從上往下先掃一遍,找到儘可能簡單的用例,然後再返回到原始檔中閱讀這個用例的上下文.

git alias

有些常用的git操作,我們可以通過設定git alias加快輸入

git config --global alias.prev `checkout HEAD~`
git config --global alias.next `! f() { git log --reverse --pretty=%H ${1:-master} | grep -A 1 $(git rev-parse HEAD) | tail -n1 | xargs git checkout; }; f`
git config --global alias.difp `diff HEAD~..HEAD`

更多文章的目錄在這裡

相關文章