導(dǎo)讀目錄
1.為什么要用Git版本控制
2.Git文件結(jié)構(gòu)和存儲原理
3.GitFlow分支開發(fā)規(guī)范
4.Git 常見問題和解決方案
5.持續(xù)集成和敏捷開發(fā)
1.為什么要用Git版本控制
當(dāng)前的版本控制系統(tǒng)有以下幾種:
- Git是目前世界上最先進(jìn)的分布式版本控制系統(tǒng)夹攒,使用Git和Gitlab搭建版本控制環(huán)境是現(xiàn)在互聯(lián)網(wǎng)公司最流行的版本控制方式
- SVN TortoiseSVN是一款非常易于使用的跨平臺的 版本控制/版本控制/源代碼控制軟件昂拂。
- HG Mercurial 是一種輕量級分布式版本控制系統(tǒng)单默,采用 Python 語言實現(xiàn),易于學(xué)習(xí)和使用茎匠,擴(kuò)展性強(qiáng)格仲。
- CVS 是版本控制系統(tǒng),是源配置管理(SCM)的重要組成部分诵冒。
SVN存在的缺陷
Git的優(yōu)勢
1.Git把內(nèi)容按元數(shù)據(jù)方式存儲,hash存儲方式, 每一次提交都是一個整個項目的鏡像.
2.每個客戶端的源,都可以作為clone對象.包含所有中心版本庫的元素.
兩者差異
源于linux的一句話, 一切系統(tǒng)皆為文件, svn左邊, git右邊. Git每次提交,都是一個對項目的 完整快照.
[傳送門]svn轉(zhuǎn)Git管理教程
2.Git文件結(jié)構(gòu)和存儲原理
Git的文件結(jié)構(gòu)
當(dāng)在一個新目錄或已有目錄執(zhí)行 git init 時凯肋,Git 會創(chuàng)建一個 .git 目錄。 這個目錄包含了幾乎所有 Git 存儲和操作的對象汽馋。
一切系統(tǒng)都是有文件構(gòu)成. 這些文件管理著 一個項目的版本.
Git存儲結(jié)構(gòu)
Git的文件存儲結(jié)構(gòu), 不恰當(dāng)?shù)念惐萰ava中 hashMap的存儲的(位桶數(shù)組+單向鏈表或紅黑樹) 桶鏈存儲結(jié)構(gòu), 通俗的講: 先用桶用分類規(guī)則.把一堆數(shù)據(jù),裝進(jìn)筒子里,如下圖所示.
Git的存儲方式
文件存儲, 版本越多,存儲信息越大, 運(yùn)行也就越慢.
下圖,是 一次commit產(chǎn)生的一棵樹(一個快照).
只要文件內(nèi)容相同, 那么就是一個blob, (不管他的路徑是否一樣),
Git的一次提交, commit信息會刷新,這次產(chǎn)生變化的文件的hash值,也就是blob,
git使用hash值作為文件名侮东,主要是為了對比差異,只要文件變了豹芯,那么該文件的hash值就會變悄雅,與老版本的文件名就不同,就可以據(jù)此判定有差異铁蹈,這個信息會隨著文件夾向上傳遞宽闲,也就催生了不同的tree包含這些不同的blob。
Emm…沿著思路想下去..
一個文件,修改后,內(nèi)容變化了, 產(chǎn)生兩個blob,
修改次數(shù)越多, blob 越多.內(nèi)存占用越來越大?
git gc 了解一下….
Git 往磁盤保存對象時默認(rèn)使用的格式叫松散對象 (loose object) 格式。Git 時不時地將這些對象打包至一個叫 packfile 的二進(jìn)制文件以節(jié)省空間并提高效率容诬。當(dāng)倉庫中有太多的松散對象娩梨,或是手工調(diào)用 git gc 命令,或推送至遠(yuǎn)程服務(wù)器時览徒,Git 都會這樣做.
為什么Git新建分支速度快?
打開項目Git目錄, 尋找出一個分支,并打開,查看里面的sha-1字符串.
我們可以在分支間隨意切換狈定,并且都是瞬間切換完成。
Git基本命名
Git的基本操作命令吱殉, 在這里不做過多贅述掸冤,本節(jié)會著重講解Git中的兩個疑惑點厘托。
Reset和Revert區(qū)別
git reset
回滾代碼到 某commit點,刪除之前版本(想恢復(fù)到之前某個提交的版本友雳,且那個版本之后提交的版本我們都不要了,就可以用這種方法).
Git revert
如果我們想恢復(fù)之前的某一版本,而不刪除之前版本(該版本不是merge類型铅匹,但是又想保留該目標(biāo)版本后面的版本押赊,記錄下這整個版本變動流程,就可以用這種方法)包斑。
工作區(qū)和暫存區(qū)
add 命令 現(xiàn)在暫時有兩個作用:1 將文件添加到被跟蹤狀態(tài) 2:將文件從工作區(qū)放到暫存區(qū)
Commit 文件流礁,提交到版本庫。
- 倉庫級的配置文件:在倉庫的 .git/.gitconfig罗丰,該配置文件只對所在的倉庫有效神帅。
- 全局配置文件:Mac 系統(tǒng)在 ~/.gitconfig,Windows 系統(tǒng)在 C:\Users<用戶名>.gitconfig萌抵。
- 系統(tǒng)級的配置文件:在 Git 的安裝目錄下(Mac 系統(tǒng)下安裝目錄在 /usr/local/git)的 etc 文件夾中的 gitconfig找御。
明確了為啥要用git了, 那這里就要開始準(zhǔn)備SVN遷移git啦~
明確了為啥要用git了, 那這里就要學(xué)習(xí)git的分支管理和gitflow流程啦~
3.GitFlow分支開發(fā)規(guī)范
主干分支master(為項目發(fā)布的最新版本),
也是用于部署生產(chǎn)環(huán)境的分支,確保master分支穩(wěn)定性
master
分支一般由develop
以及hotfix分支合并绍填,任何時間都不能直接修改代碼
develop(為最新的代碼)
develop
為開發(fā)分支霎桅,始終保持最新完成以及bug修復(fù)后的代碼
一般開發(fā)的新功能時,feature分支都是基于develop
分支下創(chuàng)建的
業(yè)務(wù)分支module
貨運(yùn),調(diào)度 ,等等.
業(yè)務(wù)線module/貨運(yùn)
特性分支feature
開發(fā)新功能時讨永,以develop為基礎(chǔ)創(chuàng)建feature分支
開頭的為特性分支滔驶,例如實驗性且效果不好的代碼變更
可以從develop分支發(fā)起feature分支
代碼必須合并回develop分支
分支命名: feature/
命名規(guī)則:feature/分享功能
、 module/貨運(yùn)_feature/login功能
卿闹、 feature/sonar掃描錯誤修改
release分支
release分支專為 發(fā)布版本而建的分支.也可以叫預(yù)生產(chǎn)環(huán)境.也可以用master分支+tag
方式來代替.
一般從develope分支創(chuàng)建.當(dāng)develop分支上的代碼
已經(jīng)包含了所有將發(fā)布的版本中計劃的功能
揭糕,并且已通過所有測試
時,我們就可以考慮準(zhǔn)備創(chuàng)建release分支.
也就是說, 開發(fā)完成,測試完畢后,準(zhǔn)備發(fā)布版本的分支release/v1.0.0
,
創(chuàng)建后,只允許做小的缺陷修正,以及準(zhǔn)備發(fā)布版本所需的各項說明信息(版本號锻霎、發(fā)布時間,渠道分布等等).確定沒問題合并到master和develop著角,可以刪除分支,后期有需要直接從master分支的tag中找到并checkout為release/xxx
分支,進(jìn)行bug修復(fù).
等發(fā)布成功后, 切記要把將新的release/v1.0.0
的代碼合并到develope中.
其他分支
issue分支:用于項目代碼評審,或者整改gitlab提出的issue. 命名為issue/代碼安全加固
hotfix分支:用于線上bug修復(fù),在特定release分支上創(chuàng)建,完成后需要同時推到 對應(yīng)release 分支,待測試沒有問題后, 推送到develop分支,以及master分支.
開發(fā)迭代思路
普通迭代思路
-->新建項目->創(chuàng)建develope分支,master分支--->需求->在develope分支進(jìn)行開發(fā)->merge其他人代碼-> 完成功能->測試在develope分支進(jìn)行測試->測試結(jié)束->切換到master分支,merge develope代碼->封包,打上tag標(biāo)簽v1.0.0----->下一個需求.
敏捷迭代思路
4.Git 常見問題和解決方案
1. 如何修改git commit的 msg?
不建議修改某個commit的 messge!!!!!!
commit修改,會同時修改掉commitid, 也就意味著這是一次新的提交, 會打亂提交樹的順序.
2. 為什么賬戶名和郵箱名無法修改?
1.local,在.git/config里面,針對當(dāng)前倉庫的配置量窘,git配置默認(rèn)為local級別
git config [--local] user.name 本倉庫的用戶名
git config [--local] user.email 本倉庫的用戶郵箱
2.global雇寇,在個人home目錄下的,針對當(dāng)前系統(tǒng)用戶的倉庫
git config --global user.name 本倉庫的用戶名
git config --global user.email 本倉庫的用戶郵箱
3.system,在git安裝目錄的下,針對當(dāng)前操作系統(tǒng)所有用戶的倉庫。(該級別通常不用于配置用戶信息)
git config --system user.name 本倉庫的用戶名
git config --system user.email 本倉庫的用戶郵箱
3.如何忽略不需要提交的文件?
使用.ignore
文件
.ignore
放到和.git
同級的目錄中.可以自定義規(guī)則
PS:如果之前添加到了git管理, 但是現(xiàn)在想忽略掉怎么辦?
編輯你的.ignore
文件后,執(zhí)行以下命令
git rm -r --cached .
git add .
git commit -am "Remove ignored files"
git push 你的遠(yuǎn)端倉庫
4.糟了, 代碼不小心push到了遠(yuǎn)端倉庫怎么辦?
git revert
你的commitID
//將代碼狀態(tài)撤回到該commitID
之前.
5.同事提交代碼后, 我的分支只想要他的某幾個commit
?
cherry-pick
了解一下.
- 切換到 選擇同事的分支
- 選擇幾個想要的
commit
- 進(jìn)行
cherry-pick
操作
6.提交記錄不小心弄木有了,有木有后悔藥?
git reflog
了解一下, 結(jié)合git rebase
要指向的commitID
7.Idea的Git插件下,別人分支提交代碼,
自己分支merge不到,說別人沒提交代碼?
Git是分布式的,狂點refresh沒用的!!!…
需要重新pull遠(yuǎn)端代碼, 來更新本地倉庫.才會有最新的提交記錄.
8.為什么我merge,或者cherry-pick后的commit記錄找不到了?
Git的commit排序, 是按照時間排序的!!!!!! Commit時間越新,越靠前
還有看 log是否是當(dāng)前branch.
9.其他注意事項
-
git push -f
不能使用. 他會清空之前的commit記錄. - 公共分支
master
和develop
,不能進(jìn)行rebase
操作,原則上只能改自己的分支. - push代碼之前,盡量先pull代碼,將遠(yuǎn)端代碼更新到本地,merge完畢后,運(yùn)行正常后,再進(jìn)行push操作.
- .為了避免代碼沖突, 本地倉庫要及時push 到遠(yuǎn)程gitlab
6.可持續(xù)集成
可持續(xù)集成又叫Continuous integration(CI)
,一種軟件開發(fā)實踐锨侯,即團(tuán)隊開發(fā)成員經(jīng)常集成它們的工作嫩海,通過每個成員每天至少集成一次,也就意味著每天可能會發(fā)生多次集成囚痴。每次集成都通過自動化的構(gòu)建(包括編譯叁怪,發(fā)布,自動化測試)來驗證深滚,從而盡早地發(fā)現(xiàn)集成錯誤奕谭。
有兩種方式
gitlab+Jenkins
gitlab+gitlabCI
生產(chǎn)模型
Jenkins
Jenkins 是一個可擴(kuò)展的持續(xù)集成引擎。
主要功能
- 持續(xù)痴荐、自動地構(gòu)建/測試軟件項目.
-
監(jiān)控一些定時執(zhí)行的任務(wù).
主要可配置項目
- 自定義構(gòu)建參數(shù)
- 執(zhí)行g(shù)radle,maven等項目腳本
- 定時任務(wù)
- 掛載gitlab,sonar等第三方平臺
- 界面高度可定制化
Jenkins業(yè)務(wù)流程
- 項目配置
- 自定義構(gòu)建參數(shù)
- 自定義構(gòu)建log日志輸出
- 查看build日志,錯誤日志
- 目標(biāo)文件生成
- 構(gòu)建完成通知 (釘釘,測試郵件等等)
Jenkins管道任務(wù)
6.其他
常用工具
用Mac, linux, 還是windows,都會有對應(yīng)的Git圖形管理界面, 主要展示idea插件.
- sourcetree
- idea的git插件
- Git命令
- TortoiseGit
以idea為例
如何使用Git進(jìn)行團(tuán)隊CodeReview?
- GitLab設(shè)置保護(hù)分支 (當(dāng)前方式)
- Git + Gerrit結(jié)合(步驟繁瑣)