# Git & Github 版本控制(一) :::info :bulb:學習使用基礎的 git 指令與 github 進行工作 ::: ![image](https://hackmd.io/_uploads/H1XE-1BWC.png) [TOC] ## 學習目的 程式碼的儲存備份以外,也為後續線上服務的版本更新及版控 ## 事前準備 1. 安裝 Git 2. Github 帳號 3. 習慣使用的 IDE tools ## 工作原理 這裡可以看這篇影片說明,以最簡單的方式快速理解[最容易懂的git介紹](https://www.youtube.com/watch?v=N6YQlPuAamw) ### 工作流程 下圖說明整個 git 同步到遠端儲存庫的過程: ![image](https://hackmd.io/_uploads/B1bCAKhop.png) #### 1. 工作目錄(Working Directory) 工作目錄是你當前專案的實際工作資料夾,包含了專案的所有檔案,進行修改、編輯和開發的地方。 #### 2. 暫存區(Staging Area) 暫存區是一個中間區域,用於暫時存放你的修改,但這些修改還沒有被提交到本地儲存庫。 在這個階段,你可以選擇性地添加、編輯和刪除檔案,然後將這些更改暫存到暫存區。 #### 3. 本地儲存庫(Local Repository) 本地儲存庫是專案在自己電腦裡儲存庫,包含專案的完整歷史記錄。 當你確認對暫存區的更改時,你將這些更改提交到本地儲存庫,形成一個新的提交(commit)。 本地儲存庫保留了專案的所有版本歷史記錄,可以在需要時回滾到以前的版本。 #### 4. 遠端儲存庫(Remote Repository) 遠端儲存庫是存儲在網路上的專案中央儲存庫的備份,通常是在像GitHub、GitLab或Bitbucket等託管服務上。 可以將本地儲存庫中的更改推送(push)到遠端儲存庫,也可以從遠端儲存庫拉取(pull)最新的更改,多個開發者可以共享和協作在同一個遠端儲存庫上工作。 :::success 這裡我們只用到幾個基礎指令(git add / git remote / git commit / git push) 其他指令可參考 [git 指令參考](https://nulab.com/zh-tw/learn/software-development/git-tutorial/git-commands-settings/basic-git-commands/) ::: ## 實務操作 ### 建立程式碼儲存倉庫 首先要建立一個新的 Repository ![image](https://hackmd.io/_uploads/SJB6cq2j6.png) 新增 repository name 後,可以按照提示建立遠端 repository 連線 [初始化本地儲存庫](https://hackmd.io/7eIaOpMpSt6OMaC_TVBKlA?both#%E5%88%9D%E5%A7%8B%E5%8C%96%E5%B0%88%E6%A1%88) ![image](https://hackmd.io/_uploads/rkI6Zs3s6.png) :::success :bulb: 連線儲存庫方法: 1. 使用 SSH Key 連線,可以使用指令測試有沒有設定過ssh連線(ssh -T git@github.com)設定方式可參考[這篇](https://hackmd.io/@e9gZC-1CQNOzcD2pMY6apA/rkQtWbkgj#%E5%BB%BA%E7%AB%8BSSH-Key%EF%BC%81) 2. 透過 HTTPS Credentials Caching 功能,它提供一套機制能夠幫助你記憶透過 http / https 連接 Git 儲存庫時所需要輸入的密碼 ::: 配置 Http Credentials config ```shel git config --global user.name "使用者名稱" git config --global user.email "使用者電子郵件" ``` Git 的設定檔裡也可以自定義一些縮寫,來增加在指令操作的效率 ```shel git config --global alias.co checkout //git co git config --global alias.br branch //git br git config --global alias.st status //git st git config --global alias.cm commit //git cm git config --global alias.logog "log --oneline --graph" //git logog ``` 舉例:設定別名 ls 執行 <kbd>**git ls**</kbd> 直接查看 log 時,並將時間及 commit 操作對象也印出來 ```shel git config --global alias.ls 'log --graph --pretty=format:"%h <%an> %ar %s"' //git ls ``` 查看當前設定 ```shel git config -l ``` :::info git config 紀錄著設定參數,並利用參數控制 Git 這個檔案預設會是在自己帳號下的 .gitconfig 檔案裡 因此上述設定的 git config --global 指令內容,都會被寫入 ~/.gitconfig --global參數:「全域( Global )」設定。代表在此系統,無論 Git 做任何事情都會使用這資訊。 --local 參數:針對某個數據庫做設定,如果有專案需要使用不同的儲存庫時可以使用。 ::: 連接遠端儲存庫 ``` git remote add origin <repository URL> ``` 連接後可以查詢目前遠端連線的儲存庫 ``` git remote -v ``` ![image](https://hackmd.io/_uploads/SkFFjepsT.png) :::info 這裡 origin 為遠端儲存庫的別名,可自定義,通常預設使用 origin ::: ### 初始化專案 :::success :bulb: 在建立新專案目錄時,需要初始化 local repository 代表要讓 git 對該目錄開始進行版本控制 ::: 執行初始化後會在目錄建立一個名叫 .git 的目錄,會將所有 Git 的設定內容都存在這個目錄裡,任何版本都需要透過這個資料夾進行版本控制 ```shel git init ``` ### 提交到本地儲存庫 在將當前目錄下的所有更改添加到暫存區 ```shel git add . ``` :::info git add -A 或是 git add . 都代表該目錄下的所有文件 對特定文件提交 git add example.txt ::: 將提交暫存區的更改到本地儲存庫,並添加提交信息 ```shel git commit -m "message" ``` 推送本地儲存庫的更改到遠程儲存庫 ```shel git push -u <remote_name> <branch_name> ``` :::success -u 或 --set-upstream:這個選項告訴 Git 設置本地分支和遠端分支之間的追蹤關係。這樣一來,當你在本地分支上執行 git push 時,Git 將知道要將更改推送到哪個遠端分支。 ::: 接著可以從 log 中查看到成功提交的紀錄 ```shel git log ``` ![image](https://hackmd.io/_uploads/Hy4X1ZTsa.png) ## 驗證 在 github 上就可以觀察到針對有修改過的文件已經同步上 repository 儲存庫 ![image](https://hackmd.io/_uploads/BkeDgZajp.png) ## 延伸閱讀 [Git & Github 版本控制(二)](https://hackmd.io/O-C0q4NIR5CnhzN7w9IMrw) [Doscify 架設私有文檔網站](https://hackmd.io/sXSjOGHdR_-WuyASBBIVyA) [AWS S3+Cloufront 建立靜態網站](https://hackmd.io/5v15MV9rSzSsDPp7r1bP0g) [Github Action + S3 微型 CI/CD 實務](https://hackmd.io/IxlHGXXkQFSHBdKyYfrLBQ) ## 參考資料 #### [從零開始學習 Git - 30 天的學習筆記](https://ithelp.ithome.com.tw/m/articles/10270470) ---