Git for Professionals

概念總結

  • 避免單次 commit 大量修改,導致不易理解修改內容,即 降低 Commit 的顆粒度

  • 一致的 Commit Message,搭配簡短的 Subject 和更多細節的 Body 來描述修改內容。

  • Git WorkFlow 主旨在於降低團隊錯誤衝突的可能性。

  • PR 主要使用在需要第三者檢驗 Code,或者是想對開放專案貢獻時提出建議時。

  • 在協同合作時,應避免使用 rebase,修改歷史紀錄,可能導致混亂。

完美的 Commit

🌟 Add the right changes! (只新增合理的 Commit)

🌟 Compose a good Commit Message! (搭配一段好的 Commit 訊息)

包含大量修改的 Commit,會讓你的合作夥伴不知道在這個更動做了哪些修改,導致難以判斷。

可以透過 Git staging area(暫存區),來選擇適合的修改,在進行 Commit 。

一致性的 Commit Message

主要內容

Subject:concise summary of what happened(簡短描述修改內容)

Body:more detailed explanation(若需要更多的細節)

  • What is new different than before? (和之前有什麼分別)

  • What the reason for the change? (修改的理由是什麼)

  • Is there anything to watch out for? (有什麼需要注意的) / anything particularly remarkable? (任何特別需要標注的東西)

https://github.com/angular/angular/blob/master/CONTRIBUTING.md

分支建立策略

高度依賴 Team 和 其大小 ,討論出合理的 Branching WorkFlow,

來避免 mistakes(錯誤) 和 collisions(衝突)。

整合改變(Integrating Changes)

透過一條 Mainline development (主線),Ex: master or main,

來完成持續整合許多的小 Commit 或不同的 branch 結果,並且可以達到高品質的測試和標準。

結構化發佈(Structuring Releases)

非主線的其他分支,能夠達到強化 WorkFlow 的功用,

可以針對 hotFix 、feature 或 develop 來做區分,來達到自行管理和發佈時間。

兩種類型的分支

Long-Running

  • 通過存在去完成專案的每個不同階段的 dev life cycle (開發生命週期)。

  • 有一個特點在於,不會有直接的 commit 在這兩個分支上,通常是透過 PR 合併。

如:develop / master / main 分支。

Short-Lived

  • 一般用於 bug fixes(修正 Bug), refactoring(重構), experiments(實驗性) 等場景。

  • 特點在於這些分支完成整合後,會被合併進 Long-Running ,並被刪除。

如:feature / hotfix 資料夾結構下的分支。

常用策略

  • 相當簡單,當有 Feature 或 hotFix 都是從 master 直接分支出來,完成再合併回去。

GitFlow

  • 較複雜的結構,相對也有較多的規則。

  • 整體分支結構

    • Long-running:master + develop

    • Short-Lived:features, releases, hotfixes

參考文章

有害的 GitFlow:https://www.endoflineblog.com/gitflow-considered-harmful 實戰經驗1:https://blog.hellojcc.tw/the-flaw-of-git-flow/ 實戰經驗2:https://blog.hellojcc.tw/a-better-git-flow/ 兩者比較:https://blog.wu-boy.com/2017/12/github-flow-vs-git-flow/

Pull Requests 拉取請求

基本單位為 branch(分支),不會是一個獨立的 Commit。

又可縮寫成 PR,當修改幅度大需要他人檢視 Code 給予回饋,即一般稱之為 Code Review。 當檢視的人覺得沒問題,會再將其合併至 master 或 develop 分支,就結束一個 PR 循環。

或想要對 Open Repository 做貢獻時,卻沒有權限能夠 push,可以透過發 PR 給作者群, 請他們 Review 修改建議,並決定是否能夠合併進去。

Merge Conflicts 合併衝突

當整合時資源的修改不同時,程式無法判斷何處為合理的修改範圍,就必須手動解決。

幾個經常發生的時機:merge , rebase , pull, cherry-pick, stash apply。

Merge

在合併時,若有明顯的差異,Git 會 自動的 產生一個額外的 Commit 來完成。

若沒有明顯差異,一般的 git merge 會是屬於 For-Forward (自動快轉模式)

直接將節點標籤移動到同一個點,而不會有額外的 Commit。

Q:若沒有明顯差異,是否也可以印出線圖?

A:可以,透過 git merge branch --no-ff

https://gitbook.tw/chapters/branch/merge-commit.html

Q:合併沒有完成,如何回到原本的版本?

A:git merge --abort

Rebase

和 Merge 類似,但是透過修改歷史紀錄的方式,來完成合併,當只想要一條乾淨的直線時,可使用

將已 Commit 的內容,回復到某個節點(移除原本的節點),即透過某個基準點上作為參考依據,

在下次 push 時,一起更新上去,看起來就會像一條直線。

參考資料

Last updated

Was this helpful?