版本控制
版本控制(Revision control)是一種在開發(fā)的過程中用于管理我們對文件涮阔、目錄或工程等內(nèi)容的修改歷史窿锉,方便查看更改歷史記錄,備份以便恢復(fù)以前的版本的軟件工程技術(shù)。
- 實(shí)現(xiàn)跨區(qū)域多人協(xié)同開發(fā)
- 追蹤和記載一個(gè)或者多個(gè)文件的歷史記錄
- 組織和保護(hù)你的源代碼和文檔
- 統(tǒng)計(jì)工作量
- 并行開發(fā)升酣、提高開發(fā)效率
- 跟蹤記錄整個(gè)軟件的開發(fā)過程
- 減輕開發(fā)人員的負(fù)擔(dān)诫睬,節(jié)省時(shí)間厢漩,同時(shí)降低人為錯(cuò)誤
簡單說就是用于管理多人協(xié)同開發(fā)項(xiàng)目的技術(shù)。
沒有進(jìn)行版本控制或者版本控制本身缺乏正確的流程管理岩臣,在軟件開發(fā)過程中將會引入很多問題溜嗜,如軟件代碼的一致性、軟件內(nèi)容的冗余架谎、軟件過程的事物性炸宵、軟件開發(fā)過程中的并發(fā)性、軟件源代碼的安全性谷扣,以及軟件的整合等問題土全。
常見版本控制
git SVN CVS VSS TFS
本地版本控制:記錄文件的每次更新捎琐,對每個(gè)版本做一個(gè)快照,適合個(gè)人使用
集中版本控制:所有版本數(shù)據(jù)都保存在服務(wù)器上裹匙,協(xié)同開發(fā)者從服務(wù)器上同步或更新自己的修改瑞凑,所有的版本數(shù)據(jù)都存在服務(wù)器上,用戶的本地只有自己以前所同步的版本概页,如果不連網(wǎng)的話籽御,用戶就看不到歷史版本,也無法切換版本驗(yàn)證問題惰匙,或在不同分支工作技掏。而且,所有數(shù)據(jù)都保存在單一的服務(wù)器上项鬼,有很大的風(fēng)險(xiǎn)這個(gè)服務(wù)器會損壞哑梳,這樣就會丟失所有的數(shù)據(jù),當(dāng)然可以定期備份绘盟。代表產(chǎn)品:SVN鸠真、CVS、VSS
分布式版本控制:所有版本信息倉庫全部同步到本地的每個(gè)用戶龄毡,這樣就可以在本地查看所有版本歷史弧哎,可以離線在本地提交,只需在連網(wǎng)時(shí)push到相應(yīng)的服務(wù)器或其他用戶那里稚虎。由于每個(gè)用戶那里保存的都是所有的版本數(shù)據(jù)撤嫩,只要有一個(gè)用戶的設(shè)備沒有問題就可以恢復(fù)所有的數(shù)據(jù),但這增加了本地存儲空間的占用蠢终。不會因?yàn)榉?wù)器損壞或者網(wǎng)絡(luò)問題序攘,造成不能工作的情況!
SVN是集中式版本控制系統(tǒng)寻拂,版本庫是集中放在中央服務(wù)器的程奠,而工作的時(shí)候,用的都是自己的電腦祭钉,所以首先要從中央服務(wù)器得到最新的版本瞄沙,然后工作,完成工作后慌核,需要把自己做完的活推送到中央服務(wù)器距境。集中式版本控制系統(tǒng)是必須聯(lián)網(wǎng)才能工作,對網(wǎng)絡(luò)帶寬要求較高垮卓。
Git是分布式版本控制系統(tǒng)垫桂,沒有中央服務(wù)器,每個(gè)人的電腦就是一個(gè)完整的版本庫粟按,工作的時(shí)候不需要聯(lián)網(wǎng)了诬滩,因?yàn)榘姹径荚谧约弘娔X上霹粥。協(xié)同的方法是這樣的:比如說自己在電腦上改了文件A,其他人也在電腦上改了文件A疼鸟,這時(shí)后控,你們兩之間只需把各自的修改推送給對方,就可以互相看到對方的修改了空镜。Git可以直接看到更新了哪些代碼和文件浩淘!
git配置
查看配置 git config -l
#查看系統(tǒng)config
git config --system --list
#查看當(dāng)前用戶(global)配置
git config --global --list
1)、Git\etc\gitconfig :Git 安裝目錄下的 gitconfig --system 系統(tǒng)級
2)姑裂、C:\Users\Administrator\ .gitconfig 只適用于當(dāng)前登錄用戶的配置 --global 全局
git config --global user.name "kuangshen" #名稱
git config --global user.email 24736743@qq.com #郵箱
基礎(chǔ)
workspace工作區(qū):平時(shí)存放代碼的地方
|/ git add |\ git checkout
index/stage:暫存區(qū)馋袜,用于臨時(shí)存放改動男旗,只是一個(gè)文件舶斧,保存即將提交到文件列表的信息
|/ git commit |\ git reset
repository本地倉庫區(qū):安全存放數(shù)據(jù)的位置,有提交到所有版本的數(shù)據(jù)察皇,HEAD指向最新放入倉庫的版本
|/ git push |\ git pull
remote:遠(yuǎn)端倉庫茴厉,托管代碼的服務(wù)器
Directory:使用Git管理的一個(gè)目錄,也就是一個(gè)倉庫什荣,包含我們的工作空間和Git的管理空間矾缓。
WorkSpace:需要通過Git進(jìn)行版本控制的目錄和文件,這些目錄和文件組成了工作空間稻爬。
.git:存放Git管理信息的目錄嗜闻,初始化倉庫的時(shí)候自動創(chuàng)建。
Index/Stage:暫存區(qū)桅锄,或者叫待提交更新區(qū)琉雳,在提交進(jìn)入repo之前,我們可以把所有的更新放在暫存區(qū)友瘤。
Local Repo:本地倉庫翠肘,一個(gè)存放在本地的版本庫;HEAD會只是當(dāng)前的開發(fā)分支(branch)辫秧。
Stash:隱藏束倍,是一個(gè)工作狀態(tài)保存棧,用于保存/恢復(fù)WorkSpace中的臨時(shí)狀態(tài)盟戏。
工作流程
git的工作流程一般是這樣的:
1绪妹、在工作目錄中添加、修改文件柿究;
2喂急、將需要進(jìn)行版本管理的文件放入暫存區(qū)域;
3笛求、將暫存區(qū)域的文件提交到git倉庫廊移。
因此糕簿,git管理的文件有三種狀態(tài):已修改(modified),已暫存(staged),已提交(committed)
|---commit -a-------------->|
|--add (-u)-->|---commit--->|--push-------->|
workspace index local res remote res
|<---------pull or rebase-------------------|
|<-------fetch--|
|<----checkout HEAD---------|
|<----checkout-| revert
|----diff HEAD--------------|
|----diff------| compare
命令
# 本地倉庫創(chuàng)建
1、創(chuàng)建全新的倉庫狡孔,需要用GIT管理的項(xiàng)目的根目錄執(zhí)行:
git init
2懂诗、執(zhí)行后可以看到,僅僅在項(xiàng)目目錄多出了一個(gè).git目錄苗膝,關(guān)于版本等的所有信息都在這個(gè)目錄里面殃恒。
# 克隆
1、另一種方式是克隆遠(yuǎn)程目錄辱揭,由于是將遠(yuǎn)程服務(wù)器上的倉庫完全鏡像一份至本地离唐!
git clone [url]
文件狀態(tài)
版本控制就是對文件的版本控制,要對文件進(jìn)行修改问窃、提交等操作亥鬓,首先要知道文件當(dāng)前在什么狀態(tài),不然可能會提交了現(xiàn)在還不想提交的文件域庇,或者要提交的文件沒提交上嵌戈。
- Untracked: 未跟蹤, 此文件在文件夾中, 但并沒有加入到git庫, 不參與版本控制. 通過git add 狀態(tài)變?yōu)镾taged.
- Unmodify: 文件已經(jīng)入庫, 未修改, 即版本庫中的文件快照內(nèi)容與文件夾中完全一致. 這種類型的文件有兩種去處, 如果它被修改, 而變?yōu)镸odified. 如果使用git rm移出版本庫, 則成為Untracked文件
- Modified: 文件已修改, 僅僅是修改, 并沒有進(jìn)行其他的操作. 這個(gè)文件也有兩個(gè)去處, 通過git add可進(jìn)入暫存staged狀態(tài), 使用git checkout 則丟棄修改過, 返回到unmodify狀態(tài), 這個(gè)git checkout即從庫中取出文件, 覆蓋當(dāng)前修改 !
- Staged: 暫存狀態(tài). 執(zhí)行g(shù)it commit則將修改同步到庫中, 這時(shí)庫中的文件和本地文件又變?yōu)橐恢? 文件為Unmodify狀態(tài). 執(zhí)行g(shù)it reset HEAD filename取消暫存, 文件狀態(tài)為Modified
#查看指定文件狀態(tài)
git status [filename]
#查看所有文件狀態(tài)
git status
# git add . 添加所有文件到暫存區(qū)
# git commit -m "消息內(nèi)容" 提交暫存區(qū)中的內(nèi)容到本地倉庫 -m 提交信息
忽略文件
有些時(shí)候我們不想把某些文件納入版本控制中,比如數(shù)據(jù)庫文件听皿,臨時(shí)文件晨仑,設(shè)計(jì)文件等
在主目錄下建立".gitignore"文件刊橘,此文件有如下規(guī)則:
忽略文件中的空行或以井號(#)開始的行將會被忽略票渠。
可以使用Linux通配符拂檩。例如:星號(*)代表任意多個(gè)字符,問號(又厉?)代表一個(gè)字符九府,方括號([abc])代表可選字符范圍,大括號({string1,string2,...})代表可選的字符串等馋没。
如果名稱的最前面有一個(gè)感嘆號(!)昔逗,表示例外規(guī)則,將不被忽略篷朵。
如果名稱的最前面是一個(gè)路徑分隔符(/)勾怒,表示要忽略的文件在此目錄下,而子目錄中的文件不忽略声旺。
如果名稱的最后面是一個(gè)路徑分隔符(/)笔链,表示要忽略的是此目錄下該名稱的子目錄,而非文件(默認(rèn)文件或目錄都忽略)腮猖。
#為注釋
*.txt #忽略所有 .txt結(jié)尾的文件,這樣的話上傳就不會被選中鉴扫!
!lib.txt #但lib.txt除外
/temp #僅忽略項(xiàng)目根目錄下的TODO文件,不包括其它目錄temp
build/ #忽略build/目錄下的所有文件
doc/*.txt #會忽略 doc/notes.txt 但不包括 doc/server/arch.txt
分支
# 列出所有本地分支
git branch
# 列出所有遠(yuǎn)程分支
git branch -r
# 新建一個(gè)分支,但依然停留在當(dāng)前分支
git branch [branch-name]
# 新建一個(gè)分支澈缺,并切換到該分支
git checkout -b [branch]
# 合并指定分支到當(dāng)前分支
$ git merge [branch]
# 刪除分支
$ git branch -d [branch-name]
# 刪除遠(yuǎn)程分支
$ git push origin --delete [branch-name]
$ git branch -dr [remote/branch]