1.1 起步-關(guān)于版本控制
什么是版本控制
版本控制是一種記錄一個(gè)或若干文件內(nèi)容變化,以便將來(lái)查閱特定版本修訂情況的系統(tǒng)。是不是有點(diǎn)像月光寶盒。
本地版本控制

集中化的版本控制系統(tǒng)
CVS、Subversion都是集中化的版本控制系統(tǒng)。

分布式版本控制系統(tǒng)
Git就是分布式版本控制系統(tǒng)。

1.2 起步-Git簡(jiǎn)史
產(chǎn)生的背景
Linux內(nèi)核內(nèi)核維護(hù)工作一開(kāi)始使用BitKeeper來(lái)管理和維護(hù)代碼。到了 2005 年,開(kāi)發(fā) BitKeeper 的商業(yè)公司同 Linux 內(nèi)核開(kāi)源社區(qū)的合作關(guān)系結(jié)束,他們收回了 Linux 內(nèi)核社區(qū)免費(fèi)使用 BitKeeper 的權(quán)力。
Linux 開(kāi)源社區(qū)決定開(kāi)發(fā)出自己的版本系統(tǒng)。
Git的目標(biāo)
速度
簡(jiǎn)單的設(shè)計(jì)
對(duì)非線性開(kāi)發(fā)模式的強(qiáng)力支持(允許成千上萬(wàn)個(gè)并行開(kāi)發(fā)的分支)
完全分布式
有能力高效管理類似 Linux 內(nèi)核一樣的超大規(guī)模項(xiàng)目(速度和數(shù)據(jù)量)
1.3 起步-Git基礎(chǔ)
問(wèn)題:Git的思想和基本工作原理是什么?
直接記錄快照,而非差異比較
CVS、Subversion等系統(tǒng)將它們保存的信息看作是一組基本文件和每個(gè)文件隨時(shí)間逐步累積的差異

Git對(duì)的數(shù)據(jù)更像是一個(gè)快照流

近乎所有操作都是本地執(zhí)行
在 Git 中的絕大多數(shù)操作都只需要訪問(wèn)本地文件和資源,一般不需要來(lái)自網(wǎng)絡(luò)上其它計(jì)算機(jī)的信息。
Git保證完整性
Git 數(shù)據(jù)庫(kù)中保存的信息都是以文件內(nèi)容的哈希值來(lái)索引,而不是文件名。
Git 用以計(jì)算校驗(yàn)和的機(jī)制叫做 SHA-1 散列(hash,哈希)。 這是一個(gè)由 40 個(gè)十六進(jìn)制字符(0-9 和 a-f)組成字符串,基于 Git 中文件的內(nèi)容或目錄結(jié)構(gòu)計(jì)算出來(lái)。 SHA-1 哈??雌饋?lái)是這樣:
24b9da6552252987aa493b52f8696cd6d3b00373
Git一般只添加數(shù)據(jù)
你執(zhí)行的 Git 操作,幾乎只往 Git 數(shù)據(jù)庫(kù)中增加數(shù)據(jù)。 很難讓 Git 執(zhí)行任何不可逆操作,或者讓它以任何方式清除數(shù)據(jù)。
三種狀態(tài)
Git 有三種狀態(tài),你的文件可能處于其中之一:已提交(committed)、已修改(modified)和已暫存(staged)。
- 已提交表示數(shù)據(jù)已經(jīng)安全的保存在本地?cái)?shù)據(jù)庫(kù)中。
- 已修改表示修改了文件,但還沒(méi)保存到數(shù)據(jù)庫(kù)中。
- 已暫存表示對(duì)一個(gè)已修改文件的當(dāng)前版本做了標(biāo)記,使之包含在下次提交的快照中。
上面的標(biāo)記指的是什么動(dòng)作?總覺(jué)得已修改和已暫存有的混淆
三種工作區(qū)域

Git 倉(cāng)庫(kù)、工作目錄以及暫存區(qū)域。
Git 倉(cāng)庫(kù)目錄是 Git 用來(lái)保存項(xiàng)目的元數(shù)據(jù)和對(duì)象數(shù)據(jù)庫(kù)的地方。 這是 Git 中最重要的部分,從其它計(jì)算機(jī)克隆倉(cāng)庫(kù)時(shí),拷貝的就是這里的數(shù)據(jù)。
工作目錄是對(duì)項(xiàng)目的某個(gè)版本獨(dú)立提取出來(lái)的內(nèi)容。 這些從 Git 倉(cāng)庫(kù)的壓縮數(shù)據(jù)庫(kù)中提取出來(lái)的文件,放在磁盤(pán)上供你使用或修改。
暫存區(qū)域是一個(gè)文件,保存了下次將提交的文件列表信息,一般在 Git 倉(cāng)庫(kù)目錄中。 有時(shí)候也被稱作‘索引’,不過(guò)一般說(shuō)法還是叫暫存區(qū)域。
Git基本工作流程
- 在工作目錄中修改文件。
- 暫存文件,將文件的快照放入暫存區(qū)域。
- 提交更新,找到暫存區(qū)域的文件,將快照永久性存儲(chǔ)到 Git 倉(cāng)庫(kù)目錄。
如果 Git 目錄中保存著的特定版本文件,就屬于已提交狀態(tài)。 如果作了修改并已放入暫存區(qū)域,就屬于已暫存狀態(tài)。 如果自上次取出后,作了修改但還沒(méi)有放到暫存區(qū)域,就是已修改狀態(tài)。
1.4 起步-命令行
Git 有多種使用方式。 你可以使用原生的命令行模式,也可以使用 GUI 模式,這些 GUI 軟件也能提供多種功能。
只有在命令行模式下你才能執(zhí)行 Git 的所有命令,而大多數(shù)的 GUI 軟件只實(shí)現(xiàn)了 Git 所有功能的一個(gè)子集以降低操作難度。
1.5 起步 - 安裝 Git
https://git-scm.com/book/zh/v2/%E8%B5%B7%E6%AD%A5-%E5%AE%89%E8%A3%85-Git
1.6 起步 - 初次運(yùn)行 Git 前的配置
三種作用范圍的配置文件
Git 自帶一個(gè) git config 的工具來(lái)幫助設(shè)置控制 Git 外觀和行為的配置變量。 這些變量存儲(chǔ)在三個(gè)不同的位置
總結(jié)一句話就是:系統(tǒng)配置、當(dāng)前用戶配置和當(dāng)前項(xiàng)目配置三種
- /etc/gitconfig 文件: 包含系統(tǒng)上每一個(gè)用戶及他們倉(cāng)庫(kù)的通用配置。 如果使用帶有 --system 選項(xiàng)的 git config 時(shí),它會(huì)從此文件讀寫(xiě)配置變量。
- ~/.gitconfig 或 ~/.config/git/config 文件:只針對(duì)當(dāng)前用戶。 可以傳遞 --global 選項(xiàng)讓 Git 讀寫(xiě)此文件。
- 當(dāng)前使用倉(cāng)庫(kù)的 Git 目錄中的 config 文件(就是 .git/config):針對(duì)該倉(cāng)庫(kù)。
命令示例
# 設(shè)置全局用戶信息
$ git config --global user.name "John Doe"
$ git config --global user.email johndoe@example.com
# 設(shè)置編輯器
$ git config --global core.editor emacs
# 獲取配置信息列表
$ git config --list
user.name=John Doe
user.email=johndoe@example.com
color.status=auto
color.branch=auto
color.interactive=auto
color.diff=auto
...
# 獲取指定配置信息
$ git config user.name
John Doe
# 獲取幫助
$ git help <verb>
$ git <verb> --help
$ man git-<verb>