--- title: Git 實際演練 tags: 網頁組 --- # Git 實際演練 - 前言 認識完 Git 是做什麼的之後,這個章節,我們要藉由一個實際的開發情境來練習如何操作 Git,本篇教學所示範的平台為 GitLab。 - [第一次 Git 工作坊文章](https://hackmd.io/@2HiJ3gJTTiub4kPJs9-McQ/HJReVaU4u) # 本節目標 - 透過實際範例練習 Git 的操作 # 共同儲存庫空間: 在有電、有網路的現代,我們所謂 GIT 共同儲存庫空間,也就是我們現在常見的 GitHub.com、GitLab.com 等平台提供者。 在這邊,大家都可以申請自己的專案,作為儲存自己的 GIT 儲存庫。 > 為什麼要用 GitLab? :::warning GitLab 有完善的管理介面與權限控制,能夠自己搭建 GitLab ,Code 的隱私性勝於 GitHub ::: # 註冊 GitLab 首先我們要到 [GitLab 的官網](https://about.gitlab.com)進行註冊  ## 設定 SSH key 為什麼我們需要設定 SSH key 呢,簡單來說我們使用 Git 上傳到 GitLab 時,我們是上傳到遠端伺服器,每次上傳都需要進行驗證,就是輸入帳號密碼,而有了 SSH key 之後,我們就不需要一直輸入帳號密碼,SSH key 就相當於一組金鑰,可以讓我們更快速地進行驗證。 > SSH key 更詳細的可以參考下列網址。 :::info [[Linux] SSH 金鑰是什麼?私鑰與公鑰?如何自己產生一個SSH金鑰?](https://richarlin.tw/blog/linux-ssh_key/) ::: ## 如何設定 SSH key 我們在終端機下以下指令 ``` ssh-keygen ```  就會產生出 SSH key 我們需要的在 C:\Users\你的使用者名稱\.ssh\id_rsa.pub  複製下來後我們要到 GitLab 進行設定  # 基本指令介紹 在進入實作之前,我們要先來認識 Git 的基本指令  1. 在本地端寫完程式後,我們會進行 `git add` 的動作將修改過的檔案存進暫存區。 2. 接著我們會進行 `git commit` 的動作將檔案存進本地的儲存庫,進行 commit 時我們還會寫 commit 訊息,紀錄這次進行了怎樣的改動,每次的 commit 都會形成一個紀錄點。 3. 接著我們要將本地的儲存庫上傳到遠端的儲存庫,進行 `git push` 的動作 4. 而我們要將遠端的儲存庫存下來繼續開發,會進行 `git pull` 的動作 > commit 訊息可以參考以下文章 ::: info [Git Commit Message 這樣寫會更好,替專案引入規範與範例](https://ithelp.ithome.com.tw/articles/10228738) [如何優雅撰寫 Git Commit 訊息](https://w3c.hexschool.com/blog/7ce887b9) ::: 除了以上的動作之外,我們還有 `git checkout` 以及 `git merge` git checkout:我們可能會有許多的分支,每個分支都代表著一個儲存庫,我們可以使用 checkout 切換到不同的分支上。 > 分支 - 為什麼需要建立分支? :::warning 1. 軟體開發人員可以安心開發自己的功能,不受到其他開發人員的影響 2. 可以透過分支來個別開發功能 3. 當發生問題時,可以更容易找出問題 ::: git merge:當兩支分支在不同的紀錄點上,我們要進行功能的合併時,就會使用 `git merge`。  # 模擬 git 使用情境 我們會模擬專案有的分支 - Master / Main(正式上線中的服務版本) - Test(測試的版本) - Dev(開發中的版本) - 功能分支(會從 dev 分支切出來)  我們接到了任務,需要標題為 `Git 實作` 的網頁,接著要在裡面新增 `🥔 馬鈴薯好吃` 的內容。 我們先新增一個 GitPractice 的資料夾  接著我們進到資料夾內,右鍵開啟 git bash,我們先進行 git 的基本設定。 ``` git config --global user.name "user name" git config --global user.email "email" ``` 設定完後可以透過 `git config --list` 檢查資訊。 接著進行 git init 的動作,初始化這個資料夾。 ``` git init ``` ## 建立專案 先新增一個 index.html,內容如下 ```htmlembedded= <html> <head> <title>Document</title> </head> <body> </body> </html> ``` 接著回到終端機輸入 `git status` 檢查 Git 狀態,會發現我們有一個 Untracked 的 index.html :::success 指令:git status 檢查 Git 狀態 :::  我們使用 `git add index.html` 將檔案存入暫存區 :::success 指令:git add `<file name>` 將檔案暫存到暫存區(Staging Area) :::  然後我們要將暫存好的檔案存到儲存庫,`git commit -m "Initial commit"` :::success 指令:git commit -m “commit 訊息” :::  存進去後,我們可以來查看 commit 的歷史紀錄 :::success 指令:git log :::  接著我們到 GitLab 上建立一個新專案    成功之後可以看到這一頁,我們要把本地端綁定遠端的專案,在終端機中輸入指令 :::success git remote add origin 遠端儲存庫連結 :::  然後把我們本地端的專案上傳到遠端 :::success 指令:git push –u origin master :::  成功後我們回到 GitLab 上就會看到以下畫面  ## 模擬專案會有 maste 分支、test 分支、dev 分支 - Branch 從左側的 Respository 底下選到 Branches  從 master 分支建立新的分支 test 和 dev  ---  完成後,會有三個分支  ## 模擬被主管指派了一個新的功能 - Issue > Issue 的用處 :::warning 1. 對應到問題與需求 2. 方便主管管理,掌握每個人的進度 ::: ## 模擬有兩個人在進行開發 - A:修改 index.html 標題為 Git Pratice - B:新增 index.html 內容以及標題 我們要建立一個新的 Issue  我們要針對這次的需求輸入標題以及敘述,並把任務分派給自己 - Title:Feature.修改 index.html 標題為 Git Pratice  建立好 Issue 以後,我們要從 dev 建立一個新的分支 > tips:分支很重要,要記得選對 >  接著我們要扮演 B 建立另一個 Issue 以及分支,內容如下 - Title:Feature.新增 index.html 內容以及標題 - Description:新增 index.html 內容以及標題 - Assignee:自己 - 從 dev 分支底下建立一個 2-feature-index-html 分支 完成後,我們現在應該會有五個分支  接著進入開發,我們要先從遠端讀取分支資訊,之後切換到我們要進行修改的分支。 :::success 指令:git fetch :::  修改 index.html 內容 ```htmlembedded= <html> <head> <title>Git Pratice</title> </head> <body> </body> </html> ``` 修改完內容後,儲存到本地儲存庫 > tips:commit 訊息會和 issue 名稱相同  接著推到遠端的分支上  然後可以到 GitLab 上確認有沒有成功,會看到 Last commit 的訊息變了,也可以點進 commit 內確認修改了哪些內容。  ---  ### 查看 graph 利用不同顏色的點、線結合時間軸按照一定規律,呈現項目的版本演進記錄 - 驗證 push 有無成功 - 檢視整個專案大局觀 - 查看歷史版本演變紀錄  我們剛剛扮演 A 把開發任務完成了,接著我們要扮演 B,所以我們現在切換到 `2-feature-index-html` 分支上  修改 index.html 的內容以及標題 ```htmlembedded= <!DOCTYPE html> <html> <head> <title>🥔 讚讚</title> </head> <body> 🥔 馬鈴薯好吃 </body> </html> ``` 按照跟上面一樣的流程  查看 graph  ## Merge Request(合併請求) 為了維持程式碼整潔,通常會有 Code Review(互相檢查代碼是否按照當初約好的方式一起寫 ex:變數名稱命名方式等…),因此可以達到同事之間互相檢查代碼的認證機制。 > CR 時會直接在 Merge Request 中的 Change 進行溝通,完成 CR 後就會按一個讚👍 開發完成後,我們需要進行功能的合併,要先發一個 Merge Request  --- 記得分支要選對  GitLab 會自動幫你填上標題,Asignee 要記得分配給自己  建立成功  接著我們要比照上面,換成 B 來建立 Merge Request 完成之後,我們現在會發現,兩個 Merge Request 都能夠進行 Merge 的動作  那我們先當 A,將第一個 Feature.修改 index.html 標題為 Git Practice 的 Merge Request 進行 Merge 動作  Merge 成功  ---  因為我們剛有勾選 Delete Source Branch,所以會發現分支被刪掉了,這樣就代表 A 的任務完成了  那我們接下來回到 B,會發現不能進行 Merge 的動作  ### 衝突 因為兩個人開發時改到了相同的地方,所以發生了衝突,這時我們就要來進行解衝突的動作。 我們先回到本地端,進行 `git fetch` 重新取得遠端分支的情況  我們要來進行 rebase 的動作  :::info [另一種合併方式(使用 rebase)](https://gitbook.tw/chapters/branch/merge-with-rebase) ::: :::success 指令:git rebase -i origin/dev ::: Enter 後會看到這個畫面,選擇你要的 Commit,並在前面加上 pick,儲存離開 :wq  可以看到他已經幫你自動 auto-merging index.html 這個檔案,但是發現 index.html 有 conflict,因此需要解衝突  假如你也是使用 VS Code 的話就會看到這個畫面,你可以透過 VS Code 選擇你要的改動,也可以手動更改,我這邊選擇 Accept Incoming Change  ---  :::success 指令:git status 檢查 Git 狀態 :::  此時,告訴 git 你已經可以繼續下一個 commit 點的衝突,但是因為這邊只有一個 commit 需要解衝突,因此 git 會知道我們已經處理完衝突了~ ``` git add index.html git rebase --continue ``` >tips:一樣使用 :wq 離開   接著,我們解完衝突了,想要把程式碼上傳回遠端,會發現不能執行 push  這是因為我們本地端的程式碼與遠端上的程式碼不符合,所以我們在本地解完衝突後,需有使用 -f 參數強制推上去 :::success git push -f ::: > tips:-f 不能亂使用喔!  rebase 示意圖,我們原本是從第一個 commit 點切出來,但是使用 rebase 就可以更改成從最新的 commit 點切出來。  到這裡我們就完全解完衝突了,可以回去 Merge Request 進行 Merge 的動作了。  ---  ## 例外處理 假如我不小心合錯了,應該要怎麼辦呢? ### Revert 我們可以使用 GitLab 提供的 GUI 快速進行 Revert 先回到 Merge Request 的畫面,會看到原本是 Merge 的位置,現在有 Revert 可以按  >tips:分支真的很重要,記得要選對  ---  ---  到這邊 Revert 就完成了,非常地快速又簡單 ## 課後延伸 以下還有一些 git 的指令,大家可以自行 google 查詢用法 ::: warning Google 是一位很棒的老師,大家都應該學著使用😎 ::: - \-\-amend 在[第一次 Git 工作坊文章](https://hackmd.io/@2HiJ3gJTTiub4kPJs9-McQ/HJReVaU4u)上課簡報內有提到 - rebase –i 其他用法 - cherry-pick - commit 序號的應用 - blame - Reset ::: warning 不論遇到什麼問題都能夠直接詢問學長姊,千萬不要害羞❕❕❕ ::: --- ## 參考資料 :::info [讓我們一起來,談把儲存庫發佈到網路上 Push Remote](https://ithelp.ithome.com.tw/articles/10224479) [[Linux] SSH 金鑰是什麼?私鑰與公鑰?如何自己產生一個SSH金鑰?](https://richarlin.tw/blog/linux-ssh_key/) [另一種合併方式(使用 rebase)](https://gitbook.tw/chapters/branch/merge-with-rebase) ::: --- git 的實際演練就到這邊結束了,大家可能還不會那麼快就接觸到專案,使用到 git,但是大家平常也可以多多練習 git,把你練習過的題目上傳到 GitHub 上面喔,大家在練習了自我介紹以及留言板後,也可以試著使用 GitHub Page 把你的網頁給 host 起來喔。 :::info [GitHub Page 官方網站](https://pages.github.com) [從零開始: 用github pages 上傳靜態網站](https://medium.com/%E9%80%B2%E6%93%8A%E7%9A%84-git-git-git/%E5%BE%9E%E9%9B%B6%E9%96%8B%E5%A7%8B-%E7%94%A8github-pages-%E4%B8%8A%E5%82%B3%E9%9D%9C%E6%85%8B%E7%B6%B2%E7%AB%99-fa2ae83e6276) :::
×
Sign in
Email
Password
Forgot password
or
By clicking below, you agree to our
terms of service
.
Sign in via Facebook
Sign in via Twitter
Sign in via GitHub
Sign in via Dropbox
Sign in with Wallet
Wallet (
)
Connect another wallet
New to HackMD?
Sign up