同生活中的許多偉大事件一樣,Git 誕生于一個(gè)極富紛爭(zhēng)大舉創(chuàng)新的年代。Linux 內(nèi)核開(kāi)源項(xiàng)目有著為數(shù)眾廣的參與者。絕大多數(shù)的 Linux 內(nèi)核維護(hù)工作都花在了提交補(bǔ)丁和保存歸檔的繁瑣事務(wù)上(1991-2002年間)。到 2002 年,整個(gè)項(xiàng)目組開(kāi)始啟用分布式版本控制系統(tǒng) BitKeeper 來(lái)管理和維護(hù)代碼。到了 2005 年,開(kāi)發(fā) BitKeeper 的商業(yè)公司同 Linux 內(nèi)核開(kāi)源社區(qū)的合作關(guān)系結(jié)束,他們收回了免費(fèi)使用 BitKeeper 的權(quán)力。這就迫使 Linux 開(kāi)源社區(qū)(特別是 Linux 的締造者 Linus Torvalds )不得不吸取教訓(xùn),只有開(kāi)發(fā)一套屬于自己的版本控制系統(tǒng)才不至于重蹈覆轍。他們對(duì)新的系統(tǒng)制訂了若干目標(biāo):
Git 和其他版本控制系統(tǒng)的主要差別在于,Git 只關(guān)心文件數(shù)據(jù)的整體是否發(fā)生變化,而大多數(shù)其他系統(tǒng)則只關(guān)心文件內(nèi)容的具體差異。這類系統(tǒng)(CVS,Subversion,Perforce,Bazaar 等等)每次記錄有哪些文件作了更新,以及都更新了哪些行的什么內(nèi)容.
Git 并不保存這些前后變化的差異數(shù)據(jù)。實(shí)際上,Git 更像是把變化的文件作快照后,記錄在一個(gè)微型的文件系統(tǒng)中。每次提交更新時(shí),它會(huì)縱覽一遍所有文件的指紋信息并對(duì)文件作一快照,然后保存一個(gè)指向這次快照的索引。為提高性能,若文件沒(méi)有變化,Git 不會(huì)再次保存,而只對(duì)上次保存的快照作一鏈接.這是 Git 同其他系統(tǒng)的重要區(qū)別。它完全顛覆了傳統(tǒng)版本控制的套路,并對(duì)各個(gè)環(huán)節(jié)的實(shí)現(xiàn)方式作了新的設(shè)計(jì)。Git 更像是個(gè)小型的文件系統(tǒng)
1、創(chuàng)建新倉(cāng)庫(kù)
git init
touch test.txt
git add --a
git commit -m "fist commit"
初始化新倉(cāng)庫(kù),在當(dāng)前目錄下由一個(gè).git的目錄,所有g(shù)it需要的數(shù)據(jù)和資源都放在這個(gè)目錄中,在當(dāng)面目錄下添加文件后,需要通過(guò)git add 添加到文件追蹤管理(添加到暫存區(qū),數(shù)據(jù)存放在.git/index 目錄索引,數(shù)據(jù)內(nèi)部保存在.git/objects 中), git commit -m "提交說(shuō)明備注" 提交的信息會(huì)提交到數(shù)據(jù)倉(cāng)庫(kù),數(shù)據(jù)提交到正式倉(cāng)庫(kù),具體保存在.git/objects 中,如以上提交會(huì)包含一個(gè)commit,tree ,blob 對(duì)象。
2、從現(xiàn)有倉(cāng)庫(kù)克隆
git clone url
git clone git@github.com:torvalds/linux.git
如從gitHub上克隆一份linux的源碼,不僅是克隆最新版本的源碼,還克隆了所有數(shù)據(jù)倉(cāng)庫(kù)的歷史版本,每個(gè)文件的每一個(gè)版本,這個(gè)時(shí)候及時(shí)服務(wù)器github 發(fā)生故障,可以用本地?cái)?shù)據(jù)倉(cāng)庫(kù)重建服務(wù)器上的倉(cāng)庫(kù)??梢曰貜?fù)到從服務(wù)器克隆或最后更一次從服務(wù)器拉去的狀態(tài)。在.git 目錄中,已經(jīng)保存了所有版本記錄,本地文件夾即工作目錄的所有文件刪除了,然后從中取出最新版本的文件拷貝。
3、檢查文件更新?tīng)顟B(tài)
要求確定當(dāng)前工作區(qū)和暫存區(qū)文件的狀態(tài),可以通過(guò)git status 命令。在工作區(qū)和暫存區(qū)的目錄狀態(tài)可以查看。
git status
On branch master nothing to commit, working directory clean
當(dāng)前在默認(rèn)master 分支,當(dāng)前工作目錄和暫存區(qū)沒(méi)有任何跟蹤的文件,也沒(méi)有任何文件提交后更改,也沒(méi)有新增加,未被跟蹤的文件。
notepad test.txt
notepad t.txt
修改test.txt文件,新添加一個(gè)t.txt 文件,查看當(dāng)前文件狀態(tài)。
$ git status
# On branch master
# Changes not staged for commit:
# (use "git add ..." to update what will be committed)
# (use "git checkout -- ..." to discard changes in working di
#
# modified: test.txt
#
# Untracked files:
# (use "git add ..." to include in what will be committed)
#
# t.txt
no changes added to commit (use "git add" and/or "git commit -a")
新增加的文件t.txt 在未跟蹤文件范圍Untracked files 范圍,需要通過(guò)git add 把改文件添加的暫存區(qū),歸入的版本跟蹤管理。
4、 添加文件到暫存區(qū)
$ git add .
$ git status
# On branch master
# Changes to be committed:
# (use "git reset HEAD ..." to unstage)
#
# modified: h.txt
# new file: test.txt
git add . 把當(dāng)前所有目錄文件所有新文件和修改文件添加到暫存區(qū),如果test.txt 文件提示是 Changes not staged for commit ,說(shuō)明此跟蹤文件已經(jīng)發(fā)生修改,但是還未添加到暫存區(qū),把修改的文件通過(guò)git add 命令添加到暫存區(qū)后。提示Changes to be committed. 文件已經(jīng)暫存,隨時(shí)可以提交到倉(cāng)庫(kù) 。h.txt 新添加文件從未跟蹤狀態(tài)Untracked files ,通過(guò)git add命令添加到暫存區(qū),已加入跟蹤文件的范圍。
5、版本提交
$ git commit -m "this is test commit"
[master d4a498a] this is test commit
git commit --amend --reset-author
2 files changed, 3 insertions(+)
create mode 100644 t.txt