---
# System prepended metadata

title: 版本控制(Version Control)
tags: [Git]

---

---
tags: Git
---

# 版本控制(Version Control)

* 完整記錄軟體**變化**的過程(人、事、時、地、物)
* 紀錄版本變化而衍伸出來的功能
    * 查詢歷史紀錄
    * 復原變更
    * 比對差異
    * 標記版號
    * 變更追蹤
* 多人版控進一步衍伸出的功能
    * 協同作業
    * 分支合併
    * 版控流程

## 版本控制的種類

### 1. 集中式
單一伺服器，記錄所有版本的檔案，且有多個客戶端從伺服器從伺服器取出檔案。
如：CVS, Subversion(SVN) 及 Perforce

* 優點：
    * 所有版本集中於伺服器管理，可選用鎖定或合併等版控策略
    * 較為精細的權限管控(針對目錄或檔案)
* 缺點：
    * 沒網路就無法進行版本控管，其中包含：
        * 可本地開發，但無法提交新版本
        * 無法查詢歷史紀錄

![](https://i.imgur.com/9ZMLqPT.png)


### 2. 分散式

客戶端不只是取出最後一版的檔案，而是完整複製整個儲存庫。即使是整個系統賴以運作的電腦損毀，皆可將任何一個客戶端先前複製的資料還原到伺服器。
如：Git, Mercurial, Bazaar, Darcs。 

* 優點：
    * 每位開發人員保有完整的儲存的儲存庫，等於每個人都擁有完整的儲存庫備份
    * 可以在本地端建立離線的版本與歷史紀錄，不需要伺服器支援就可以運作版本控制
* 缺點：
    * 無法鎖定版控策略（僅能使用合併策略）
    * 無法對專案進行精細的權限控管（但可切割成多個儲存庫）

![](https://i.imgur.com/B2Iqqbh.png)



## 什麼是 Git?
* [Git](https://git-scm.com/downloads)：是一套免費、開源分散式的版本控制工具
* [GitLab](https://gitlab.com/users/sign_in)：以 Git 為核心技術基礎的「雲端版本控制服務平台」，類似的服務還有 [GitHub](https://github.com/login)、[Bitbucket](https://bitbucket.pearson.com/login?nextUrl=%2Fdashboard)
* Git 圖形化工具：以圖形化介面呈現Git本地儲存庫中的資訊
    * [Source Tree](https://www.sourcetreeapp.com/)
    * TortoiseGit(小烏龜)
    * GitHub for Desktop
    * IDE整合的Git
        * Eclipse
        * Visual Studio
        * XCode

## Git 基礎操作指令



| 指令 | 功能 | 備註 |
| -------- | -------- | -------- |
| git init     | 初始化，創建 .git 目錄     |   建立一個儲存庫   |
| git add     | 建立索引     |  "**挑選**"想要打包的修改檔案  |
| git commit     | 將索引中的檔案"**打包**"並註明內容     |     |
| git push     | 將本地儲存庫**上傳**至遠端儲存庫(例如: GitLab)     |   先 pull，再 push   |
| git pull     | **下載**遠端儲存庫   | 可能發生衝突  |
| git branch     | 列出分支   |      |
| git checkout <branch name>    | 切換分支    | 可能發生衝突 |
| git tag | 列出標籤 | 特別的時間點貼標籤，來表示其重要性 |
| git merge    | 合併分支    | 可能發生衝突     |


## 標籤(版本號)

版本號結構大概是 v1.3.5，
也就是 version{**major**}.{**minor**}.{**hotfix**}

* Major: 功能新增會影響舊版使用者 > 強制更新
* Minor: 功能新增不影響舊版使用者 > 建議更新
* Hotfix: 單純修 bug 或文字修改




## 版本控制流程(Git flow)

所有的分支基礎功能都是一模一樣，
但依照產品開發流程的不同，而有不同的版控流程，

下列分支，是人賦予分支的意義下列幾種

![](https://i.imgur.com/pQpSGQX.png)



## 參考資料
[版本控管VCS-基礎概念，SVN、GIT比較](https://stevenjhu.com/2019/11/11/%E7%89%88%E6%9C%AC%E6%8E%A7%E7%AE%A1vcs-%E5%9F%BA%E7%A4%8E%E6%A6%82%E5%BF%B5%EF%BC%8Csvn%E3%80%81git%E6%AF%94%E8%BC%83/)
[猴子都能懂的Git入門指南](https://backlog.com/git-tutorial/tw/)
[git flow 實戰經驗談 part2 - 可能更好的 gitflow](https://blog.hellojcc.tw/a-better-git-flow/)