版本控制是一種記錄一個或若干文件內(nèi)容變化,以便將來查閱特定版本修訂情況的系統(tǒng)。除了項(xiàng)目,你可以對任何類型的文件進(jìn)行版本控制。
創(chuàng)新互聯(lián)公司堅(jiān)信:善待客戶,將會成為終身客戶。我們能堅(jiān)持多年,是因?yàn)槲覀円恢笨芍档眯刨?。我們從不忽悠初訪客戶,我們用心做好本職工作,不忘初心,方得始終。10年網(wǎng)站建設(shè)經(jīng)驗(yàn)創(chuàng)新互聯(lián)公司是成都老牌網(wǎng)站營銷服務(wù)商,為您提供成都網(wǎng)站制作、做網(wǎng)站、網(wǎng)站設(shè)計(jì)、H5響應(yīng)式網(wǎng)站、網(wǎng)站制作、品牌網(wǎng)站建設(shè)、微信小程序定制開發(fā)服務(wù),給眾多知名企業(yè)提供過好品質(zhì)的建站服務(wù)。采用版本控制系統(tǒng)(VCS)是個明智的選擇。 有了它就可以將某個文件回溯到之前的狀態(tài),甚至將整個項(xiàng)目都回退到過去某個時間點(diǎn)的狀態(tài),可以比較文件的變化細(xì)節(jié),查出最后是誰修改了哪個地方,從而找出導(dǎo)致怪異問題出現(xiàn)的原因,又是誰在何時報(bào)告了某個功能缺陷等等。 使用版本控制系統(tǒng)就算你對項(xiàng)目刪除、修改錯誤,這也沒有關(guān)系,你也照樣可以很容易地就恢復(fù)到原先的樣子。但額外增加的工作量卻微乎其微。
許多人習(xí)慣用復(fù)制整個項(xiàng)目目錄的方式來保存不同的版本,或許還會改名加上備份時間以示區(qū)別。 這么做唯一的好處就是簡單,但是特別容易犯錯。 有時候會混淆所在的工作目錄,一不小心會寫錯文件或者覆蓋意想外的文件。而且不利于團(tuán)隊(duì)協(xié)作。 為了解決這個問題,人們很久以前就開發(fā)了許多種本地版本控制系統(tǒng),大多都是采用某種簡單的數(shù)據(jù)庫來記錄文件的歷次更新差異。圖片來源 Git 官網(wǎng)。
其中最流行的一種叫做 RCS,現(xiàn)今許多計(jì)算機(jī)系統(tǒng)上都還看得到它的蹤影。 甚至在流行的 Mac OS X 系統(tǒng)上安裝了開發(fā)者工具包之后,也可以使用
rcs
命令。 它的工作原理是在硬盤上保存補(bǔ)丁集(補(bǔ)丁是指文件修訂前后的變化);通過應(yīng)用所有的補(bǔ)丁,可以重新計(jì)算出各個版本的文件內(nèi)容。
接下來人們又遇到一個問題,如何讓在不同系統(tǒng)上的開發(fā)者協(xié)同工作? 于是,集中化的版本控制系統(tǒng)(Centralized Version Control Systems,簡稱
CVCS
)應(yīng)運(yùn)而生。 諸如
CVS
、Subversion(
SVN
) 以及
Perforce
等。
集中化的版本控制系統(tǒng)是單一的集中管理的服務(wù)器,保存所有文件的修訂版本,而協(xié)同工作的人們都通過客戶端連到這臺服務(wù)器,取出最新的文件或者提交更新。多年以來,這已成為版本控制系統(tǒng)的標(biāo)準(zhǔn)做法。如圖(來源 Git 官網(wǎng)):
相對本地版本管理,集中化的版本控制每個人都可以在一定程度上看到項(xiàng)目中的其他人正在做些什么。 而管理員也可以輕松掌控每個開發(fā)者的權(quán)限,并且管理一個 CVCS 要遠(yuǎn)比在各個客戶端上維護(hù)本地?cái)?shù)據(jù)庫來得輕松容易。
它也有如下詬?。?/p>
單點(diǎn)故障如果宕機(jī),誰都無法提交更新,也就無法協(xié)同工作。 如果中心數(shù)據(jù)庫所在的磁盤發(fā)生損壞,又沒有做恰當(dāng)備份,毫無疑問將丟失所有數(shù)據(jù)——包括項(xiàng)目的整個變更歷史,只剩下人們在各自機(jī)器上保留的單獨(dú)快照。
需要聯(lián)網(wǎng)為什么需要聯(lián)網(wǎng)?
集中化的版本控制系統(tǒng)
倉庫集中在一臺服務(wù)器,也就受到服務(wù)器網(wǎng)絡(luò)環(huán)境的影響。
于是分布式版本控制系統(tǒng)(Distributed Version Control System,簡稱
DVCS
)面世了。
Git
就是典型的分布式版本控制。還有
Mercurial
、
Bazaar
以及
Darcs
等。
客戶端并不只提取最新版本的文件快照,而是把代碼倉庫完整地鏡像下來。 這么一來,任何一處協(xié)同工作用的服務(wù)器發(fā)生故障,事后都可以用任何一個鏡像出來的本地倉庫恢復(fù)。 因?yàn)槊恳淮蔚目寺〔僮鳎瑢?shí)際上都是一次對代碼倉庫的完整備份。圖片來源 Git 官網(wǎng)。
分布式版本控制系統(tǒng)的優(yōu)勢不單是不必聯(lián)網(wǎng)這么簡單,后面我們還會看到 Git 極其強(qiáng)大的分支管理等功能。
2002 年,
Linux
內(nèi)核開源項(xiàng)目整個項(xiàng)目組啟用一個專有的分布式版本控制系統(tǒng) BitKeeper 來管理和維護(hù)代碼。到了 2005 年,開發(fā) BitKeeper 的商業(yè)公司同 Linux 內(nèi)核開源社區(qū)的合作關(guān)系結(jié)束,他們收回了 Linux 內(nèi)核社區(qū)免費(fèi)使用 BitKeeper 的權(quán)力。 這就迫使 Linux 開源社區(qū)(特別是 Linux 的締造者 Linus Torvalds)基于使用 BitKeeper 時的經(jīng)驗(yàn)教訓(xùn),開發(fā)出自己的版本系統(tǒng)。
集中式的缺點(diǎn):集中式版本控制系統(tǒng)大的毛病就是必須聯(lián)網(wǎng)才能工作,如果在局域網(wǎng)內(nèi)還好, 帶寬夠大, 速度夠快。
比方說你在自己電腦上改了文件A,你的同事也在他的電腦上改了文件A,這時,你們倆之間只需把各自的修改推送給對方,就可以互相看到對方的修改了。
某一個人的電腦壞掉了不要緊,隨便從其他人那里復(fù)制一個就可以了。而集中式版本控制系統(tǒng)的中央服務(wù)器要是出了問題,所有人都沒法干活了。
在實(shí)際使用分布式版本控制系統(tǒng)的時候,其實(shí)很少在兩人之間的電腦上推送版本庫的修改,因?yàn)榭赡苣銈儌z不在一個局域網(wǎng)內(nèi),兩臺電腦互相訪問不了,也可能今天你的同事病了,他的電腦壓根沒有開機(jī)。因此,分布式版本控制系統(tǒng)通常也有一臺充當(dāng)“中央服務(wù)器”的電腦,但這個服務(wù)器的作用僅僅是用來方便“交換”大家的修改,沒有它大家也一樣干活,只是交換修改不方便而已。
Git的存儲方式是
快照技術(shù)
,而其他版本控制系統(tǒng)的存儲基本上都是
增量存儲
。以下圖片來自網(wǎng)絡(luò)。
Git在每次
git add
即將內(nèi)容添加到
緩存區(qū)
時會進(jìn)行一次快照,
快照
就像給當(dāng)時的整個目錄及文件照了一張相,在任何時候通過快照就能將目錄及文件恢復(fù)到發(fā)起快照點(diǎn)的狀態(tài)。Git 是這樣生成快照的,對于沒有變化的文件,會生成一個引用指向原文件的位置以節(jié)省空間提高效率,對于變化了的文件則將整個文件存儲。git每個版本存儲的是一個快照。
所謂
增量存儲
,指的是除了第一個版本存儲的是每個文件的完整內(nèi)容,之后的版本存儲的是每個文件相對于上一個版本對應(yīng)文件的變化的內(nèi)容。
Git 在未進(jìn)行
commit
操作之前,存在三種狀態(tài):Untracked files
,Changes not staged for commit
及Changes to be committed
,每種狀態(tài)之間可以隨意進(jìn)行互相轉(zhuǎn)換。了解這三種狀態(tài)各自所對應(yīng)的不同情況,能夠幫助你方便有效的使用 Git 來管理項(xiàng)目。
在 Git 中,文件狀態(tài)是個非常重要的概念。
為了更清楚的說明
文件狀態(tài)
的概念,使用網(wǎng)絡(luò)上三張圖片。
可以看到,除了之前的“Changes to be committed”狀態(tài),現(xiàn)在又多了一條“Changes not staged for commit”狀態(tài),表明文件已經(jīng)修改,但是還沒有放入暫存區(qū)域,也就是沒生成快照。如果現(xiàn)在進(jìn)行commit操作,只是將修改之前的文件快照提交到了git目錄,一定記住:只有暫存區(qū)域的文件(即:文件狀態(tài)為“Changes to be committed”)才會被提交。正如提示,通過“git add README.txt”命令將已修改文件更新到暫存區(qū)域中,如果想撤銷修改,可以使用“git checkout -- README.txt”命令。
$ yum install curl-devel expat-devel gettext-devel
openssl-devel zlib-devel
$ yum -y install git-core
$ git --version git version 1.7.1
Linux 的其他版本系統(tǒng)需要其他方式安裝。
直接在官網(wǎng)下載。
另一種是在
Github
,搜索
GitHub for Windows
項(xiàng)目。
新建一個存項(xiàng)目文件夾,在
git bash
執(zhí)行
git init
,項(xiàng)目文件夾下出現(xiàn)
.git
的子目錄。
從遠(yuǎn)程代碼倉庫拉去一個現(xiàn)有的:
git clone [url]
也可以自定義本地倉庫名字
git clone [url] dirName
進(jìn)入 Git 項(xiàng)目目錄
cd /myProject
提交 所有修改到暫存區(qū)
git add .
提交暫存區(qū)修改內(nèi)容到本地倉庫
git commit -m "提交描述"
推送到遠(yuǎn)程倉庫
git push
現(xiàn)在就可以拉去 JavaPub 的遠(yuǎn)程倉庫了。
.gitignore
文件git rm filename
(從暫存區(qū)移除,然后提交)git status
推送到遠(yuǎn)程倉庫:
git push origin master
推送到遠(yuǎn)程
master
分支
如果沒有遠(yuǎn)程倉庫,現(xiàn)在想讓本地和遠(yuǎn)程倉庫關(guān)聯(lián),
如下命令添加:
git remote add origin
,比如我們要讓本地的一個倉庫和 Github 上創(chuàng)建的一個倉庫關(guān)聯(lián)可以這樣
git remote add origin https://github.com/Rodert/test.git
現(xiàn)在就可以將項(xiàng)目推送到遠(yuǎn)程倉庫了。
有時我們需要查詢以前的提交歷史,使用命令
git log
。
只看某人提交記錄
git log --author=bob
有時你提交過代碼之后,發(fā)現(xiàn)一個地方改錯了,你下次提交時不想保留上一次的記錄;或者你上一次的
commit
message的描述有誤,這時候你可以使用接下來的這個命令:
git commit --amend
。
git commit --amend
取消上一步操作,如
git add
、
git commit
之后。
git reset filename
分支是用來將特性開發(fā)絕緣開來的。在你創(chuàng)建倉庫的時候,
master
是默認(rèn)的。在其他分支上進(jìn)行開發(fā),完成后再將它們合并到主分支上。
不同的版本或系統(tǒng)模塊并行開發(fā)時,我們一般會單獨(dú)建立一個分支進(jìn)行開發(fā),最后再合并到主分支。
git branch test
test
分支git checkout test
也可以合并上面?zhèn)z步,
git checkout -b feature_x
。
git checkout master
git merge test
git branch -d test
git push <遠(yuǎn)程主機(jī)名> <本地分支名>:<遠(yuǎn)程分支名>
git push origin test:test
聲明:參考來源互聯(lián)網(wǎng),有任何爭議可以留言。站在前人的肩上,我們才能看的更遠(yuǎn)。
本教程純手打,致力于最實(shí)用教程,不需要什么獎勵,只希望多多轉(zhuǎn)發(fā)支持。