Git存儲原理和敏捷開發(fā)

導(dǎo)讀目錄

  • 1.為什么要用Git版本控制

  • 2.Git文件結(jié)構(gòu)和存儲原理

  • 3.GitFlow分支開發(fā)規(guī)范

  • 4.Git 常見問題和解決方案

  • 5.持續(xù)集成和敏捷開發(fā)

1.為什么要用Git版本控制

當(dāng)前的版本控制系統(tǒng)有以下幾種:

  1. Git是目前世界上最先進(jìn)的分布式版本控制系統(tǒng)夹攒,使用Git和Gitlab搭建版本控制環(huán)境是現(xiàn)在互聯(lián)網(wǎng)公司最流行的版本控制方式
  2. SVN TortoiseSVN是一款非常易于使用的跨平臺的 版本控制/版本控制/源代碼控制軟件昂拂。
  3. HG Mercurial 是一種輕量級分布式版本控制系統(tǒng)单默,采用 Python 語言實現(xiàn),易于學(xué)習(xí)和使用茎匠,擴(kuò)展性強(qiáng)格仲。
  4. CVS 是版本控制系統(tǒng),是源配置管理(SCM)的重要組成部分诵冒。

SVN存在的缺陷

image.png

Git的優(yōu)勢

1.Git把內(nèi)容按元數(shù)據(jù)方式存儲,hash存儲方式, 每一次提交都是一個整個項目的鏡像.

2.每個客戶端的源,都可以作為clone對象.包含所有中心版本庫的元素.

image.png

兩者差異

源于linux的一句話, 一切系統(tǒng)皆為文件, svn左邊, git右邊. Git每次提交,都是一個對項目的 完整快照.

image.png
[傳送門]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)成. 這些文件管理著 一個項目的版本.

image.png

Git存儲結(jié)構(gòu)

Git的文件存儲結(jié)構(gòu), 不恰當(dāng)?shù)念惐萰ava中 hashMap的存儲的(位桶數(shù)組+單向鏈表或紅黑樹) 桶鏈存儲結(jié)構(gòu), 通俗的講: 先用桶用分類規(guī)則.把一堆數(shù)據(jù),裝進(jìn)筒子里,如下圖所示.

image.png

Git的存儲方式

文件存儲, 版本越多,存儲信息越大, 運(yùn)行也就越慢.

下圖,是 一次commit產(chǎn)生的一棵樹(一個快照).

只要文件內(nèi)容相同, 那么就是一個blob, (不管他的路徑是否一樣),

Git的一次提交, commit信息會刷新,這次產(chǎn)生變化的文件的hash值,也就是blob,

git使用hash值作為文件名侮东,主要是為了對比差異,只要文件變了豹芯,那么該文件的hash值就會變悄雅,與老版本的文件名就不同,就可以據(jù)此判定有差異铁蹈,這個信息會隨著文件夾向上傳遞宽闲,也就催生了不同的tree包含這些不同的blob。

image.png

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 都會這樣做.

image.png

為什么Git新建分支速度快?

打開項目Git目錄, 尋找出一個分支,并打開,查看里面的sha-1字符串.

我們可以在分支間隨意切換狈定,并且都是瞬間切換完成。

image.png

Git基本命名

Git的基本操作命令吱殉, 在這里不做過多贅述掸冤,本節(jié)會著重講解Git中的兩個疑惑點厘托。


image.png

Reset和Revert區(qū)別

git reset
回滾代碼到 某commit點,刪除之前版本(想恢復(fù)到之前某個提交的版本友雳,且那個版本之后提交的版本我們都不要了,就可以用這種方法).

image.png

Git revert
如果我們想恢復(fù)之前的某一版本,而不刪除之前版本(該版本不是merge類型铅匹,但是又想保留該目標(biāo)版本后面的版本押赊,記錄下這整個版本變動流程,就可以用這種方法)包斑。

工作區(qū)和暫存區(qū)

add 命令 現(xiàn)在暫時有兩個作用:1 將文件添加到被跟蹤狀態(tài) 2:將文件從工作區(qū)放到暫存區(qū)
Commit 文件流礁,提交到版本庫。

  1. 倉庫級的配置文件:在倉庫的 .git/.gitconfig罗丰,該配置文件只對所在的倉庫有效神帅。
  2. 全局配置文件:Mac 系統(tǒng)在 ~/.gitconfig,Windows 系統(tǒng)在 C:\Users<用戶名>.gitconfig萌抵。
  3. 系統(tǒng)級的配置文件:在 Git 的安裝目錄下(Mac 系統(tǒng)下安裝目錄在 /usr/local/git)的 etc 文件夾中的 gitconfig找御。
image.png

明確了為啥要用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分支.

image.png

開發(fā)迭代思路

普通迭代思路

-->新建項目->創(chuàng)建develope分支,master分支--->需求->在develope分支進(jìn)行開發(fā)->merge其他人代碼-> 完成功能->測試在develope分支進(jìn)行測試->測試結(jié)束->切換到master分支,merge develope代碼->封包,打上tag標(biāo)簽v1.0.0----->下一個需求.

敏捷迭代思路

未命名文件 (1).png

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之前.

image.png

image.png

5.同事提交代碼后, 我的分支只想要他的某幾個commit?

cherry-pick了解一下.

  • 切換到 選擇同事的分支
  • 選擇幾個想要的commit
  • 進(jìn)行cherry-pick操作
image.png
image.png

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記錄.
  • 公共分支 masterdevelop,不能進(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)集成錯誤奕谭。

image.png

有兩種方式

  • gitlab+Jenkins

  • gitlab+gitlabCI

生產(chǎn)模型

image.png

Jenkins

Jenkins 是一個可擴(kuò)展的持續(xù)集成引擎。

主要功能

  • 持續(xù)痴荐、自動地構(gòu)建/測試軟件項目.
  • 監(jiān)控一些定時執(zhí)行的任務(wù).


    image.png

主要可配置項目

  • 自定義構(gòu)建參數(shù)
  • 執(zhí)行g(shù)radle,maven等項目腳本
  • 定時任務(wù)
  • 掛載gitlab,sonar等第三方平臺
  • 界面高度可定制化
image.png

Jenkins業(yè)務(wù)流程

  • 項目配置
  • 自定義構(gòu)建參數(shù)
  • 自定義構(gòu)建log日志輸出
  • 查看build日志,錯誤日志
  • 目標(biāo)文件生成
  • 構(gòu)建完成通知 (釘釘,測試郵件等等)

Jenkins管道任務(wù)

image.png

6.其他

常用工具

用Mac, linux, 還是windows,都會有對應(yīng)的Git圖形管理界面, 主要展示idea插件.

  • sourcetree
  • idea的git插件
  • Git命令
  • TortoiseGit

以idea為例

image.png

如何使用Git進(jìn)行團(tuán)隊CodeReview?

  • GitLab設(shè)置保護(hù)分支 (當(dāng)前方式)
  • Git + Gerrit結(jié)合(步驟繁瑣)
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末血柳,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子生兆,更是在濱河造成了極大的恐慌难捌,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,839評論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件鸦难,死亡現(xiàn)場離奇詭異根吁,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)合蔽,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,543評論 2 382
  • 文/潘曉璐 我一進(jìn)店門击敌,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人拴事,你說我怎么就攤上這事沃斤。” “怎么了挤聘?”我有些...
    開封第一講書人閱讀 153,116評論 0 344
  • 文/不壞的土叔 我叫張陵轰枝,是天一觀的道長。 經(jīng)常有香客問我组去,道長鞍陨,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,371評論 1 279
  • 正文 為了忘掉前任从隆,我火速辦了婚禮诚撵,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘键闺。我一直安慰自己寿烟,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 64,384評論 5 374
  • 文/花漫 我一把揭開白布辛燥。 她就那樣靜靜地躺著筛武,像睡著了一般缝其。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上徘六,一...
    開封第一講書人閱讀 49,111評論 1 285
  • 那天内边,我揣著相機(jī)與錄音,去河邊找鬼待锈。 笑死漠其,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的竿音。 我是一名探鬼主播和屎,決...
    沈念sama閱讀 38,416評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼春瞬!你這毒婦竟也來了柴信?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,053評論 0 259
  • 序言:老撾萬榮一對情侶失蹤快鱼,失蹤者是張志新(化名)和其女友劉穎颠印,沒想到半個月后纲岭,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體抹竹,經(jīng)...
    沈念sama閱讀 43,558評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,007評論 2 325
  • 正文 我和宋清朗相戀三年止潮,在試婚紗的時候發(fā)現(xiàn)自己被綠了窃判。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,117評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡喇闸,死狀恐怖袄琳,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情燃乍,我是刑警寧澤唆樊,帶...
    沈念sama閱讀 33,756評論 4 324
  • 正文 年R本政府宣布,位于F島的核電站刻蟹,受9級特大地震影響逗旁,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜舆瘪,卻給世界環(huán)境...
    茶點故事閱讀 39,324評論 3 307
  • 文/蒙蒙 一片效、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧英古,春花似錦淀衣、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,315評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽蛮浑。三九已至,卻和暖如春只嚣,著一層夾襖步出監(jiān)牢的瞬間陵吸,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,539評論 1 262
  • 我被黑心中介騙來泰國打工介牙, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留壮虫,地道東北人。 一個月前我還...
    沈念sama閱讀 45,578評論 2 355
  • 正文 我出身青樓环础,卻偏偏與公主長得像囚似,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子线得,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,877評論 2 345

推薦閱讀更多精彩內(nèi)容

  • 一饶唤、git 解決的問題 1. 版本控制 沒有 git 的時候......假如你寫了一篇文章,要刪除某一個段落贯钩,為了...
    susu2016閱讀 2,322評論 0 3
  • 簡介 Git是一個開源的分布式版本控制系統(tǒng)募狂,用于敏捷高效地處理任何或小或大的項目。 Git 與常用的版本控制工具 ...
    閩越布衣閱讀 2,735評論 0 18
  • 15分鐘成為 GIT 專家 通過一步一步的實踐來探索 git 內(nèi)部角雷。 Git 可能看起來像一個復(fù)雜的系統(tǒng)祸穷。如果上 ...
    唐先僧閱讀 8,128評論 5 25
  • 前言 在本章中,我們將介紹一個分布式版本控制系統(tǒng)的設(shè)計思路勺三,以及它與集中式版本控制系統(tǒng)的不同之處雷滚。除此之外,我們還...
    香沙小熊閱讀 855評論 0 9
  • 前言 Git使用教程 Git是什么 Git是一個開源的分布式版本控制系統(tǒng)吗坚,用于敏捷高效地處理任何或小或大的項目祈远。 ...
    90后的思維閱讀 896評論 0 0