Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

大家應該都要會的工具 Git 從放棄到會用2-分支篇

1,084 views

Published on

在2017/06/24 study4 的6月台中場次介紹
http://study4.tw/Activity/Details/6
有篇回顧那個場次的反饋:http://to.alantsai.net/20170624-blog-ss
主要是source tree + TortoiseGit + 指令介紹 如何使用 branch、解決衝突和和遠端溝通

Published in: Software
  • Be the first to comment

大家應該都要會的工具 Git 從放棄到會用2-分支篇

  1. 1. 大家應該都要會的工具 git By Alan Tsai 2017-06-24 從放棄到會用 – 分支篇
  2. 2. 關於我 2 ▰Alan Tsai 蔡孟玹 ▰後端(攻城)工程師 ▻Web Developer - 主要使用 .Net/C# 和 Asp .Net Mvc ▰看小說 ▰找到我 – contact@alantsai.net ▻http://blog.alantsai.net - Alan Tsai 的學習筆記 ▻{服務}.alantsai.net ▻http://fb.alantsai.net - fb ▻http://ln.alantsai.net – linkeding ▻http://ss.alantsai.net - slideshare
  3. 3. Agenda 3 ▰Branch 目的 ▰了解git 運作模式 ▰合併
  4. 4. Branch的目的 4
  5. 5. 千金難買早知道 5
  6. 6. 開branch 6 ▰工作快速切換 ▻Feature ▻Issue ▰嘗試性 ▰開branch換時間點
  7. 7. Git的運作機制 7
  8. 8. 版控什麼 8 ▰其他版控看的是檔案變更 ▰http://git-scm.com/book/en/Getting-Started-Git-Basics#Snapshots,-Not-Differences
  9. 9. 版控什麼 9 ▰Git版控的是內容變更 ▰每個commit是snapshot ▰http://git-scm.com/book/en/Getting-Started-Git-Basics#Snapshots,-Not-Differences
  10. 10. Git 構成單位 10 ▰Object ▻記錄資訊 ▰Ref ▻指針(pointer)資訊 ▻快速定義到某一個組合
  11. 11. Git的構成單位 - object 11 ▰Object – SHA1 ▻tree ▻同等於 資料夾 ▻blob ▻同等於 檔案 ▻Commit ▻tree、父 commit ▻Annotated tag ▻同commit
  12. 12. Git的構成單位 - object 12
  13. 13. Git的構成單位 – 靈活的組成單位 13
  14. 14. Git commit示意圖 14 ▰Git commit示意圖
  15. 15. Git commit示意圖 – 簡化 15 C0 C1 C2
  16. 16. Git的構成單位 - ref 16 ▰每次都要記住sha1很麻煩 ▰一個好記得名字 ▻預設有個 master branch ▻有個HEAD,代表目前位置 C0 C1 C2 master HEAD
  17. 17. Git commit到底發生什麼 17 ▰當commit的時候 ▻由head帶著目前branch前進 ▻建立出commit C0 C1 C2 master HEAD C3
  18. 18. 開始使用Branch 18
  19. 19. 建立branch 並且切換 19
  20. 20. 建立branch 並且切換 21 ▰或 git checkout –b branch1 git branch branch1 C0 C1 C2 master HEAD branch1 HEAD git checkout branch1
  21. 21. 建議的branch命名方式 22 ▰通常branch會是一個功能或者bug修改 ▻{issue tracking號碼}-概述 ▻2-addValidation ▰Branch前面加上前戳 – 用 斜線分隔 ▻容易區分類型 ▻feautre/2-addValidation ▻hotfix/3-exceptionDivideByZero
  22. 22. 切換、刪除 branch 23 ▰圓圈 粗體 目前所在的branch ▻點branch名稱兩下 ▻也可以點log兩下切換branch ▰刪除branch ▻右鍵 -> Delete {branch 名稱} git checkout branch1 git branch –d branch1
  23. 23. 切換branch注意事項 25 ▰Working Directory ▻最好是乾淨無修改 ▰可以搭配stash ▰Detach HEAD
  24. 24. 刪除 branch 注意事項 26 ▰不能刪除目前所在的branch ▰如果被刪除的branch尚未合併 預設不給刪 ▻要加上 -D 就可以刪 C0 C1 C2 master HEAD C3 branch1
  25. 25. Merge Branch 27
  26. 26. Merge branch(合併分支) 28 ▰如果不能合併,分支就沒意義了 ▰分支的概念 ▰從 目前分支 合併 到 選取的分支 git checkout master git merge branch1
  27. 27. Fast-Forward Merge 29 ▰找到 master 和 branch1的共同commit ▻C2 ▰C2到branch1(C3)差了一個commit ▰可以快轉合併 C0 C1 C2 master HEAD C3 branch1
  28. 28. Non Fast Forward Merge 30 ▰找到 master 和 branch1的共同commit ▻C2 ▰總共缺少C3和C4 ▻做一個Non Fast Forward Merge C0 C1 C2 master HEAD C3 branch1 C4 C5
  29. 29. Fast Forward Merge vs Non Fast Forward Merge 31 ▰FF ▻不會有衝突 ▰N FF ▻很明確看的出來有合併
  30. 30. FF也當成N FF 32 ▰更容易看出有合併過 ▻搭配 ▻增加合併說明 ▰適合使用情境 ▻想要明確表示有整并過 ▻搭配rebase git merge –-no-ff branch1 git commit --amend
  31. 31. 衝突(Merge Conflict)這件事 33 ▰當有非FF Merge的時候就有可能衝突 ▰衝突發生原因 ▻當同一行有完全不同的修改 ▻機器無法判斷要用那個 ▻當非同一行有修改 ▻工具一般能夠自動判斷是相關 – 因此自動幫忙處理
  32. 32. 衝突的底層 34 ▰衝突發生的時候有4個檔案 ▻$LOCAL – 發起 merge的branch內容版本 ▻master的內容 (C4) ▻不會修改 ▻$REMOTE – 要被merge的branch內容版本 ▻Branch1的內容 (C3) ▻不會修改 ▻$BASE - $LOCAL 和 $REMOTE為修改之前的樣子 ▻兩邊的原始共通 (C2) ▻不會修改 ▻$MERGED – 最後合併的樣子 ▻修改這個檔案 (C5) C2 master HEAD C3 branch1 C4 C5
  33. 33. 設定自己習慣的解決衝突工具 35 ▰推薦Kdiff3
  34. 34. TortoiseMerge vs KDiff3 36
  35. 35. 發生衝突 – 在做Non FF merge會出現 37
  36. 36. 解決衝突 – 用剛剛設定的kdiff 38 ▰對conflict檔案點右鍵 ▻Launch External Merge Tool ▻呼叫剛剛設定的kdiff3
  37. 37. 解決衝突 - commit 39 ▰確認好內容 ▰在做一個commit把內容儲存 ▰會自動帶入conflict資訊
  38. 38. 解決衝突 – 重來 40 ▰如果解決衝突期間想要重來 ▰可以通過: ▻選擇要重來的檔案 ▻上面的「Action」 ▻Resolve Conflicts ▻Restart merge
  39. 39. rebase branch 41
  40. 40. 請注意 42 ▰Rebase功能很強大 ▻但是要注意 ▻千萬不能對已經送上去的commit做rebase ▰Commit越快越多越好 ▻但是會太雜 ▻透過rebase做一次清理 ▰有些人不建議使用 – 不過用的好幫助很大
  41. 41. Git rebase 43 ▰可以重新把 commit apply上去 ▻變成1條線 ▰目的 ▻整理commit ▻調整訊息 ▻拆解commit
  42. 42. Git rebase 44 ▰搭配 git merge --no-ff ▻產生明顯有branch過 C2 master HEAD C3 branch1 C4 ‘C3
  43. 43. git rebase --interactive 45 ▰放上去的時候重新整理
  44. 44. 不能動的Branch git tag 46
  45. 45. Git tag – 打標籤 47 ▰記錄某個點 ▰列出目前的tag ▰Tag有兩種 ▻annotated tag ▻可以寫說明 ▻Lightweight tag ▻Sign Tag ▰建議使用annotated tag git tag git tag –a v1.0 git tag v1.0
  46. 46. Git tag – 好的tag標籤 48 ▰Semantic Version ▻Major.Minor.Build ▰要不要加v看個人
  47. 47. Git push --tag 49 ▰Push的時候記得包含tag ▰才會上去
  48. 48. 其他特殊指令 Cherry pick 50
  49. 49. 從某個節點取內容 - Cherry pick 51 ▰想從一堆commit抓一個過來 ▰修bug commit C1 C2 C3 branch1 C4 C5 ‘C3 git cherry-pick {c3} master HEAD
  50. 50. 從某個節點取內容 - Cherry pick 52
  51. 51. 遠端溝通 53
  52. 52. 和遠端溝通 54 ▰遠端的git和本地的git一樣 ▰有一個特殊的branch代表遠端的位置 ▰透過 pull 和 push 來和遠端 sync
  53. 53. git push 55 ▰同merge一樣概念 ▻變成找出 local和遠端版本差異 ▻Push上去
  54. 54. 設定遠端 56 ▰免費的遠端 ▻Github ▻Visual Studio Team Service ▻雲端TFS,5人以內免費 ▻Bitbucket ▰VSTS做範例
  55. 55. 在遠端先建立 57 ▰Visual Studio Team Service
  56. 56. 設定remote網址 58 git remote add https://alantsai.visualstudio.com/DefaultCollection/_git/testProject
  57. 57. Git push 59 ▰把本地內容push上去 ▻Track表示本地branch和remote有 ▻對應關係 git push –u origin master
  58. 58. 輸入認證資訊 60 ▰兩步驗證
  59. 59. 看到多一個origin/master 61
  60. 60. 和遠端溝通的3個指令說明 62 ▰Fetch(獲取) ▻從遠端取得最新 ▻更新 origin/master ▰Pull(拉取) ▻從遠端取得最新,並且和本地track branch做merge ▻ git fetch + git merge ▰Push(推送) ▻把本地和origin/master的差異push上去
  61. 61. 從遠端開始 63 ▰git clone {url} ▰同等於 ▻git init ▻git remote add origin {url} ▻git pull
  62. 62. 遠端溝通原則 64 ▰絕對不能夠改已經推送內容 ▻git commit –amend ▻Rebase ▰Git會保護你 ▻不會允許你push ▻但是別加上 --force
  63. 63. 和遠端溝通原則 65 ▰記得先和遠端update過 ▻Pull或fetch ▰在push
  64. 64. Branch模式/Workflow 66
  65. 65. Branch模式意義 67 ▰如何多人協同 ▰Centralized ▰Feature (topic) Branch ▰Git flow ▰Fork Repository Flow
  66. 66. Centralized 68 ▰ 和SVN一樣運作模式 ▰ 總共就一個master分支 ▰ git pull加上 –rebase 保持更新線行 ▻ 或呼叫 git fetch origin git rebase origin
  67. 67. Centralized 69 ▰最好開始上手 ▻和以前svn運作模式一樣 ▻又能夠使用git的優勢 ▰問題 ▻功能無法協同合作 ▰Log ▻看起來是線行
  68. 68. Feature (topic) Branch 70 ▰Master為主線 ▰有功能就建立一個branch做開發 ▰最後做完在merge回master ▻搭配pull request做review ▰Merge完branch就刪掉
  69. 69. Git flow模式 71 ▰2010 Vincent Driessen提出 ▰http://nvie.com/posts/a-successful-git-branching-model/ ▰比較複雜 ▻把穩定版本和最新開發版本切開
  70. 70. Git flow模式 72 ▰兩條主線 ▻Master ▻代表目前最stable版本 ▻Develop ▻代表目前最新程式碼(nightly build) ▰其他分支線 ▻feature/* ▻hotfix/* ▻release/*
  71. 71. Git flow 模式 - feature 73 ▰用作於功能開發 ▰一般開在本地 ▰需要協同才push上去 ▰從哪個branch分支 ▻develop ▰合並回 ▻develop
  72. 72. Git flow 模式 - release 74 ▰當develop準備上線 ▰用於更新版號資訊 ▰從哪個branch分支 ▻develop ▰合並回 ▻develop ▻master ▰在master建立tag
  73. 73. Git flow 模式 - hotfix 75 ▰緊急bug ▻ 需要馬上處理 ▰從哪個branch分支 ▻master ▰合並回 ▻develop ▻master ▰在master建立tag
  74. 74. Git flow工具 76 ▰因為複雜,所以有個工具專門做這個事情 ▻https://github.com/nvie/gitflow ▻https://github.com/petervanderdoes/gitflow-avh ▻語法都是:git flow {branch類型} {動作} 參數 git flow init git flow feature start {name} // 一般開發 git flow feature finish {name} // 需要push或pull git flow feature push {name} git flow feature track {name}
  75. 75. Git flow – source tree 77
  76. 76. Git flow – source tree – 結束branch 78
  77. 77. Fork Workflow 79 ▰也可以稱為github flow ▰和Feature Branch Flow一樣 ▰差異在於 ▻要開發的人從原始先做一個fork ▻開branch開發 ▻做一個pull request回去 ▰https://guides.github.com/introduction/flow/
  78. 78. 其他工具 80
  79. 79. Git lfs 81 ▰非文字類型越長越大 ▰Git lfs 把commit記錄為hash pointer ▻實體檔案存在另外一個地方
  80. 80. Git lfs 82 ▰安裝 ▻https://git-lfs.github.com/ ▰執行 – 電腦只要執行一次就好 ▰在專案執行 git lfs install git lfs track “*.psd” git add .gitattributes git commit
  81. 81. Source Tree 83
  82. 82. 結語 84
  83. 83. 怎麼開始使用git 85 ▰沒有那個比較好,只有那個比較適合 ▰可以先從自己local玩起 ▰如果公司使用SVN,或TFS – 都可以用git溝通 ▻git svn - 開始使用git - 用git操作svn repo ▻Git tfs
  84. 84. 相關資源 86 ▰Git官網 https://git-scm.com/ ▻Pro Git https://git-scm.com/book/en/v2 ▰Git指令圖解說明 ▻http://marklodato.github.io/visual-git-guide/index-en.html ▻https://onlywei.github.io/explain-git-with-d3 ▰線上git操作 ▻https://try.github.io/levels/1/challenges/1 ▻http://onlywei.github.io/explain-git-with-d3/#branch ▻http://pcottle.github.io/learnGitBranching/
  85. 85. 相關資源2 87 ▰連猴子都能夠懂的Git入門指南 ▻http://backlogtool.com/git-guide/tw/ ▰30 天精通 Git 版本控管 ▻裡面有進入到git的細節 ▻https://github.com/alantsai/Learn-Git-in-30-days ▰關注我的部落格 – 特別是git標籤 - http://blog.alantsai.net/search/label/Git
  86. 86. 88 Q&A 感謝大家 任何問題都可以在 contact@alantsai.net 部落格-Alan Tsai 的學習筆記 找到我
  87. 87. CREDITS Special thanks to all the people who made and released these awesome resources for free: ▰ Presentation template by SlidesCarnival ▰ Photographs by Startup Stock Photos 89

×