---
tags: Git
---
# 版本控制(Version Control)
* 完整記錄軟體**變化**的過程(人、事、時、地、物)
* 紀錄版本變化而衍伸出來的功能
* 查詢歷史紀錄
* 復原變更
* 比對差異
* 標記版號
* 變更追蹤
* 多人版控進一步衍伸出的功能
* 協同作業
* 分支合併
* 版控流程
## 版本控制的種類
### 1. 集中式
單一伺服器,記錄所有版本的檔案,且有多個客戶端從伺服器從伺服器取出檔案。
如:CVS, Subversion(SVN) 及 Perforce
* 優點:
* 所有版本集中於伺服器管理,可選用鎖定或合併等版控策略
* 較為精細的權限管控(針對目錄或檔案)
* 缺點:
* 沒網路就無法進行版本控管,其中包含:
* 可本地開發,但無法提交新版本
* 無法查詢歷史紀錄

### 2. 分散式
客戶端不只是取出最後一版的檔案,而是完整複製整個儲存庫。即使是整個系統賴以運作的電腦損毀,皆可將任何一個客戶端先前複製的資料還原到伺服器。
如:Git, Mercurial, Bazaar, Darcs。
* 優點:
* 每位開發人員保有完整的儲存的儲存庫,等於每個人都擁有完整的儲存庫備份
* 可以在本地端建立離線的版本與歷史紀錄,不需要伺服器支援就可以運作版本控制
* 缺點:
* 無法鎖定版控策略(僅能使用合併策略)
* 無法對專案進行精細的權限控管(但可切割成多個儲存庫)

## 什麼是 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)
所有的分支基礎功能都是一模一樣,
但依照產品開發流程的不同,而有不同的版控流程,
下列分支,是人賦予分支的意義下列幾種

## 參考資料
[版本控管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/)