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)

* 若要指定分支下載,則操作:
```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 套件

2. VSCode 專案啟用

3. 查看先前創建的分支

### Basic Steps For Branchs Development
切換成自己的branch的環境。

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

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

<span style="color:IndianRed;">則目前資料夾檔案與遠端GitLab版本一致</span>
在自己的branch環境開發完成後,VSCode會顯示修改過的檔案,點選『+』符號,將檔案存放在Staged Changes欄位,且在Command格子中填入修改內容的相關訊息,最後點選Commit按鍵,就可以順利將檔案push到branch上。

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

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

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

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

#### <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自己端的程式碼,如下:

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/)