1. 內涵和外延
- 是一個開源分佈式版本控制系統,用於敏捷高效地處理任何或小或大的項目;
- 是Linus Torvalds爲了幫助管理Linux內核開發而開發的一個開放源碼的版本控制軟件;
- 與常用的版本控制工具CVS, Subversion等不同,它採用了分佈式版本庫的方式,不必服務器端軟件支持;
- 不僅是版本控制系統,也是內容管理系統(CMS),工作管理系統等。
注意
1. “分佈式”的特性指的是版本庫的分佈式,也就是說GIT可以在本地創建版本庫(不像SVN不能提交版本到本地庫)
2. GIT和SVN區別
- 核心區別 GIT是分佈式的,SVN不是;
- 存儲方式 GIT把內容按元數據方式存儲,而SVN是按文件;
- 文件存儲方式:所有的資源控制系統都是把文件的元信息隱藏在一個類似
.svn
,.cvs
等的文件夾裏。
- 文件存儲方式:所有的資源控制系統都是把文件的元信息隱藏在一個類似
- 分支 GIT分支和SVN的分支不同:分支在SVN中一點不特別,就是版本庫中的另外的一個目錄;
- GIT沒有一個全局的版本號,而SVN有:目前爲止這是跟SVN相比GIT缺少的最大的一個特徵;
- 內容完整性 GIT的內容完整性要優於SVN:GIT的內容存儲使用的是
SHA-1
哈希算法。這能確保代碼內容的完整性,確保在遇到磁盤故障和網絡問題時降低對版本庫的破壞。
3. 安裝和配置【略】
4. 工作流程【重點】
- 從遠程版本庫上克隆完整的GIT倉庫(包括代碼和版本信息)到本地;
- 在本地根據不同的開發目的,創建分支,修改代碼;
- 在本地自己創建的分支上提交代碼;
- 在本地合併分支;
- 把遠程版本庫上最新版的代碼fetch下來,然後跟自己的主分支合併;
- 如果沒有主開發者,可以直接把代碼push到遠程版本庫
- 生成補丁(patch),把補丁發送給主開發者;
- 看主開發者的反饋,如果主開發者發現兩個一般開發者之間有衝突(他們之間可以合作解決的衝突),就會要求他們先解決衝突,然後再由其中一個人提交。如果主開發者可以自己解決,或者沒有衝突,就通過;
- 一般開發者之間解決衝突的方法,開發者之間可以使用pull 命令解決衝突,解決完衝突之後再向主開發者提交補丁。
- 圖例
5. 工作區、暫存區和版本庫【重點】
- 工作區
- GIT倉庫同級目錄。
- 暫存區
- 一般存放在GIT目錄下的index文件(
.git/index
)中,所以我們把暫存區有時也叫作索引(index)。
- 本地庫
- 工作區有一個隱藏目錄
.git
。
注意
1.git add
是把文件添加到暫存區(索引),需要進一步commit
更新到本地版本庫中;
2.git reset HEAD
、git rm --cached<file>
、git checkout
、git checkout HEAD
命令詳細
3. 解決衝突之後的文件直接commit
的話,不會默認加入到暫存區(沒有衝突的時候直接commit
會默認把文件加入到暫存區),需要執行git add
命令手動加入暫存區
6. 命令1
git add
- 添加到暫存區/索引
git fetch
- 下載遠程版本庫內容
git merge
- 合併分支到當前分支
git pull
git fetch
+git merge
git reset HEAD
- 取消已經緩存的內容
git status
- 查看需要添加到暫存區和已經添加到暫存區但是還沒有提交的文件
注意
- GIT命令不區分大小寫
- 查看需要添加到暫存區和已經添加到暫存區但是還沒有提交的文件
7. 分支【GIT的“必殺技特性”】
- 合併不僅僅是簡單的文件添加、移除的操作,也會合並修改(當在合併修改的時候出現衝突就要解決衝突);
- 其他
- 分支作用
- 使用分支意味着你可以從開發主線上分離開來,然後在不影響主線的同時繼續工作。
即在沒有合併之前,分支上的內容相互獨立。
- 使用分支意味着你可以從開發主線上分離開來,然後在不影響主線的同時繼續工作。
- 分支作用
- 解決衝突【
pull/fetch/merge
->手動解決衝突(即衝突“三元素”直接包括的內容)
->git add
->git commit
】
pull/fetch
(從遠程到本地)或者git merge
(本地版本庫之間合併,一般不會出現衝突),有可能出現衝突(會用<<<<<<HEAD
、======
、>>>>>local
這三者標註衝突內容,詳細見下面分析),那麼就要手動解決,然後要git add告訴GIT衝突已經解決了(此時如果直接commit
,會提醒有衝突要先解決才能commit
(普通沒有衝突的文件如果過需要commit
可以直接提交,這時候commit
中包含了更新版本庫,對於衝突文件必須要先添加到的索引中纔可以commit
))<<<<<HEAD
、======
、>>>>>local
含義和作用
<<<<HEAD
(索引)和====
之間代表索引裏面指向的內容,而====
和>>>>local
(本地)之間代表的則是本地內容
8. 遠程倉庫
- 如果你想通過GIT分享你的代碼或者與其他開發人員合作,你就需要將數據放到一臺其他開發人員能夠連接的服務器上
注意
1. 爲什麼在clone Github上的倉庫的時候要提供本地SSH
本地Git倉庫和GitHub倉庫之間的傳輸是通過SSH加密的
2. 可以使用公網服務器搭建自己的GIT遠程倉庫