---
title: Git(實際練習(GitLab))
tags: 暑假
---
Git(實際練習(Gitlab))
===
## 註冊GitLab
## 設定 SSH Key
為什麼我們需要設定 SSH key 呢,簡單來說我們使用 Git 上傳到 GitLab 時,我們是上傳到遠端伺服器,每次上傳都需要進行驗證,就是輸入帳號密碼,而有了 SSH key 之後,我們就不需要一直輸入帳號密碼,SSH key 就相當於一組金鑰,可以讓我們更快速地進行驗證。
## 如何設定 SSH key
我們在終端機下以下指令
```
ssh-keygen
```

就會產生出 SSH key
我們需要的在 C:\Users\你的使用者名稱\.ssh\id_rsa.pub
在這資料中會有ssh key
複製下來後我們要到 GitLab 進行設定
# 模擬 git 使用情境
我們會模擬專案有的分支
- Master / Main(正式上線中的服務版本)
- Test(測試的版本)
- Dev(開發中的版本)
- 功能分支(會從 dev 分支切出來)

我們接到了任務,需要標題為 `Git 實作` 的網頁,接著要在裡面新增 `hi i am bananana` 的內容。
我們先新增一個 Git-Practice 的資料夾

接著我們進到資料夾內,右鍵開啟 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,內容如下

```
<html>
<head>
<title>Document</title>
</head>
<body>
</body>
</html>
```
接著回到終端機輸入 git status 檢查 Git 狀態,會發現我們有一個 Untracked 的 index.html

使用 `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 遠端儲存庫連結
:::
>或是可以按clone方式也可以

然後把我們本地端的專案上傳到遠端
這裡打岔一下,以前程式碼倉庫名叫master 現在被預設改成main

分析原因:
由於名稱不一樣,遠程和本地的倉庫不能連接上
解决方式:
統一遠程和本地的倉庫名稱即可
1、把本地的 master 倉庫名稱修改為遠端的 main
重命名命令:
:::success
git branch -m master main
:::
( git branch -m oldBranchName newBranchName)

2.再做 push 動作(沒有-u)
:::success
指令:git push origin master
:::

成功後我們回到 GitLab 上就會看到以下畫面
(main裡有index.html了)

## 模擬專案會有 maste 分支、test 分支、dev 分支 - Branch
從左側的 Respository 底下選到 Branches

從 master 分支建立新的分支 test 和 dev

---

完成後(再到原本地點查看(
Repository>
Branches)),會有三個分支

## 模擬被主管指派了一個新的功能 - 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-git-pratice 分支
完成後,我們現在應該會有五個分支

接著進入開發,我們要先從遠端讀取分支資訊,之後切換到我們要進行修改的分支。
:::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-git-pratice` 分支上

修改 index.html 的內容以及標題
```htmlembedded=
<!DOCTYPE html>
<html>
<head>
<title>hi</title>
</head>
<body>
i am banana
</body>
</html>
```
按照跟上面一樣的流程

查看 graph

## Merge Request(合併請求)
開發完成後,我們需要進行功能的合併,要先發一個 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 status` 檢查 Git 狀態,會發現我們有一個 Untracked 的 index.html
## 刪除project
1.首先,在項目列表中選擇要删除的project
2.進入後,在左邊列表的Settings中的General
3.找到點擊Advanced 的Expend按钮
4.滑到最底下,看到“Delete this project”

----
:::info
[常用指令](https://hellojs-tw.github.io/git-101/cheat-sheet.html)
[Git 實際演練 - 前言](https://hackmd.io/@cmrdb/SJF6sOujt/%2F1cAZJzaOTCuoB2dRBxpASw)
[]()
:::