---
# System prepended metadata

title: GIT 分散式版本控制軟體

---

# GIT 分散式版本控制軟體

## git是什麼?
**注意!!GIT(版本控制軟體)跟Github(代碼倉庫)沒有直接關係!!**
追蹤文件的更改，協調多個開發者之間的工作，並允許在不同版本之間進行有效的切換
1. 本地儲存完整歷史記錄
    每個開發者的本地存儲庫包含了完整的歷史記錄，這使得開發者可以在不需要網絡連接的情況下進行版本控制操作
    
2. 支持離線工作
    由於每個開發者都有本地存儲庫的完整副本，因此他們可以在沒有網絡連接的情況下工作，並進行提交、分支等操作。當再次連接到網絡時，可以輕鬆地同步他們的更改
    
3. 更好的可靠性
    每個開發者的本地存儲庫都是一個完整的備份，如果其中一個存儲庫損壞或丟失，其他開發者仍然可以通過其他本地存儲庫的副本恢復項目
    
![image](https://hackmd.io/_uploads/HJy1KNg1R.png)

## 為什麼要做版本控制
1. 追蹤變更
    版本控制系統能夠追蹤文件的每一個更改，包括新增、修改和刪除。這使得開發者可以了解代碼的演進過程，方便進行問題追蹤和調試
    
2. 合作協作
    在團隊開發環境中，多個開發者需要共同編輯代碼，版本控制系統可以協助多人協作，避免文件的衝突和混亂
    
3. 備份和恢復
    版本控制系統為代碼提供了一個可靠的備份機制，即使在本地存儲庫損壞或遠程服務器故障的情況下，開發者仍然可以恢復代碼

4. 版本管理
    版本控制系統允許開發者在不同的版本之間進行切換，可以輕鬆地回退到以前的版本，恢復誤刪除的文件，或者比較不同版本之間的差異
    
## 安裝git(Windows 版本)
* 官方網站:https://git-scm.com/
* 下載地址:https://git-scm.com/download/win

下載之後就是一直按下一步，完成後可以在桌面上透過滑鼠右鍵確認是否有出現Git相關按鍵
![image](https://hackmd.io/_uploads/Hy1tCVx1A.png)

## 初步git管理文件
![image](https://hackmd.io/_uploads/H1-nPQb1R.png)

1. 進入要管理的目錄
2. ```git init``` 初始化資料夾後會生成.git文件夾(只需做一次)
![image](https://hackmd.io/_uploads/rkyjc8xJC.png)
3. ```git status``` 檢測當前目錄下的文件狀態
4. 可以先配置個人訊息，在生成版本時就不會報錯
設置名字:```git config --global user.name "YourName"```
設置信箱:```git config --global user.email "you@example.com"```
    * 三種狀態變化(紅色->綠色->生成版本)
    * 嚴謹的說法:工作區->暫存區->版本庫
        * 紅色:新增的文件/修改過的文件 -->git add 文件名/.(當前目錄所有檔案)
        ![image](https://hackmd.io/_uploads/r1k0c8gkR.png)
        * 綠色:已被管理的文件 --> git commit -m '描述訊息'
        ![image](https://hackmd.io/_uploads/BJnxoLxkC.png)
        * 生成版本 **初次下載要先設定個人訊息**
        ![image](https://hackmd.io/_uploads/rydS3Ixy0.png)
5. git log 查看版本紀錄
![image](https://hackmd.io/_uploads/HyQU1wlJ0.png)

## git版本回滾
![工作區 working directory](https://hackmd.io/_uploads/ByCLmXmyR.png)

當發生項目上線後可能有重大Bug，或是想跳回上一個版本重新修改

* 現在假設我目前有三個版本的檔案 -> V1, V2, V3
    * 使用上述初步git管理文件的步驟做出三個版本
    * 使用```git log```查看當前版本紀錄
![image](https://hackmd.io/_uploads/H1dwmzWyA.png)
* 若是要從V3版本回滾至V2(往前回滾)
    * ```git reset --hard 版本號``` **版本號就是commit後面那串文字**
    ![image](https://hackmd.io/_uploads/BJKlrfWyC.png)

* 若是要從V2版本回滾至V3(往後回滾)
    * 往前回滾後使用```git log```是看不到之後的V3版本
    * 使用```git reflog```查看
    ![image](https://hackmd.io/_uploads/SJwfUzWyA.png)
    * ```git reset --hard 版本號```
    ![image](https://hackmd.io/_uploads/rJOhIM-kC.png)

## git版本分支
![image](https://hackmd.io/_uploads/BkjQosZkR.png)

1. 同時進行多個功能開發
    * 分支允許開發者在不影響主要代碼的情況下同時進行多個功能的開發。每個分支都代表著一個獨立的開發線，可以單獨進行測試和修改
3. 避免影響主要分支
    * 在分支上進行開發意味著任何新功能或變更都不會直接影響主要分支(master)
5. 易於合併
    * 當開發完成並且測試通過後，可以將分支中的更改合併回主要分支。這樣可以將新功能或修復很容易地添加到主要分支中

### 實例
目前已經有V1, V2, V3版本，當今天在V3版本中延續開發新功能時，偶遇重大BUG，此時若沒有分支就會變得繁瑣複雜
* 無分支情況下
    * 需放棄目前正在更改的功能，跳回上一版本修復bug，較為繁瑣、效率低

---

* 分支情況下
    * 查看分支 ```git branch```
    * 創建分支 ```git branch 分支名稱```
    * 切換分支 ```git chechout 分支名稱```
    * 合併分支 ```git merge 要合併的分支``` (需切換到主線)
    * 刪除分支 ```git branch -d 分支名稱```
    * 可以在兩個分支下平行進行，最後再合併
![V1](https://hackmd.io/_uploads/S1yAL2b1C.png)


* 意外狀況
    * 當分支情況下已修復bug並合併後產生V4，V4開發新功能也已經完成待合併，此時可能會發生版本衝突
![V1 (1)](https://hackmd.io/_uploads/S1fqDnbyC.png)

## 工作流
在開發過程中應保持至少兩個分支，有助於組織和協調開發流程，提高生產力和效率
* 舉例
    * 正式上線版本
    * 測試服務版本
![V1 (2)](https://hackmd.io/_uploads/Sy4HxyfkA.png)

## 使用github託管程式碼
* 指令
    * ```git remote add origin```將遠程倉庫取別名 **origin 是代碼倉庫的別名，可以用其他替代**
    * ```git push -u origin main```將代碼上傳到代碼倉庫
    * ```git clone 倉庫網址```將代碼下載到本地端(電腦原先沒有代碼)
    * ```git pull origin 分支名稱```更新本地端代碼
![螢幕擷取畫面 2024-03-28 224442](https://hackmd.io/_uploads/BkfZXZmyR.png)
* 當本地端還沒有託管資料
```
echo "# testgit" >> README.md
git init
git add README.md
git commit -m "first commit"
git branch -M main
git remote add origin https://github.com/iamzhanzihe/testgit.git
git push -u origin main
```
* 已經有託管資料，等待push到代碼倉庫
```
git remote add origin https://github.com/iamzhanzihe/testgit.git
git branch -M main
git push -u origin main
```
* 日常使用情境(假設我們以工作流中的develop分支接續開發)
![Github](https://hackmd.io/_uploads/H1hSEzQJC.png)


