---
# System prepended metadata

title: Git 基本設定 ＆ VSCode 利用 Git 做版本控制
tags: [VScode, Git]

---

Git 基本設定 ＆ VSCode 利用 Git 做版本控制
=

###### tags: `Tutorial` `Git` `VScode`

Git Installing
-
#### <span style="color:LightCoral;">Windows version</span>

Windows版本可以直接從[Git官網](https://git-scm.com/download/win)下載

#### <span style="color:LightCoral;">macOS version</span>

macOS版本，需先安裝[Homebrew](https://brew.sh)，就可以使用homebrew來安裝Git，在terminal執行：
```cmd=
brew install git
```
#### <span style="color:LightCoral;">Linux version</span>

Linux版本，一樣要先安裝[Homebrew](https://brew.sh)，且terminal執行：
```cmd=
apt-get install git
```

Git Basic Steps
-

以下步驟，是全新未安裝過Git才需操作，若有設定可直接跳到clone步驟。

#### <span style="color:IndianRed;">{ }內文字需視個人設定更改</span>

### Git Setting Workspace

在 Workspace（新增未來code存放的資料夾）內建立一個 .git folder
```cmd=
 git init
```

Config Git Environment

* 建立 user name
```cmd=
git config --global user.name {user name}
```

* 建立 user email
```cmd=
git config --global user.email {user email}
```

### Clone Remote Repository From GitLab

* 從 GitLub 下載 Remote Repository 至 Workspace（default：master）
```cmd=
git clone {repo URL}
```

Remote URL 位置如圖中框框，建議用HTTP(:port前面的網址需更換成ip，否則會access error)
![](https://hackmd.io/_uploads/BJEW0on16.png)

* 若要指定分支下載，則操作：
```cmd=
git clone {repo URL} -b {branch name}
```

* 若想指定下載名稱，則操作：
```cmd=
git clone {repo URL} {folder name/path}
```

### Git Setting Index

在 Workspace 內指定單一檔案（txt檔）建立索引
```cmd=
git add {}.txt
```

#### <span style="color:IndianRed;">工作目錄 (Working Directory) 內所有檔案建立索引（很重要！！）</span>
```cmd=
git add .
```

將建立索引的檔案提交到 Local Repository
```cmd=
git commit -m {}.txt
```

### Git Push Remote Branch
如果 Git 目錄內沒有其他分支，可以直接用 git push
```cmd=
git push
```

上傳所有分支至 Git 目錄
```cmd=
git push --all origin
```

上傳指定分支至 Git 目錄
```cmd=
git push origin master
```

Checkout Git Record
-
查看 Git config 設定
```cmd=
git config --list
```

查看目前工作目錄 (Working Directory) 中過去 Git commit 記錄
```cmd=
git log  # list Author、Time、Commit
git reflog  # list Commit
```

檢視目前工作目錄 (Working Directory) 中所有檔案的情形
```cmd=
git status
```

查看目前 Remote 連線位置
```cmd=
git remote -v
```

git 版本切換
```cmd=
git checkout {git version}
```

Git Setting Remote Branch
-
由於團隊開發會發布多個版本的程式，因此需要針對每個版本進行維護，而Git具備了分支的功能。

### Branchs Commands
* 創建分支
```cmd=
git branch {branch name}
```

* 切換分支
```cmd=
git checkout {branch name}
```

* 同時創建且切換分支
```cmd=
git checkout -b {branch name}
```

* 查看local branchs
```cmd=
git branch
```

* 查看all branchs(包含遠端分支)
```cmd=
git branch -a
```

* 刪除指定分支
```cmd=
git branch -d <name>
```

### Merge Branchs
此為terminal command，後面有 VSCode 操作的方法（推薦）

* 切換到 master(main)
```cmd=
git checkout master
```
 
* merge Branch（fast-forward）
```cmd=
git merge {subsidiary branch}
```

* merge Branch（no-fast-forward）
```cmd=
git merge {subsidiary branch} --no-ff 
```

* 恢復 merge 之前的狀態
```cmd=
git merge --abort
```

#### <span style="color:IndianRed;">補充關於 merge Branch fast-forward v.s. no-fast-forward 差異</span>

* Fast-Forward Merge（快速合併）：
如果目標分支的歷史中沒有新的提交，則合併會直接將目標分支指針快速地前進到待合併分支的最新提交。
優點：保持分支歷史簡潔、清晰，不會產生多餘的合併提交。
缺點：可能丟失了分支的歷史信息，難以追踪分支的合併情況。

* No-Fast-Forward Merge（非快速合併）：
無論目標分支的歷史是否包含新的提交，合併操作都會創建一個新的合併提交，將待合併分支的內容合併到目標分支。
優點：保留了分支的完整歷史，能夠清晰地追踪分支的合併情況。
缺點：可能會產生額外的合併提交，使歷史變得複雜。

Git Setting Stash 
-
程式修改到一半想切換別的Workspace，但不想隨意 commit 時，可以利用 stash 把目前的進度暫存。

* Stash
```cmd=
git stash save {stash version}
```

* Checkout Stash list
```cmd=
git stash list
```

* 恢復暫存版本操作 - 不會刪除暫存檔
```cmd=
git stash apply {name}
```

* 恢復暫存版本操作 - 會刪除暫存檔
```cmd=
git stash pop {name}
```

* 刪除暫存的Stash - 刪除指定暫存
```cmd=
git stash drop {name}
```

* 刪除暫存的Stash - 刪除所有暫存檔
```cmd=
git stash clear
```

Git Operations For VSCode
-

### Install 『Git Extension Pack』 Package
1. 安裝 Git Extension Pack 套件

    ![](https://hackmd.io/_uploads/BJ0_x6hyp.png =70%x)

2. VSCode 專案啟用

    ![](https://hackmd.io/_uploads/HJQjWah1a.png =70%x)

3. 查看先前創建的分支

    ![](https://hackmd.io/_uploads/SJHrzp316.png =70%x)
 

### Basic Steps For Branchs Development 

切換成自己的branch的環境。

![](https://hackmd.io/_uploads/HJ7GLanJa.png)

在自己的branch中，pull程式來做後續的開發。

![](https://hackmd.io/_uploads/ryPQQTnka.png =70%x)

可選擇Branch拉取檔案到本地端，通常以 main(master) branch 程式做為主要開發版本。

![](https://hackmd.io/_uploads/H1jhmT3ka.png =60%x)

<span style="color:IndianRed;">則目前資料夾檔案與遠端GitLab版本一致</span>

在自己的branch環境開發完成後，VSCode會顯示修改過的檔案，點選『＋』符號，將檔案存放在Staged Changes欄位,且在Command格子中填入修改內容的相關訊息，最後點選Commit按鍵，就可以順利將檔案push到branch上。

![](https://hackmd.io/_uploads/HyWEtTh1T.png =60%x)

點選Change中的檔案也可以查看修改過的地方。

![](https://hackmd.io/_uploads/Sk_PK6nkT.png =60%x)

### Merge Branchs

<font color="IndianRed">切換成main(master)的branch的環境，pull最新版本的code</font>，點選Merge Branch，選擇自己開發的Branch

![](https://hackmd.io/_uploads/B1R7sa21p.png =80%x)

若沒有衝突問題，則可直接merge，再將程式push到gitlab的main branch

![](https://hackmd.io/_uploads/SyBhjahya.png =60%x)

當遇到不同Branchs衝突問題時，則需手動比對調整程式碼，VSCode有非常清楚的畫面可以手動選擇要保留原始main的版本code或是新的版本，以下是示意圖，綠色為原始版本（通常為main branch），藍色為更新版本（通常為自己開發的branch)，可自己選擇保留哪一個版本（若之後我有再遇到衝突問題，再補充Merge的方式）

![](https://hackmd.io/_uploads/SkHvxC3k6.png =80%x)


#### <span style="color:IndianRed;">補充關於Merge時的衝突問題</span>
合併時出現衝突指的是，在合併分支時，版本控制系統（如Git）無法自動解決不同分支上對同一部分內容所做的更改，因此需要手動解決這些衝突。舉例來說：
1. 兩個分支都對同一文件的相同位置進行了修改。
2. 一個分支刪除了文件，而另一個分支修改了該文件。


> <span style="color:DarkSalmon;">**[!] 此外，根據我之前慘痛的經驗，若直接在Gitlab上，將自己的branch和main branch做Merge（就是一個簡單的merge按鍵而已><|||），則會直接覆蓋main branch的紀錄，完全與自己branch的code一致，因此建議不要使用gitlab做merge code。**</span>
    
### Stash Code

若自己VSCode的Code有修改過，但想Pull main branch新的Code，這時就要先Stash自己端的程式碼，如下：
    
![](https://hackmd.io/_uploads/S151Z08Wa.png =70%x)

Pull完main branch的程式後，若想把Stash合進去現在的程式裡，如下：

* 查看目前已暫存的程式檔
```cmd=
git stash list
```

* 復原Stash的程式
```cmd=
git stash pop
```

Reference
-
[Git教學 寫給Git初學者的入門4步驟](https://www.maxlist.xyz/2018/11/02/git_tutorial/)
