十年網(wǎng)站開發(fā)經(jīng)驗(yàn) + 多家企業(yè)客戶 + 靠譜的建站團(tuán)隊(duì)
量身定制 + 運(yùn)營(yíng)維護(hù)+專業(yè)推廣+無憂售后,網(wǎng)站問題一站解決
版本控制系統(tǒng)(VCS,Version Control Systems)是一種記錄一個(gè)或若干文件內(nèi)容變化,以便將來查閱特定版本修訂情況的系統(tǒng)。
版本控制系統(tǒng)分為:
A、本地版本控制系統(tǒng)(LVCS,Local Version Control Systems)
B、集中式版本控制系統(tǒng)(CVCS,Centralized Version Control Systems)
C、分布式版本控制系統(tǒng)(DVCS,Distributed Version Control System)
創(chuàng)新互聯(lián)建站網(wǎng)絡(luò)公司擁有十年的成都網(wǎng)站開發(fā)建設(shè)經(jīng)驗(yàn),上1000家客戶的共同信賴。提供網(wǎng)站建設(shè)、做網(wǎng)站、網(wǎng)站開發(fā)、網(wǎng)站定制、賣友情鏈接、建網(wǎng)站、網(wǎng)站搭建、響應(yīng)式網(wǎng)站設(shè)計(jì)、網(wǎng)頁設(shè)計(jì)師打造企業(yè)風(fēng)格,提供周到的售前咨詢和貼心的售后服務(wù)
本地版本控制系統(tǒng)大多都是采用某種簡(jiǎn)單的數(shù)據(jù)庫來記錄文件的歷次更新差異。最流行的本地版本控制系統(tǒng)為RCS,其工作原理是在硬盤上保存補(bǔ)丁集(補(bǔ)丁是指文件修訂前后的變化),通過應(yīng)用所有的補(bǔ)丁,可以重新計(jì)算出各個(gè)版本的文件內(nèi)容。
集中式版本控制系統(tǒng)(CVCS,Centralized Version Control Systems )都有一個(gè)單一的集中管理的服務(wù)器,保存所有文件的修訂版本,而協(xié)同工作的開發(fā)人員都通過客戶端連到服務(wù)器,取出最新的文件或者提交更新。集中式版本控制系統(tǒng)有CVS、Subversion、Perforce 等。
集中式版本控制系統(tǒng)的優(yōu)點(diǎn):相比本地版本控制系統(tǒng),每個(gè)人都可以在一定程度上看到項(xiàng)目中的其他人正在做些什么。管理員可以輕松掌控每個(gè)開發(fā)者的權(quán)限,并且管理一個(gè)CVCS遠(yuǎn)比在各個(gè)客戶端上維護(hù)本地?cái)?shù)據(jù)庫簡(jiǎn)單。
集中式版本控制系統(tǒng)的缺點(diǎn):中央服務(wù)器的單點(diǎn)故障。如果中央服務(wù)器宕機(jī),開發(fā)人員無法提交更新,無法協(xié)同工作。如果中央服務(wù)器的數(shù)據(jù)庫所在磁盤發(fā)生損壞并且沒有備份,將導(dǎo)致數(shù)據(jù)丟失。
分布式版本控制系統(tǒng)(DVCS,Distributed Version Control System )中,客戶端并不只提取最新版本的文件快照,而是把代碼倉庫完整地鏡像下來,因此,任何一處協(xié)同工作用的服務(wù)器發(fā)生故障,都可以用任何一個(gè)鏡像出來的本地倉庫恢復(fù)。分布式版本控制系統(tǒng)的每一次的克隆操作都是一次對(duì)代碼倉庫的完整備份。
常見的分布式版本控制系統(tǒng)有Git、Mercurial、Darcs、Bazaar等。
分布式版本控制系統(tǒng)的特點(diǎn)是分布式,每一個(gè)節(jié)點(diǎn)都擁有倉庫的完整鏡像,每個(gè)節(jié)點(diǎn)都可以作為服務(wù)器,也可以作為客戶端。為了團(tuán)隊(duì)協(xié)同開發(fā)進(jìn)行分支合并,通常會(huì)將一個(gè)節(jié)點(diǎn)設(shè)置成偽中央服務(wù)器
分布式版本控制系統(tǒng)的優(yōu)點(diǎn):
A、提交分支不需要聯(lián)網(wǎng),客戶端本地保存著所有歷史記錄。
B、不依賴服務(wù)器的穩(wěn)定性,風(fēng)險(xiǎn)分散。
分布式版本控制系統(tǒng)的缺點(diǎn):
A、同步多人的修改稍繁。
B、缺少權(quán)限管理系統(tǒng)。
分布式版本控制系統(tǒng)的適用場(chǎng)景:
A、開源軟件的開發(fā)
B、同步需求不頻繁或者異地的多人協(xié)作
Linux內(nèi)核開源項(xiàng)目有廣泛的參與者,但在1991-2002年間,世界各地的Linux內(nèi)核開發(fā)者把源代碼文件通過diff的方式發(fā)給Linus,然后由Linus本人通過手工方式合并代碼,因此絕大多數(shù)的 Linux 內(nèi)核維護(hù)工作都花在了提交補(bǔ)丁和保存歸檔的繁瑣事務(wù)上。雖然Linux內(nèi)核社區(qū)有很多人提議使用集中式版本控制系統(tǒng)對(duì)Linux內(nèi)核項(xiàng)目進(jìn)行管理,但Linus堅(jiān)持拒絕使用必須聯(lián)網(wǎng)(龜速)才能使用的集中式版本控制系統(tǒng)以及付費(fèi)的商業(yè)版本控制系統(tǒng)。到2002年,BitMover授權(quán)Linux內(nèi)核社區(qū)免費(fèi)使用商業(yè)分布式版本控制系統(tǒng)BitKeeper來管理和維護(hù)代碼。
2005年,BitMover公司發(fā)現(xiàn)活躍于Linux內(nèi)核社區(qū)的Andrew(Samba開發(fā)者)試圖破解BitKeeper的協(xié)議,于是收回了Linux內(nèi)核社區(qū)使用BitKeeper的免費(fèi)授權(quán)。 但Linux項(xiàng)目千萬行級(jí)別的代碼管理不可能再回到石器時(shí)代的手動(dòng)合并,于是Linus基于使用BitKeeper的經(jīng)驗(yàn)教訓(xùn)與Linux項(xiàng)目團(tuán)隊(duì)的需求,使用了兩周時(shí)間開發(fā)出了Git初始版本,一個(gè)月后Git已經(jīng)用于Linux內(nèi)核項(xiàng)目源碼的管理。 目前Git由Linux社區(qū)的其它開發(fā)人員在持續(xù)開發(fā)。
大部分版本控制系統(tǒng),如CVS、Subversion、Perforce、Bazaar等以文件變更列表的方式存儲(chǔ)信息。通常保存的信息是一組基本文件和每個(gè)文件隨時(shí)間逐步累積的差異。
Git把數(shù)據(jù)看作是對(duì)小型文件系統(tǒng)的一組快照。每次提交更新或在Git中保存項(xiàng)目狀態(tài)時(shí),主要對(duì)當(dāng)時(shí)的全部文件制作一個(gè)快照并保存快照的索引。如果文件沒有修改,Git不再重新存儲(chǔ)該文件,而是只保留一個(gè)鏈接指向原來存儲(chǔ)的文件。
Linux發(fā)行版:
Fedora:sudo yum install git
Debian:sudo apt-get install git
Windows:
https://git-scm.com/download/win
Git for Windows(msysGit)
GitHub for Windows
Mac OS:
OSX Git:http://git-scm.com/download/mac
Git使用git config工具來設(shè)置控制Git外觀和行為的配置變量。
git config --system
在/etc/gitconfig文件讀寫配置變量,包含系統(tǒng)上每一個(gè)用戶及倉庫的通用配置,對(duì)當(dāng)前操作系統(tǒng)所有用戶、倉庫有效
git config --global
在~/.gitconfig 或 ~/.config/git/config文件讀寫配置變量,對(duì)當(dāng)前用戶有效
git config --local
在倉庫的.git/config文件讀寫配置變量,針對(duì)當(dāng)前倉庫有效。
低級(jí)別的Git配置信息會(huì)覆蓋上一級(jí)別的配置信息,所以當(dāng)前倉庫的配置信息(.git/config) 會(huì)覆蓋 /etc/gitconfig 中的配置信息。
通常,安裝完Git后需要設(shè)置用戶信息,如用戶名稱與郵件地址。因?yàn)槊恳粋€(gè)Git提交操作都會(huì)使用Git用戶信息,并且寫入到每一次提交中,不可更改。
git config --global user.name "username"
git config --global user.email "username@example.com"
Git配置信息查看:git config --list
Git某項(xiàng)配置信息查看:git config
刪除某項(xiàng)配置信息:git config --global unset
分支(branch):在一個(gè)時(shí)間點(diǎn),復(fù)制一份處于版本控制之下的文件,可以獨(dú)立的互不干擾的對(duì)拷貝進(jìn)行各自開發(fā)。
檢出(checkout):在本地創(chuàng)建一份倉庫的工作拷貝。
提交(commit):將本地的修改寫回到倉庫或合并到倉庫。
沖突(conflict):當(dāng)多個(gè)開發(fā)者同時(shí)提交對(duì)同一個(gè)文件的修改,而且版本控制系統(tǒng)不能對(duì)其進(jìn)行合并,就會(huì)引發(fā)沖突,需要手動(dòng)處理。
合并(merge):把所有對(duì)文件的修改統(tǒng)一到文件里。
倉庫(repository):當(dāng)前的和歷史的處于版本控制下的文件所在的地方。
Git本地有三個(gè)工作區(qū)域:工作目錄(Work Directory)、暫存區(qū)(Stage/Index)、本地倉庫(Repository)。
工作目錄:工作目錄/工作空間,存放項(xiàng)目代碼的目錄
暫存區(qū):暫存區(qū),用于臨時(shí)存放改動(dòng),本質(zhì)是一個(gè)文件,保存即將提交到文件列表信息
本地倉庫:安全存放提交的所有版本的數(shù)據(jù),其中HEAD指向最新放入倉庫的版本
遠(yuǎn)程倉庫(Remote Repository):托管代碼的服務(wù)器
Directory:Git管理的工程目錄,包含工作目錄和Git管理空間。
Work Directory:工作目錄,存放通過Git進(jìn)行版本控制的目錄和文件,是開發(fā)者工作的目錄。
.git:存放Git管理信息的目錄,初始化倉庫時(shí)自動(dòng)創(chuàng)建。
Index/Stage:暫存區(qū),即待提交更新區(qū),本質(zhì)是一個(gè)文件(.git/index),保存有下次將提交的文件列表信息。
Repository:本地倉庫,存放在本地的版本倉庫。
HEAD:HEAD指針,用于指向當(dāng)前分支的一個(gè)提交。
Stash:儲(chǔ)藏,是一個(gè)工作狀態(tài)保存棧,用于保存/恢復(fù)工作目錄的臨時(shí)狀態(tài)。
Git提交的基本工作流程如下:
A、在工作目錄中添加、修改、刪除文件。
B、將工作目錄中需要進(jìn)行版本管理的文件添加到暫存區(qū)。
C、將暫存區(qū)的文件提交到本地倉庫。
工程開發(fā)中,在進(jìn)行Git提交時(shí),并不是所有的文件都需要提交,比如一些自動(dòng)生成的文件,可以配置.gitignore來忽略一些不需要提交的文件。
Git對(duì)于.gitignore 配置文件是按行從上到下進(jìn)行規(guī)則匹配的,如果前面的規(guī)則匹配的范圍更大,則后面的規(guī)則將不會(huì)生效。
不同工程應(yīng)用開發(fā)的.gitignore模板集合如下:
https://github.com/github/gitignore
.gitignore文件語法規(guī)范如下:
A、空行或是以#開頭的行即注釋行將被忽略;
B、可以在前面添加正斜杠/來避免遞歸;可以在后面添加正斜杠/來忽略文件夾,例如build/即忽略 build文件夾
C、可以使用!來否定忽略;
D、*用來匹配零個(gè)或多個(gè)字符;
E、[]用來匹配括號(hào)內(nèi)的任一字符,如[abc],也可以在括號(hào)內(nèi)加連接符,如[0-9]匹配0至9的數(shù);
F、?用來匹配單個(gè)字符;
.gitignore示例如下:
# 忽略 .a 文件
*.a
# 但否定忽略 lib.a, 盡管已經(jīng)在前面忽略了 .a 文件
!lib.a
# 僅在當(dāng)前目錄下忽略 TODO 文件, 但不包括子目錄下的 subdir/TODO
/TODO
# 忽略 build/ 文件夾下的所有文件
build/
# 忽略 doc/notes.txt, 不包括 doc/server/arch.txt
doc/*.txt
# 忽略所有的 .pdf 文件 在 doc/ directory 下的
doc/**/*.pdf