Successfully reported this slideshow.
Your SlideShare is downloading. ×

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

Ad
Ad
Ad
Ad
Ad
Ad
Ad
Ad
Ad
Ad
Ad
Loading in …3
×

Check these out next

1 of 87 Ad

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

Download to read offline

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

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

Advertisement
Advertisement

More Related Content

Slideshows for you (20)

Advertisement

More from Alan Tsai (20)

Recently uploaded (20)

Advertisement

大家應該都要會的工具 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

Editor's Notes

  • https://git-scm.com/book/en/v2/Git-Internals-Git-Objects
  • https://www.git-scm.com/book/en/v2/Git-Branching-Branches-in-a-Nutshell
  • https://git-scm.com/book/en/v2/Git-Internals-Git-Objects
  • https://www.git-scm.com/book/en/v2/Git-Branching-Branches-in-a-Nutshell

×