# 1、 版本控制
## 1.1 什么是版本控制
```
版本控制(Revision control)是一種在開發的過程中用于管理我們對文件、目錄或工程等內容的修改歷史,
方便查看更改歷史記錄,備份以便恢復以前的版本的軟件工程技術
```
* 實現跨區域多人協同開發
* 追蹤和記載一個或者多個文件的歷史紀錄
* 組織和保護你的源代碼和文檔
* 統計工作量
* 并行開發、提高開發效率
* 跟蹤記錄整個軟件的開發過程
* 減輕開發人員的負擔,節省時間,同時降低認為錯誤
*****
---->簡而言之:用于管理多人協同開發項目的技術
```
沒有進行版本控制或者版本控制本身缺乏正確的流程管理,在軟件開發過程中將會引入很多問題,
如軟件代碼的一致性、軟件內容的冗余、軟件過程的事物性、軟件開發過程中的并發性、軟件源代碼的安
全性,以及軟件的整合等問題。
```
## 1.2常用術語
**1)、倉庫(Repository)**
受版本控制的所有文件修訂歷史的共享數據庫
**2)、工作空間(Workspace)**
本地硬盤或Unix 用戶帳戶上編輯的文件副本
**3)、工作樹/區(Working tree)**
工作區中包含了倉庫的工作文件。您可以修改的內容和提交更改作為新的提交到倉庫。
**4)、暫存區(Staging area)**
暫存區是工作區用來提交更改(commit)前可以暫存工作區的變化。

**5)、索引(Index)**
索引是暫存區的另一種術語。
**6)、簽入(Checkin)**
將新版本復制回倉庫
**7)、簽出(Checkout)**
從倉庫中將文件的最新修訂版本復制到工作空間
**8)、提交(Commit)**
對各自文件的工作副本做了更改,并將這些更改提交到倉庫
**9)、沖突(Conflict)**
多人對同一文件的工作副本進行更改,并將這些更改提交到倉庫
**10)、合并(Merge)**
將某分支上的更改聯接到此主干或同為主干的另一個分支
**11)、分支(Branch)**
從主線上分離開的副本,默認分支叫master
**12)、鎖(Lock)**
獲得修改文件的專有權限。
**13)、頭(HEAD)**
頭是一個象征性的參考,最常用以指向當前選擇的分支。
**14)、修訂(Revision)**
表示代碼的一個版本狀態。Git通過用SHA1 hash算法表示的ID來標識不同的版本。
**15)、標記(Tags)**
標記指的是某個分支某個特定時間點的狀態。通過標記,可以很方便的切換到標記時的狀態。
## 1.3、常見的版本控制器
主流的版本控制器有如下這些:
* **Git**
* **SVN**(Subversion)
* **CVS**(Concurrent Versions System)
* **VSS**(Micorosoft Visual SourceSafe)
* **TFS**(Team Foundation Server)
* Visual Studio Online
版本控制產品非常的多(Perforce、Rational ClearCase、RCS(GNU Revision Control System)、Serena Dimention、SVK、BitKeeper、Monotone、Bazaar、Mercurial、SourceGear Vault),現在影響力最大且使用最廣泛的是Git與SVN
## 1.4、版本控制分類
### **1.4.1、本地版本控制**
記錄文件每次的更新,可以對每個版本做一個快照,或是記錄補丁文件,適合個人用,如RCS。

### **1.4.2、集中版本控制**
所有的版本數據都保存在服務器上,協同開發者從服務器上同步更新或上傳自己的修改

所有的版本數據都存在服務器上,用戶的本地只有自己以前所同步的版本,如果不連網的話,用戶就看不到歷史版本,也無法切換版本驗證問題,或在不同分支工作。而且,所有數據都保存在單一的服務器上,有很大的風險這個服務器會損壞,這樣就會丟失所有的數據,當然可以定期備份。代表產品:SVN、CVS、VSS
注意:必須聯網,才能正常使用,要不然看不到版本信息等
### 1.4.3、分布式版本控制
所有版本信息倉庫全部同步到本地的每個用戶,這樣就可以在本地查看所有版本歷史,可以離線在本地提交,只需在連網時push到相應的服務器或其他用戶那里。由于每個用戶那里保存的都是所有的版本數據,只要有一個用戶的設備沒有問題就可以恢復所有的數據,但這增加了本地存儲空間的占用。

## 1.5、Git與SVN最主要區別
SVN是集中式版本控制系統,版本庫是集中放在中央服務器的,而工作的時候,用的都是自己的電腦,所以首先要從中央服務器得到最新的版本,然后工作,完成工作后,需要把自己做完的活推送到中央服務器。集中式版本控制系統是必須聯網才能工作,對網絡帶寬要求較高。 CVS也是集中式版本控制系統 沒有本地庫和緩存區
```
**優點:**
1.svn優點:集中式管理,管理方式在服務端配置好,客戶端只需要同步提交即可,使用方便,操作簡單,很容易就可以上手
2.在服務端統一控制好訪問權限,利用代碼的安全管理。
3.所有的代碼以服務端為準,代碼一致性高。
**缺點:**
1.所有操作都需要通過服務端進行同步,這會導致服務器性能要求比較高。如果服務器宕機了就無法提交代碼了。**
2.分支管理不靈活,svn分支是一個完整的目錄,且這個目錄擁有完整的實際文件,這些操作都是在服務端進行同步的,**
? ?不是本 地化操作,如果要刪除分支,也是需要將遠程的分支進行刪除,這會導致大家都得同步
3.需要連網,如果無法連接到服務器就無法提交代碼**
```
Git是分布式版本控制系統,沒有中央服務器,每個人的電腦就是一個完整的版本庫,工作的時候不需要聯網了,因為版本都在自己電腦上。協同的方法是這樣的:比如說自己在電腦上改了文件A,其他人也在電腦上改了文件A,這時,你們兩之間只需把各自的修改推送給對方,就可以互相看到對方的修改了。
** 集體描述:**
Git 與 SVN 區別點:
1、GIT是分布式的,SVN不是:這是GIT和其它非分布式的版本控制系統,例如SVN,CVS等,最核心的區別。
2.Git下載下來后,在本地不必聯網就可以看到所有的log,很方便學習,SVN卻需要聯網
3、GIT把內容按元數據方式存儲,而SVN是按文件:所有的資源控制系統都是把文件的元信息隱藏在一個類似.svn,.cvs等的文件夾里。
4、GIT分支和SVN的分支不同:分支在SVN中一點不特別,就是版本庫中的另外的一個目錄。
5、GIT沒有一個全局的版本號,而SVN有:目前為止這是跟SVN相比GIT缺少的最大的一個特征。
6、GIT的內容完整性要優于SVN:GIT的內容存儲使用的是SHA-1哈希算法。這能確保代碼內容的完整性,確保在遇到磁盤故障和網絡問題時降低對版本庫的破壞。
# 2、git理論基礎
## 3.1、工作區域
Git本地有三個工作區域:工作目錄(Working Directory)、暫存區(Stage/Index)、資源庫(Repository或Git Directory)。如果在加上遠程的git倉庫(Remote Directory)就可以分為四個工作區域。文件在這四個區域之間的轉換關系如下:

* Workspace:工作區,就是你平時存放項目代碼的地方
* Index / Stage:暫存區,用于臨時存放你的改動,事實上它只是一個文件,保存即將提交到文件列表信息
* Repository:倉庫區(或本地倉庫),就是安全存放數據的位置,這里面有你提交到所有版本的數據。其中HEAD指向最新放入倉庫的版本
* Remote:遠程倉庫,托管代碼的服務器,可以簡單的認為是你項目組中的一臺電腦用于遠程數據交換
本地的三個區域確切的說應該是git倉庫中HEAD指向的版本

** HEAD **
HEAD:指向最近一次提交后的結果
從git的分支說起,git 中的分支,其實本質上僅僅是個指向 commit 對象的可變指針,它保存著一個名為 HEAD 的特別指針。在 git 中,它是一個指向你正在工作中的本地分支的指針,可以將 HEAD 想象為當前分支的別名。

git log 查看所有提交信息
ls-1 每行列出一個文件,即以單列形式列出。

ls-a 列出所有文件,包括隱藏文件。

git reset 撤回到指定版本,前面的都會被替換 沒有歷史可循
git revert 建議一次一次的撤回 追加提交
# 3、git庫狀態

* **Untracked**: 未跟蹤, 此文件在文件夾中, 但并沒有加入到git庫, 不參與版本控制. 通過`git add` 狀態變為`Staged`.
* **Unmodify**: 文件已經入庫, 未修改, 即版本庫中的文件快照內容與文件夾中完全一致. 這種類型的文件有兩種去處, 如果它被修改, 而變為`Modified`. 如果使用`git rm`移出版本庫, 則成為`Untracked`文件
* **Modified**: 文件已修改, 僅僅是修改, 并沒有進行其他的操作. 這個文件也有兩個去處, 通過`git add`可進入暫存`staged`狀態, 使用`git checkout` 則丟棄修改過, 返回到`unmodify`狀態, 這個`git checkout`即從庫中取出文件, 覆蓋當前修改
* **Staged**: 暫存狀態. 執行`git commit`則將修改同步到庫中, 這時庫中的文件和本地文件又變為一致, 文件為`Unmodify`狀態. 執行`git reset HEAD filename`取消暫存, 文件狀態為`Modified`

- git-第一天
- Git-第二天
- git-第三天
- http-基礎
- HTTP構成和狀態碼
- 瀏覽器輸入URL,經歷的過程
- TCP/IP 詳解三次握手 四次揮手
- http-DNS系統
- http與https之間的區別
- HTTPS握手和HTTP握手
- HTTP小試牛刀
- Tcp初探
- TCP報文格式
- HTML5
- HTML基礎
- Mock
- css 選擇器
- css 動畫
- css 定位
- position/display/float/z-index第一課時
- 行內、塊、脫標 三種狀態下的元素如何實現、水平、垂直居中
- clientHeight/offsetHeight/scrollHeight
- js 數據類型
- 變量提升
- 堆棧關系