一傍念、版本控制介紹
工程設(shè)計領(lǐng)域中使用版本控制管理工程藍圖的設(shè)計過程墓怀。在 IT 開發(fā)過程中也可以使用版本控制思想管理代碼的版本迭代迂烁。
思想:版本控制
實現(xiàn): 版本控制工具
集中式版本控制工具:CVS壶愤、SVN对雪、VSS...
need-to-insert-img
分布式版本控制工具:Git怜庸、Mercurial当犯、Bazzar、Darcs...
need-to-insert-img
need-to-insert-img
need-to-insert-img
大部分操作在本地完成灶壶,不需要聯(lián)網(wǎng)
完整性保證
盡可能添加數(shù)據(jù)而不是刪除或修改數(shù)據(jù)
分支操作非常快捷流暢
與 Linux命令全面兼容
need-to-insert-img
代碼托管中心的任務(wù):維護遠程庫
局域網(wǎng)環(huán)境
GitLab服務(wù)器
外網(wǎng)環(huán)境
GitHub杈曲、碼云
need-to-insert-img
need-to-insert-img
git init
need-to-insert-img
作用:區(qū)分不同開發(fā)人員的身份信息
辨析:這里設(shè)置簽名和遠程庫登錄的賬號密碼沒有任何關(guān)系?
#項目級別的設(shè)置 信息保存位置:.git/config文件git config user.name admingit config user.email example@gmail.com#系統(tǒng)級別設(shè)置 信息保存位置:~/.gitconfig文件git config--global user.name admingit config--global user.email example@gmail.com
狀態(tài)查看
git status #查看工作區(qū)、暫存區(qū)狀態(tài)
添加和提交
git add[file name]#將工作區(qū)的’新建/修改‘添加到暫存區(qū)git rm--cached[file name]#將剛才add的文件從暫存區(qū)刪除掉git commit-m"commit msg"[file name]#將緩存區(qū)的內(nèi)容提交到本地庫
查看歷史記錄
git log #空格下翻頁恰响、b上翻頁趣钱、q退出git log--online #每條記錄單行展示git reflog #每條記錄單行展示并且顯示最新版本到每條記錄的回退步數(shù)
need-to-insert-img
僅僅在本地庫移動HEAD指針
need-to-insert-img
1. 在本地庫移動HEAD指針
2. 重置暫存區(qū)
need-to-insert-img
1. 在本地庫移動HEAD指針
2. 重置暫存區(qū)
3. 重置工作區(qū)
刪除文件并找回
前提:刪除前,文件存在是的狀態(tài)提交到了本地庫
git reset--hard[指針位置] #刪除操作已經(jīng)提交到本地庫:指針位置指向歷史記錄#刪除操作尚未提交到本地庫:指針位置使用HEAD
比較文件差異
git diff[file name]#將工作區(qū)中的文件和暫存區(qū)進行比較git diff[本地庫中歷史版本][file name]#將工作區(qū)的文件和本地庫歷史記錄比較git diff #不帶文件名比較多個文件
什么是分支
在版本控制過程中胚宦,使用多條線同時推進多個任務(wù)首有。
need-to-insert-img
分支的好處
同時并行推進多個功能開發(fā),提高開發(fā)效率枢劝。
各個分支在開發(fā)過程中井联,如果某一個分支開發(fā)失敗,不會對其他分支有任 何影響您旁。失敗 的分支刪除重新開始即可烙常。
分支的操作
git branch[分支名]#創(chuàng)建分支git branch-v #查看分支git checkout[分支名]#切換分支git merge[源分支名]#合并分支:先切換到目標(biāo)分支,在執(zhí)行當(dāng)前合并的命令
解決沖突
編輯文件鹤盒,刪除特殊符號
把文件修改到滿意的程度蚕脏,保存退出
git add [文件名]
git commit -m "日志信息"?注意此時commit不能帶文件名
need-to-insert-img
need-to-insert-img
哈希是一個系列的加密算法侦锯,各個不同的哈希算法雖然加密強度不同驼鞭,但是有以下 幾個共同點:
① 不管輸入數(shù)據(jù)的數(shù)據(jù)量有多大,輸入同一個哈希算法尺碰,得到的加密結(jié)果長度固定挣棕。
② 哈希算法確定,輸入數(shù)據(jù)確定亲桥,輸出數(shù)據(jù)能夠保證不變
③ 哈希算法確定穴张,輸入數(shù)據(jù)有變化,輸出數(shù)據(jù)一定有變化两曼,而且通常變化很大
④ 哈希算法不可逆
Git 底層采用的是 SHA-1 算法皂甘。
哈希算法可以被用來驗證文件。原理如下圖所示:
need-to-insert-img
集中式版本控制工具的文件管理機制
以文件變更列表的方式存儲信息悼凑。這類系統(tǒng)將它們保存的信息看作是一組基本文件和每個文件隨時間逐步累積的差異偿枕。每次的上傳到服務(wù)器上文件,保存在服務(wù)器的部分都是這次和上次版本之間的差異户辫。如果要從服務(wù)器更新到本地也是需要把原始文件的版本和每次的差異 都合并起來渐夸,組成一個版本。優(yōu)點點是節(jié)約服務(wù)器的存儲空間渔欢,但缺點也很明顯墓塌,速度慢。
need-to-insert-img
Git的文件管理機制
Git 把數(shù)據(jù)看作是小型文件系統(tǒng)的一組快照。每次提交更新時 Git 都會對當(dāng)前的全部文件制作一個快照并保存這個快照的索引苫幢。為了高效访诱,如果文件沒有修改,Git 不再重新存儲該文件韩肝,而是只保留一個鏈接指向之前存儲的文件触菜。所以Git 的工作方式可以稱之為快照流。
need-to-insert-img
快照的意思就是哀峻,每次都是直接保存這個版本的所有文件涡相。
當(dāng)然,一般來說剩蟀,我們每次更改不會更改一個項目的所有文件催蝗,對于沒有更改的文件git在這里保存的其實是這個版本對于上一個版本的指針。上圖的虛線部分圈起來的相對之前版本沒改動育特,所以所在版本只保留這個文件的指針丙号。
Git文件管理機制細節(jié)
Git的”提交對象“
該提交對象還包含了作者的姓名和郵箱、提交時輸入的信息以及指向它的父對象的?指針?且预。
首次提交產(chǎn)生的提交對象沒有父對象槽袄,普通提交操作產(chǎn)生的提交對象有一個父對象烙无,而由多個分支合并產(chǎn)生的提交對象有多個父對象锋谐。
為了更加形象地說明,我們假設(shè)現(xiàn)在有一個工作目錄截酷,里面包含了三個將要被暫存和提交的文件涮拗。暫存操作會為每一個文件計算校驗和,然后會把當(dāng)前版本的文件快照保存到Git 倉庫中(Git 使用 blob 對象來保存它們)迂苛,最終將校驗和加入到暫存區(qū)域等待提交三热。
當(dāng)使用 git commit 進行提交操作時,Git 會先計算每一個子目錄的校驗和三幻,然后在Git 倉庫中這些校驗和保存為樹對象就漾。 隨后,Git 便會創(chuàng)建一個提交對象念搬,它除了包含上面提到的那些信息外抑堡,還包含指向這個樹對象(項目根目錄)的指針。如此一來朗徊,Git 就可以在需要的時候重現(xiàn)此次保存的快照首妖。
現(xiàn)在,Git 倉庫中有五個對象:三個 blob 對象(保存著文件快照)爷恳、一個樹對象(記錄著目錄結(jié)構(gòu)和 blob 對象索引)以及一個提交對象(包含著指向前述樹對象的指針和所有提交信息)有缆。
用圖形表示為如下方式
need-to-insert-img
提交對象及其父對象形成的鏈表結(jié)構(gòu)
對于B或C都是做些修改后再次提交,那么這次產(chǎn)生的提交對象會包含一個指向上次提交對象(父對象)的指針
need-to-insert-img
need-to-insert-img
need-to-insert-img
need-to-insert-img
need-to-insert-img
need-to-insert-img
基本命令
git remote-v #查看當(dāng)前所有遠程庫git remote add[別名][遠程庫地址]#給遠程庫起別名棚壁,方便以后使用git push[遠程庫別名][本地分支名]#推送本地分支到遠程庫杯矩,如果遠程沒有和本地相對應(yīng)的分支,則創(chuàng)建同名分支git clone[遠程地址]#等同于完成了代碼的下載以及初始化本地庫和創(chuàng)建了遠程庫origin的別名git fetch[遠程庫別名][遠程庫分支名]#拉取遠程庫代碼git merge[遠程庫別名/遠程庫分支名]#將遠程代碼合并到本地分支git pull[遠程庫別名][遠程分支名]#相當(dāng)于 fetch和merge的合并操作
Gitlab實操 省略一萬字...
在項目開發(fā)過程中使用 Git 的方式
GitFlow 工作流
Gitflow 工作流通過為功能開發(fā)菊碟、發(fā)布準備和維護設(shè)立了獨立的分支,讓發(fā)布迭代過程更流暢在刺。嚴格的分支模型也為大型項目提供了一些非常必要的結(jié)構(gòu)逆害。
need-to-insert-img
主干分支 master
主要負責(zé)管理正在運行的生產(chǎn)環(huán)境代碼。永遠保持與正在運行的生產(chǎn)環(huán)境 完全一致蚣驼。
開發(fā)分支 develop
主要負責(zé)管理正在開發(fā)過程中的代碼魄幕。一般情況下應(yīng)該是最新的代碼。
bug修復(fù)分支 hotfix
主要負責(zé)管理生產(chǎn)環(huán)境下出現(xiàn)的緊急修復(fù)的代碼颖杏。從主干分支分出纯陨,修理完畢并測試上線后,并回主干分支留储。并回后翼抠,視情況可以刪除該分支。
準生產(chǎn)分支(預(yù)發(fā)布分支) release
較大的版本上線前获讳,會從開發(fā)分支中分出準生產(chǎn)分支阴颖,進行最后階段的集 成測試。該版本上線后丐膝,會合并到主干分支量愧。生產(chǎn)環(huán)境運行一段階段較穩(wěn)定后 可以視情況刪除。
功能分支 feature
為了不影響較短周期的開發(fā)工作帅矗,一般把中長期開發(fā)模塊偎肃,會從開發(fā)分支 中獨立出來。 開發(fā)完成后會合并到開發(fā)分支浑此。
need-to-insert-img