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