# 如何使用 Git? (遠端篇) --- ## 目錄 - 遠端建立專案 - 設定遠端連線 - 設定UpStream - 下載專案 - 同步遠端分支 - GUI 工具介紹 - GitFlow - 小知識 --- ## 遠端建立專案 ---- ### Github 建立遠端專案 <li style="text-align:start;font-size:30px;padding-left: 200px;">步驟ㄧ、建立專案名稱</li> <img src="https://i.imgur.com/UoaJ8sj.png" height="450"> ---- ### Github 建立遠端專案 <li style="text-align:start;font-size:30px;padding-left: 200px;">步驟二、選擇遠端建立專案的方式</li> <img src="https://i.imgur.com/7IwSfUT.png" height="450"> ---- ### Github 建立遠端專案 <li style="text-align:start;font-size:30px;padding-left: 150px;">步驟三、建立完成</li> <img src="https://i.imgur.com/6YBbXbt.png" height="200"> --- ## 設定遠端連線 ---- ### Repository URL <ul style="margin-left:80px;"> <li style="text-align:start;font-size:30px">HTTPS:每次上傳 code 到 Github 的時候,都要輸入一次 username、password</li> </ul> ```= https://github.com/boringpig/git-demo.git ``` <ul style="margin-left:-60px;"> <li style="text-align:start;font-size:30px">SSH:只要設定好一次之後,就不用再輸入帳號/密碼了</li> </ul> ```= git@github.com:boringpig/git-demo.git ``` ---- ### 透過 SSH 如何連線? - SSH 跟 GitHub 建立連線是透過[RSA加密演算法](https://zh.wikipedia.org/wiki/RSA%E5%8A%A0%E5%AF%86%E6%BC%94%E7%AE%97%E6%B3%95) - RSA 金鑰是一對(一把私鑰 + 一把公鑰) - "公鑰"提供給 GitHub Server - "私鑰"存放在自己的電腦, - 建立連線會進行公私鑰配對及身分驗證 ---- ### 圖示 <img src="https://i.imgur.com/sKcwJOf.png" height="470"> ---- ### 如何產生公私鑰 <li style="text-align:start;font-size:30px;list-style:none;padding-left:50px;">1. 使用 ssh-keygen 產生金鑰</li> <p style="text-align:start;font-size:28px;margin-left:80px;margin-top:0px;">可以在 ~/.ssh 裡面看到 id_rsa 私鑰、id_rsa.pub 公鑰</p> ```= ssh-keygen -t rsa -C [備註] ``` <li style="text-align:start;font-size:30px;list-style:none;padding-left:50px;">2. 將公鑰上傳到 GitHub Server</li> ```= cat ~/.ssh/id_rsa.pub ``` ---- ### 加入到遠端 Server <li style="text-align:start;font-size:30px;list-style:none;padding-left:150px;">3. 遠端加入公鑰</li> <img src="https://i.imgur.com/tJXx6aW.png" height="400"> ---- ### 測試連線 <li style="text-align:start;font-size:30px;list-style:none;padding-left:50px;">4. 測試 SSH 連線是否成功</li> ```= ssh -T git@github.com ``` <img src="https://i.imgur.com/rtEHMIL.png"> ---- ### 設定遠端 Repo Url <li style="text-align:start;font-size:30px;padding-left:50px;">加入遠端 url</li> ```= git remote add <short name> <repo url> # example git remote add origin https://github.com/boringpig/git-demo.git ``` ---- ### 設定遠端 Repo Url <li style="text-align:start;font-size:30px;padding-left:50px;">查看專案遠端狀態</li> ```= git remote -v ``` ![](https://i.imgur.com/FFwrkrg.png) ---- ### 其他 remote 指令 <li style="text-align:start;font-size:30px;padding-left:50px;">一般來說 Git 會把主要的 remote 命名為 origin</li> ```= # 修改 remote name git remote rename <short name> <new name> # 刪除 remote git remote rm <short name> ``` ---- ### 上傳分支 <li style="text-align:start;font-size:30px;padding-left:50px;">設定完就可以推到遠端</li> ```= git push -u <remote name> <branch name> # example git push -u origin master ``` <img src="https://i.imgur.com/JStMER2.png" height="300"> ---- ### 例外狀況 - 為何加完 SSH key 還要叫你打密碼 ![](https://i.imgur.com/QWjhC2B.png) --- ## 設定UpStream ---- ### 為何要設定 <li style="text-align:start;font-size:33px;padding-left:30px;">設定 upstream 可以使分支追蹤指定的遠端分支</li> ![](https://i.imgur.com/NwmBCLm.png) ---- ### 如何設定 <li style="text-align:start;font-size:33px;padding-left:45px;list-style:none;">1. 在推到遠端順便設定 upstream</li> ```= git push -u origin master git push --set-upstream-to=origin master ``` <li style="text-align:start;font-size:33px;padding-left:45px;list-style:none;">2. 舊有分支設定 upstream</li> ```= git branch -u origin/master git branch --set-upstream-to=origin/master ``` <p style="color:red;text-align:start;font-size:33px;margin-left:45px;">* 設定完之後推到遠端就只要 git push</p> ---- ### 取消追蹤 ```= git branch --unset-upstream origin/master ``` ![](https://i.imgur.com/OasF0eK.png) --- ## 下載專案 ---- ### 下載指定分支 <li style="text-align:start;font-size:33px;padding-left:45px;">-b 指定分支,如果沒加參數預設為 master</li> ```= # 下載指定分支 git clone <repo URL> -b <branch name> # example git clone git@bitbucket.org:evolutivelabs/hidden-server.git -b develop ``` ---- ### 下載單一分支 <li style="text-align:start;font-size:33px;padding-left:45px;">--single-branch 只下載單一分支 </li> <li style="text-align:start;font-size:33px;padding-left:45px;">--depth 下載幾個 commit 數量 </li> ```= git clone <url> -b <branch> --single-branch --depth <number of commits> # example git clone git@bitbucket.org:evolutivelabs/hidden-server.git -b develop --single-branch --depth 1 ``` ---- ### 兩者相比 <li style="text-align:start;font-size:33px;padding-left:40px;">指定分支</li> <img src="https://i.imgur.com/XaDXq55.png"> <li style="text-align:start;font-size:33px;padding-left:40px;">單一分支</li> <img src="https://i.imgur.com/RESRNIY.png"> --- ## 同步遠端分支 ---- ### 為何要同步 <ul style="margin-left:80px;"> <li style="text-align:start;font-size:33px;">當遠端分支有更動,本地端要透過指令去同步 remote branch 不然不會知道遠端有變更</li> </ul> ```= git fetch --all ``` ---- ### 同步後 <ul style="margin-left:-40px;"> <li style="text-align:start;font-size:33px;">如果分支有設定 Upstream 就會更新本地端分支狀態</li> </ul> ```= git status ``` ![](https://i.imgur.com/vTp5toZ.png) ---- ### 自動同步並合併 <ul style="margin-left:-5px;"> <li style="text-align:start;font-size:33px;">git pull 會先同步遠端分支的狀態,如果有變更自動合併</li> </ul> ```= git pull ``` ---- ### 強制更新遠端分支 <ul style="margin-left:-150px;"> <li style="text-align:start;font-size:33px;">直接把本地端的 branch 覆蓋遠端的 branch</li> <li style="text-align:start;font-size:33px;">-f 參數為 --force 的縮寫,代表"強制"的意思</li> </ul> ```= git push -f ``` ---- ### 刪除遠端分支 <li style="text-align:start;font-size:33px;padding-left:50px;">方法ㄧ、指令刪除</li> ```= git push origin :feature/xxx git push origin --delete feature/xxx ``` ![](https://i.imgur.com/3dgDw4M.png) <li style="text-align:start;font-size:33px;padding-left:50px;">方法二、介面刪除</li> ---- ### 查看 remote 狀態 ```= # 查看遠端分支狀態 git remote show <remote name> ``` <img src="https://i.imgur.com/Iwn41ka.png" height="330"> ---- ### 刪除過時的分支 <li style="text-align:start;font-size:33px;padding-left:50px;">如果使用介面刪除 git fetch 無法同步到本地端</li> ```= git remote prune <remot name> git fetch --all -p git fetch --all --prune ``` --- ### GUI 介紹 ---- ### 為何需要 GUI 工具 <ul style="margin-left: 50px;"> <li style="font-size:35px;">很多 git 的指令,不常用容易忘記</li> <li style="font-size:35px;">在操作版控時不需要去記憶指令</li> <li style="font-size:35px;">圖像化的分支圖清楚了解分支狀態</li> </ul> ---- ### 常見工具 <li style="text-align:start;padding-left:160px;font-size:33px;"><a href="https://www.sourcetreeapp.com/">SourceTree</a></li> <img src="https://i.imgur.com/dFAeyDW.jpg" height="430"> ---- ### 常見工具 <li style="text-align:start;padding-left:160px;font-size:33px;"><a href="https://www.gitkraken.com/">GitKraken</a></li> <img src="https://i.imgur.com/pVeF6fE.png" height="430"> ---- ### GitKraken 介紹 <ul style="margin-left:40px;"> <li style="text-align:start;font-size:33px;">使用 Electron 作為基底開發</li> <li style="text-align:start;font-size:33px;">SourceTree 有的功能都有</li> <li style="text-align:start;font-size:33px;">提供 git reset 介面化操作</li> <li style="text-align:start;font-size:33px;">可以自由隱藏分支</li> <li style="text-align:start;font-size:33px;">提供拖拉進行分支合併更直覺</li> <li style="text-align:start;font-size:33px;">可以直接新增檔案進行提交</li> <li style="text-align:start;font-size:33px;">Commit Template</li> <li style="text-align:start;font-size:33px;">自定義 git flow</li> <li style="text-align:start;font-size:33px;">Issue Boards</li> </ul> --- ### Git + Work Flow ---- ### 為何需要定義 - Commit tree 好醜 - 胡亂開分支造成版本混亂 - 合併分支有解不完的衝突 - 正式站跟測試站容易版本不一致 ---- ### Git Flow <img src="https://i.imgur.com/y3P3kYF.png" height="480" width="500"> <p style="font-size:30px;">資料來源 <a href="https://nvie.com/posts/a-successful-git-branching-model/">A successful Git branching model</a></p> ---- ### Git Flow <ul> <li>主要分支</li> <ul> <li>master: 交付程式版本的分支</li> <li>develop: 開發中功能的分支</li> </ul> <li>輔助分支</li> <ul> <li>feature/xxx: 功能開發分支(從 develop 切出去)</li> <li>release/xxx: 發佈測試分支(從 develop 切出去)</li> <li>hotfix/xxx: bug 修復分支(從 master 切出去)</li> </ul> </ul> <p style="font-size:33px;color:red;text-align:start;margin-left:20px;">*當 feature、hotfix 分支有異動務必同步合併回 develop</p> <p style="font-size:33px;color:red;text-align:start;margin-left:20px;">*主要分支只能被合併不能 commit</p> ---- ### 缺點 不適合持續發怖,因為master、develop分支差異不大,沒必要維護兩個分支 ---- ### GitHub Flow ![](https://i.imgur.com/FLi5sDl.png) <p style="font-size:30px;">資料來源 <a href="https://guides.github.com/introduction/flow/">Understanding the GitHub flow </a></p> ---- ### GitHub Flow <ul> <li>主要分支</li> <ul> <li>master: 交付程式版本分支</li> </ul> <li>輔助分支</li> <ul> <li>refactor-authentication、make-retina-avatars等: 命名有描述性的分支</li> </ul> </ul> ---- ### 缺點 有時候合併到 master 並非馬上部署,會造成版本不一致狀況 ---- ### GitLab Flow <li style="font-size:35px;text-align:start;margin-left:100px;">"上游優先"(upsteam first)為原則</li> <li style="font-size:35px;text-align:start;margin-left:100px;">主要分支 master 是所有其他分支的"上游"</li> <li style="font-size:35px;text-align:start;margin-left:100px;">程式的變化必須由"上游"向"下游"發展</li> ---- ### GitLab Flow <li style="font-size:35px;text-align:start;list-style:none;margin-left:260px;">第一種、持續發佈</li> <img src="https://i.imgur.com/hDoeA0Q.png" height="480"> ---- ### GitLab Flow <li style="font-size:35px;text-align:start;list-style:none;margin-left:280px;">第二種、版本發佈</li> <img src="https://i.imgur.com/uCDtZLE.png" height="500"> --- ### 小知識 ---- ### 何謂 Issue <ul style="text-align:start;"> <li>issue 用於 Bug 追蹤或功能需求管理</li> <li>先新建 Issue,再新建對應的功能分支</li> </ul> <p style="font-size:30px;text-align:start;color:red;">*當 commit 訊息加上#編號,就可以在 issue 底下看到該功能的 commit 紀錄。</p> ---- ### 何謂 Pull Request <ul style="text-align:start;"> <li style="font-size:40px;list-style:none;">字面上為 Pull (拉取) + Request (請求)</li> <li style="font-size:40px;list-style:none;margin-top:10px;">=> 合併別人修改後的程式</li> </ul> ---- ### Pull Request 例子 <li style="font-size:35px;text-align:start;margin-left:220px;">團隊維護專案</li> <img src="https://i.imgur.com/cEXRCzt.png" height="450"> ---- ### Pull Request 例子 <li style="font-size:35px;text-align:start;margin-left:250px;">開源專案</li> <img src="https://i.imgur.com/bSaXERZ.png" height="470"> --- ## 謝謝大家希望各位 Git 能力有所提升 😀 --- ### 相關連結 - [連猴子都能懂的git](https://backlog.com/git-tutorial/tw/reference/config.html) - [Git book](https://zlargon.gitbooks.io/git-tutorial/content/) - [30 天精通 Git 版本控管](https://github.com/doggy8088/Learn-Git-in-30-days/blob/master/zh-tw/README.md) - [為你自己學Git](https://gitbook.tw/chapters/config/user-config.html) - [GitKraken 強大的剛剛好的Git GUI神器](https://wellwind.idv.tw/blog/2018/04/03/git-using-gitkraken-1-basic/) - [Git 工作流程](http://www.ruanyifeng.com/blog/2015/12/git-workflow.html)
{"metaMigratedAt":"2023-06-14T19:20:44.010Z","metaMigratedFrom":"Content","title":"如何使用 Git? (遠端篇)","breaks":true,"contributors":"[{\"id\":\"5344d19f-c240-4fe4-bd63-c70af739e6c4\",\"add\":15372,\"del\":4503}]"}
    2614 views