廣州網(wǎng)站建設(shè)建設(shè)南寧seo網(wǎng)絡(luò)推廣
GIT版本控制和常用命令使用介紹
- 1. 版本控制
- 1.1 歷史背景
- 1.2 什么是版本控制
- 1.3 常見版本控制工具
- 1.4 版本控制的分類
- 2 Git介紹
- 2.1 Git 工作流程
- 2.2 基本概念
- 2.3 文件的四種狀態(tài)
- 2.4 忽略文件
- 2.5 Git命令
- 2.5.1 查看本地git配置命令
- 2.5.2 遠(yuǎn)程庫信息查看命令
- 2.5.3 分支交互命令
- 2.5.4 標(biāo)簽常用命令
- 2.5.5 暫存區(qū)命令
- 2.5.6 查看提交歷史
- 2.5.7 gitk
1. 版本控制
1.1 歷史背景
同生活中的許多偉大事物一樣,Git誕生于一個(gè)極富紛爭且大舉創(chuàng)新的年代。Linux內(nèi)核開源項(xiàng)目有著為數(shù)眾廣的參與者。
1991-2002年間, 絕大多數(shù)的Linux內(nèi)核維護(hù)工作都花在了提交補(bǔ)丁和保存歸檔的繁瑣事務(wù)上。
直到2002年,整個(gè)項(xiàng)目組開始啟用一個(gè)專有的分布式版本控制系統(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時(shí)的經(jīng)驗(yàn)教訓(xùn),開發(fā)出自己的版本系統(tǒng),也就是后來的Git。
Git是目前世界上最先進(jìn)的分布式版本控制系統(tǒng),而且是是免費(fèi)的、開源的,最初Git是為輔助Linux內(nèi)核開發(fā)的,作為一種過渡方案來替代 BitKeeper。
1.2 什么是版本控制
版本控制(Revision control)是一種在開發(fā)的過程中用于管理我們對(duì)文件、目錄或工程等內(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ā)過程中將會(huì)引入很多問題,如軟件代碼的一致性、軟件內(nèi)容的冗余、軟件過程的事物性、軟件開發(fā)過程中的并發(fā)性、軟件源代碼的安全性,以及軟件的整合等問題。
1.3 常見版本控制工具
主流的版本控制器有如下這些:
- Git
- SVN(Subversion)
- CVS(Concurrent Versions System)
- VSS(Micorosoft Visual SourceSafe)
- TFS(Team Foundation Server)
- Visual Studio Online
版本控制產(chǎn)品非常的多(Perforce、Rational ClearCase、RCS(GNU Revision Control System)、Serena Dimention、SVK、BitKeeper、Monotone、Bazaar、Mercurial、SourceGear Vault),現(xiàn)在影響力最大且使用最廣泛的是Git與SVN。
Git與SVN最主要的區(qū)別:
SVN是集中式版本控制系統(tǒng),版本庫是集中放在中央服務(wù)器的。然而編寫代碼的時(shí)候,使用的是自己的電腦,所以首先要從中央服務(wù)器得到最新的版本,然后再編寫代碼。完成工作后,需要把自己編寫的代碼推送到中央服務(wù)器。集中式版本控制系統(tǒng)是必須聯(lián)網(wǎng)才能工作,對(duì)網(wǎng)絡(luò)帶寬要求較高。
Git是分布式版本控制系統(tǒng),沒有中央服務(wù)器,每個(gè)人的電腦就是一個(gè)完整的版本庫。編寫代碼的時(shí)候不需要聯(lián)網(wǎng)了,因?yàn)榘姹径荚谧约弘娔X上。協(xié)同的方法是這樣的:比如說自己在電腦上改了文件A,其他人也在電腦上改了文件A,這時(shí),你們兩之間只需把各自的修改推送給對(duì)方,就可以互相看到對(duì)方的修改了。
Git是目前世界上最先進(jìn)的分布式版本控制系統(tǒng)。
1.4 版本控制的分類
-
本地版本控制
記錄文件每次的更新,可以對(duì)每個(gè)版本做一個(gè)快照,或是記錄補(bǔ)丁文件,適合個(gè)人用,如RCS。
-
集中版本控制
所有的版本數(shù)據(jù)都保存在服務(wù)器上,協(xié)同開發(fā)者從服務(wù)器上同步更新或上傳自己的修改。
所有的版本數(shù)據(jù)都存在服務(wù)器上,用戶的本地只有自己以前所同步的版本,如果不連網(wǎng)的話,用戶就看不到歷史版本,也無法切換版本驗(yàn)證問題,或在不同分支工作。而且,所有數(shù)據(jù)都保存在單一的服務(wù)器上,有很大的風(fēng)險(xiǎn)這個(gè)服務(wù)器會(huì)損壞,這樣就會(huì)丟失所有的數(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ù),但這增加了本地存儲(chǔ)空間的占用。
2 Git介紹
2.1 Git 工作流程
一般工作流程如下:
- 克隆 Git 資源作為工作目錄。
- 在克隆的資源上添加或修改文件。
- 如果其他人修改了,你可以更新資源。
- 在提交前查看修改。
- 提交修改。
- 在修改完成后,如果發(fā)現(xiàn)錯(cuò)誤,可以撤回提交并再次修改并提交。
可以概括為:
- 從遠(yuǎn)程倉庫中克隆Git資源作為本地倉庫,同時(shí)從本地倉庫中checkout代碼
- 提交代碼:提交到暫存區(qū)–>提交到本地倉庫–>代碼push到遠(yuǎn)程倉庫
注:
- 1本地倉庫中保存修改的各個(gè)歷史版本
- 代碼push到遠(yuǎn)程倉庫,因?yàn)樾枰蛨F(tuán)隊(duì)成員共享代碼
2.2 基本概念
- 工作區(qū):workspace。就是你在電腦里能看到的目錄,平時(shí)存放項(xiàng)目代碼的地方。
- 暫存區(qū):stage 或 index。用于臨時(shí)存放你的改動(dòng),事實(shí)上它只是一個(gè)文件,保存即將提交到文件列表的信息。一般存放在 .git 目錄下的 index 文件(.git/index)中,所以我們把暫存區(qū)有時(shí)也叫作索引(index)。
- 本地倉庫:Repository。就是安全存放數(shù)據(jù)的位置,這里面有你提交所有的版本的數(shù)據(jù)。其中HEAD指向最新放入倉庫的版本。
- 遠(yuǎn)程倉庫:Remote。托管代碼的服務(wù)器,可以簡單的認(rèn)為是你項(xiàng)目組的一臺(tái)電腦用于遠(yuǎn)程數(shù)據(jù)交換。
2.3 文件的四種狀態(tài)
版本控制就是對(duì)文件的版本控制,要對(duì)文件進(jìn)行修改、提交等操作,首先要知道文件當(dāng)前在什么狀態(tài),不然可能會(huì)提交了現(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)橐恢?#xff0c;文件為Unmodify 狀態(tài)。執(zhí)行g(shù)it reset HEAD filename 取消暫存,文件狀態(tài)為Modified。
2.4 忽略文件
有時(shí)候我們不想把某些文件納入版本控制中,比如數(shù)據(jù)庫文件,臨時(shí)文件,設(shè)計(jì)文件等,在主目錄下建立"gitignore" 文件,此文件有如下規(guī)則:
- 忽略文件中的空行或以#符號(hào)開始的行將會(huì)被忽略
- 可以使用Linux通配符。例如:星號(hào)(*)代表任意多個(gè)字符,問號(hào)(?)代表一個(gè)字符,方括號(hào)([abc])代表可選字符范圍,大括號(hào)({string1,string2})代表可選的字符串等
- 如果名稱的最前面有一個(gè)感嘆號(hào)(!),表示例外規(guī)則,將不被忽略
- 如果名稱最前面是一個(gè)路徑分隔符(/),表示要忽略的文件在此目錄下
- 如果名稱的最后面是一個(gè)路徑分隔符(/),表示要忽略的是此目錄下該名稱的子目錄
# 為注釋
*.txt 忽略所有 .txt結(jié)尾的文件
!lib.txt 但lib.txt除外
/temp 僅忽略項(xiàng)目根目錄下的temp文件,不包括其他目錄
build/ 忽略build/目錄下的所有文件
doc/*.txt 忽略 doc/notes/txt 但不包括doc/server.arch.txt
2.5 Git命令
2.5.1 查看本地git配置命令
#查看全部config
git config -l
#查看系統(tǒng)config
git config --system --list
#查看當(dāng)前用戶全局config
git config --global --list
#設(shè)置用戶名
git config --global user.name "[名稱]"
#設(shè)置郵箱
git config --global user.email [郵箱]
2.5.2 遠(yuǎn)程庫信息查看命令
#查看遠(yuǎn)程庫信息
git remote
#遠(yuǎn)程庫詳細(xì)信息
git remote -v
#查看遠(yuǎn)程分支
git branch -r , git branch -a
#為遠(yuǎn)程倉庫地址創(chuàng)建別名
git remote add origin https://github.com/sun766/Programming-art.git(此處舉例)
#查看當(dāng)前別名所對(duì)應(yīng)的遠(yuǎn)程倉庫地址
git remote show origin
#從遠(yuǎn)程倉庫獲取代碼(拉取所有版本到本地)
git clone origin
#刪除當(dāng)前別名所對(duì)應(yīng)的遠(yuǎn)程倉庫地址
git remote remove origin
2.5.3 分支交互命令
#查看分支 (顯示結(jié)果中 有* 代表當(dāng)前所在分支)
git branch
#創(chuàng)建分支
git branch 分支名稱
#建立本地分支和遠(yuǎn)程分支的關(guān)聯(lián)
git branch –set-upstream branch-name origin/branch-name
#切換分支(工作區(qū)文件內(nèi)容會(huì)立即變化成對(duì)應(yīng)分支的內(nèi)容 )
git checkout 分支名稱
#創(chuàng)建+切換分支,git checkout -b dev,即origin/dev
git checkout -b 分支名稱
#更新
git pull
#將遠(yuǎn)程主機(jī) origin 的 master 分支拉取過來,與本地的 brantest 分支合并
git pull origin master:brantest
#遠(yuǎn)程分支與當(dāng)前分支合并,冒號(hào)后面的部分可以省略
git pull origin master
#將當(dāng)前分支推送到遠(yuǎn)程對(duì)應(yīng)的分支(若遠(yuǎn)程無對(duì)應(yīng)分支,則推送無效)
git push
#將分支dev提交到遠(yuǎn)程origin/dev(遠(yuǎn)程沒有則創(chuàng)建, 遠(yuǎn)程沒有dev則創(chuàng)建)
git push origin dev
#如果當(dāng)前分支與多個(gè)主機(jī)存在追蹤關(guān)系,則可以使用 -u 參數(shù)指定一個(gè)默認(rèn)主機(jī),這樣后面就可以不加任何參數(shù)使用git push
#,不帶任何參數(shù)的git push,默認(rèn)只推送當(dāng)前分支,這叫做simple方式,還有一種matching方式,會(huì)推送所有有對(duì)應(yīng)的遠(yuǎn)程分支的本地分支, Git 2.0之前默認(rèn)使用matching,現(xiàn)在改為simple方式
git push -u origin master
#刪除分支 (如果分支沒有被合并不允許刪除)
git branch -d 分支名稱
#刪除分支(強(qiáng)制刪除分支)
git branch -D 分支名稱
#合并某分支到當(dāng)前分支(當(dāng)前目錄主分支,將來源分支合并到主分支上。合并后來源分支仍然存在)
git merge 來源分支
#合并分支(禁用 Fast forward)
git merge –no-ff -m “描述” dev
#查看分支合并情況
git log –graph –pretty=oneline –abbrev-commit
2.5.4 標(biāo)簽常用命令
#創(chuàng)建標(biāo)簽
##對(duì)當(dāng)前版本建立標(biāo)簽
git tag tagname
##對(duì)歷史版本建立標(biāo)簽
git tag tagname commit_id
##commit_id 添加說明
git tag -a tagname -m “描述…”
##查看所有標(biāo)簽
git tag
##查看某個(gè)標(biāo)簽具體信息
git show tagname#刪除標(biāo)簽
##刪除本地標(biāo)簽
git tag -d tagname#推送標(biāo)簽
##推送本地的某個(gè)標(biāo)簽到遠(yuǎn)程
git push origin tagname
##一次性推送所有分支
git push origin –tags
2.5.5 暫存區(qū)命令
# 添加指定文件到暫存區(qū)
git add [file1] [file2] ...
# 添加指定目錄到暫存區(qū),包括子目錄
git add [dir]
# 添加當(dāng)前目錄的所有文件到暫存區(qū)
git add .
#用暫存區(qū)中的文件覆蓋工作目錄中的文件
git checkout -- 文件名
#將暫存區(qū)中文件刪除
git rm --cached 文件名
#查看當(dāng)前的狀態(tài)
git status
#提交文件(將暫存區(qū)的文件提交到本地git倉庫)
git commit -m '添加內(nèi)容'
git commit -F ~/gitcommit/gitcommit_bug
2.5.6 查看提交歷史
Git 提交歷史一般常用兩個(gè)命令:
git log - 查看歷史提交記錄。
git blame <file> - 以列表形式查看指定文件的歷史修改記錄。
- git log
--oneline 選項(xiàng)來查看歷史記錄的簡潔的版本
--graph 選項(xiàng),查看歷史中什么時(shí)候出現(xiàn)了分支、合并
--reverse 參數(shù)來逆向顯示所有日志
--author查找指定用戶的提交日志 git log --author=Linus
--since/--before 指定日期 git log --oneline --before={3.weeks.ago} --after={2010-04-18}
- git blame < file >
2.5.7 gitk
gitk是git圖形化的界面軟件版本,對(duì)倉庫的管理更為直觀,不需要在命令行中進(jìn)行繁瑣的控制,將各種信息合理的組織在不同的軟件窗口中,讓一些很繁瑣的操作可以在圖像軟件中只需要一鍵獲得。合理的結(jié)合命令行和圖形工具可以大大提高軟件開發(fā)和分支管理的效率。