Git 系列之「什么是 Git」

什么是 Git?

Git 是目前世界上最流行最好用的分布式版本控制系統(tǒng) 。這里面有兩個(gè)重要的概念,分布式和版本控制。

什么是版本控制?

大二了,老師在數(shù)據(jù)結(jié)構(gòu)預(yù)算法課上講自己接了一個(gè)項(xiàng)目,想接觸下真實(shí)項(xiàng)目提前練練手的同學(xué)可以課下聯(lián)系我,有報(bào)酬。一聽說有報(bào)酬,各個(gè)都踴躍報(bào)名,最后老師選了六個(gè)實(shí)力還不錯的同學(xué)加入了自己的團(tuán)隊(duì)。

由于王大仙技術(shù)能力比較出眾,所以被選為組長一職。分析需求,畫 ER 圖,定數(shù)據(jù)庫表,確定項(xiàng)目結(jié)構(gòu)。前前后后忙活了兩個(gè)星期,終于可以動手寫代碼了。王大仙很興奮,終于可以施展下自己的技術(shù)能力了。

第一天,王大仙先在自己電腦創(chuàng)建了一個(gè) maven project,把包創(chuàng)建好,配置文件寫好,確定可以跑起來之后就把空的 project 發(fā)給了其余五個(gè)人。并叮囑他們各司其職,弄好自己負(fù)責(zé)的模塊。

三天后,王大仙想了解了下組員們的開發(fā)進(jìn)度,感覺是時(shí)候做一個(gè)小的測試了。問題是怎么把他們的代碼集成到自己項(xiàng)目這里呢??戳艘幌?,才十五個(gè)類,于是王大仙就一個(gè)一個(gè)的把它們從組員的項(xiàng)目拷貝到自己的項(xiàng)目這里。一運(yùn)行,發(fā)現(xiàn)缺少 jar 包。看日志是王二小做的權(quán)限模塊依賴的 shiro 包沒有導(dǎo)入。于是乎把 shiro 的依賴加入自己的 pom 文件。終于跑起來了,大家都松了一口氣。嗯嗯,效果還不錯,組長面帶微笑的說到。交代了一下接下來四天的任務(wù),大家去大排檔擼串去了。

四天后,又到了合并代碼的時(shí)候了。大仙一看傻眼了,足足差不多有接近一百個(gè)類,而且還分布在不同的包結(jié)構(gòu)中,難道還要一個(gè)一個(gè)復(fù)制嗎??墒且矝]有其他辦法呀。哎,那就來吧。本著我不下地獄誰下地獄的態(tài)度組長開啟了漫漫復(fù)制路。可誰知,那里只是簡單的復(fù)制粘貼呀,張大帥和江小白倆人負(fù)責(zé)的用戶管理模塊里面有很多同名的文件,怎么把兩個(gè)人的代碼弄到一個(gè)文件里呢?又是一段漫漫復(fù)制路啊。王大仙小心翼翼的把江小白的代碼復(fù)制到張大帥的文件里,生怕復(fù)制錯位置,所以每次復(fù)制粘貼時(shí)都要兩邊看看文件名是否一致,看看是否重復(fù)復(fù)制。三個(gè)小時(shí)過去了,終于把所有的代碼都集成到自己項(xiàng)目里面了。運(yùn)氣還不錯,項(xiàng)目居然沒有報(bào)錯,跑起來了,一看效果,大仙很滿意。于是乎,交代了下一周的任務(wù)之后他們又去擼串了。

一周后,看到組員那里密密麻麻的類文件,大仙感覺生不如死。足足有八百多個(gè)類文件。而且有很多個(gè)文件不僅有一個(gè)人在做修改。任憑大仙技術(shù)能力再強(qiáng),在這里也無計(jì)可施啊。只能乖乖的一個(gè)一個(gè)小心翼翼的去復(fù)制粘貼。大仙加班加點(diǎn)熬了兩個(gè)通宵終于把全部文件都搞完了,已經(jīng)過去兩天了。大仙感覺比寫代碼還累。

終于把組員的代碼都集成到自己項(xiàng)目里了,跑一下試試吧。還行,沒啥重大 bug,已經(jīng)連續(xù)通宵兩個(gè)晚上的大仙終于可以回家好好休息了。

休息了一宿,大仙感覺精力充沛,不虧是年輕人,恢復(fù)的就是快。準(zhǔn)備去實(shí)驗(yàn)室大干一場。天不如人愿,來到實(shí)驗(yàn)室打開電腦之后發(fā)現(xiàn)昨晚好好地工程今天打不開了 ,不知道啥原因就連磁盤里面的工程總目錄文件夾都打不開了。那可是我們忙活了半個(gè)月的成果啊。怎么說打不開就打不開了呢?大仙深深的感覺到了絕望。

其他人的代碼還好,自己電腦里面有存檔,可是自己這一個(gè)星期寫的代碼全部都打不開,也就是說要把上周自己寫的代碼再重新寫多一遍。大仙哭暈.jpg。

在大仙補(bǔ)代碼的這兩天,也沒讓組員閑著,讓他們先兩兩合并。合并完之后再兩兩合并,黃天不負(fù)有心人,終于在大仙把代碼補(bǔ)完的同時(shí)組員也把代碼合并完了,就差把自己的代碼合并進(jìn)去就好了。

有了上一次的經(jīng)驗(yàn),這次大仙學(xué)聰明了,先把自己的代碼復(fù)制了一份,取名 myCode.zip。然后每合并一些代碼都會備份一個(gè)新的文件。一天后,大仙電腦硬盤 code 文件夾里面有如下文件:足足有二十個(gè)之多。

myCode.zip
allCode_20180320初稿.zip
allCode_20180320初稿2.zip
...
allCode_20180320定稿.zip
allCode_20180320定稿2版.zip
allCode_20180320定稿終版.zip
allCode_20180320定稿終極版.zip

終于,萬事具備,可以重新測試了。我曹,大仙不盡發(fā)出驚人般的吼叫,發(fā)現(xiàn)一個(gè)新加的功能有嚴(yán)重的 bug。需要用回舊的功能。也就是要把大仙辛辛苦苦加進(jìn)來的功能有 bug 的代碼恢復(fù)到之前沒有 bug 的版本。更可惡的是這個(gè) bug 組員都不承認(rèn)是自己寫的。因?yàn)楫a(chǎn)生 bug 的部分代碼沒有一個(gè)人承認(rèn)是自己寫的。想想自己合并代碼漫漫長路,大仙哭暈再廁所.gif.

大仙不想在自己折騰了,去向老師求救。老師聽了大仙的苦惱之后,甚為驚訝。說到:“你們咋沒用版本控制系統(tǒng)呢?”。版本控制?這是啥東西?都沒聽過呀。于是老師耐心的講解到,首先我先幫你梳理下你遇到的問題哈。

  • 備份文件,防止文件丟失。
  • 文件合并,你需要把其他組員的代碼文件復(fù)制到自己項(xiàng)目里面吧
  • 代碼合并,如果有一個(gè)以上的人操作同一個(gè)文件,要把他們各自的代碼都保留下來。
  • 代碼追蹤。就是要查到這行代碼是哪一個(gè)組員寫的。
  • 代碼還原。當(dāng)發(fā)布新代碼之后如果有 bug,就回退到上一個(gè)版本。

以上這些就是版本控制要解決的問題。所以說,版本控制是一種記錄若干文件內(nèi)容變化,以便將來查閱特定版本修訂情況的系統(tǒng),對于軟件開發(fā)領(lǐng)域來說版本控制是最重要的一環(huán)。

分布式如何理解

這個(gè)分布式要和集中式放在一起理解。

首先先要明白版本庫的概念,你想啊,版本控制系統(tǒng)是如何知道它要控制哪些文件的版本,如何知道誰何時(shí)修改了哪一個(gè)文件哪一個(gè)位置呢?是不是需要把這些信息記錄起來呀。所以需要一個(gè)初始化的操作來告訴它,我要把這個(gè)文件夾作為版本庫,你要負(fù)責(zé)記錄版本變化信息。Git 的語法是這樣子的 git init。當(dāng)你執(zhí)行完這條命令之后會在當(dāng)前目錄多一個(gè) .git 的目錄。這個(gè)目錄里面就記錄了當(dāng)前文件夾里面的所有文件的改動軌跡。如果把 .git 刪除掉了,那當(dāng)前文件夾就不再是版本庫了。之前的版本信息也會丟失。

你可以把版本庫理解為倉庫,版本控制系統(tǒng)理解為倉庫管理員。倉庫管理員肯定知道自己倉庫里面有什么物料吧,知道誰在什么時(shí)候放了什么東西進(jìn)來,同樣也知道誰在什么時(shí)候拿了什么物料出去。有一天倉庫管理員沒有做任何交接的情況下突然離奇失蹤。那么沒有一個(gè)人知道這個(gè)倉庫之前誰在什么時(shí)候加了啥東西過來,又是誰在啥時(shí)候拿了什么東西出去。

集中式的意思就是版本庫是放在中央服務(wù)器的,我們工作的時(shí)候就從中央服務(wù)器拉取文件到自己電腦,等修改完畢之后在推送到中央服務(wù)器。

分布式的意思就是,每個(gè)人的電腦都是一個(gè)版本庫,這樣子,你工作的時(shí)候是不需要聯(lián)網(wǎng)的,可以隨時(shí)的向版本庫中添加文件,也可以將修改推送至版本庫。那如何把合作呢,比如兩個(gè)人同時(shí)修改了文件 A,只需要把各自修改的內(nèi)容推送給對方就可以了「這里需要把對方的倉庫添加為自己的遠(yuǎn)程倉庫」。

但是在實(shí)際使用時(shí),很少在兩人之間的電腦上推送版本庫的修改,因?yàn)轫?xiàng)目組可能有很多人,不可能我改動一下就把修改信息推送給其他所有人吧。所以分布式版本控制系統(tǒng)也會有一個(gè)中央倉庫,通常叫做「遠(yuǎn)程倉庫」。這樣子,當(dāng)你在本地修改完畢之后先提交到自己本地版本庫,然后推送至遠(yuǎn)程倉庫。同事從遠(yuǎn)程倉庫拉取代碼到自己版本庫,就看到你的修改內(nèi)容了。

集中式需要聯(lián)網(wǎng),而且如果中央服務(wù)器宕機(jī)的話真?zhèn)€版本控制信息會全部丟失。
分布式是不需要聯(lián)網(wǎng)的,不怕遠(yuǎn)程倉庫的服務(wù)器宕機(jī)。因?yàn)槊總€(gè)人的電腦都是一個(gè)完整的版本庫。當(dāng)然優(yōu)點(diǎn)不止這一點(diǎn),還有強(qiáng)大的分支管理。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • GIT(分布式版本控制系統(tǒng)) Git是一個(gè)開源的分布式版本控制系統(tǒng),可以有效、高速的處理從很小到非常大的項(xiàng)目版本管...
    困卡閱讀 245評論 0 0
  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 179,036評論 25 709
  • 自貢國際恐龍燈會,迄今已是第二十四屆。有著豐厚文化底蘊(yùn)的自貢燈會,近年來發(fā)展迅猛。全國各地,世界多個(gè)國家都有著自貢...
    映紅曲閱讀 433評論 0 1
  • 聽完萌老師三天的課程,我真的可以用收獲頗豐來說了,每一次聽課都會讓我對自己有一個(gè)更深入的認(rèn)識和對性格領(lǐng)域的知識又...
    未央行者閱讀 183評論 2 1

友情鏈接更多精彩內(nèi)容