為什么要用 Git

一晚吞、git 解決的問題

1. 版本控制

沒有 git 的時候......假如你寫了一篇文章涵叮,要刪除某一個段落,為了防止以后需要找回這個段落挪捕,你需要為這個文件備份。

如果你第一次刪除了段落1争便,第二次修改了段落2级零,第三次添加了段落4,則需要為每一個版本都建立一個備份滞乙。(還有一個辦法是注釋掉修改的代碼奏纪,在下面寫添加的代碼,但是時間久了就弄不清楚了)你的文件可能看上去是這個樣子:

image

版本多了斩启,你想恢復修改前的段落2序调,卻不記得是那個備份,所以你需要一個一個文件去翻閱查找兔簇,非常麻煩发绢。

這時你可能會寫一個說明文檔,文檔中記錄了:副本(1)——刪除段落1垄琐;副本(2)——修改段落2边酒;副本(3)添加段落3...... 有了這些摘要你能很快定位到需要的文件。

可是修改了第112行狸窘,或者是修改了114墩朦、118和119行呢?你不可能有耐心記錄下每個版本修改了哪幾行翻擒,所以這些修改很難定位氓涣,找起來特別費神。

版本管理可以解決以上述所有麻煩(這些麻煩是我在未接觸版本管理時寫代碼真實遇到的)陋气。每次有新的修改劳吠,添加版本說明并提交。從 git log 信息中你可以看到所有版本和版本摘要恩伺,看起來就像下面這樣(這就不用手動備份文件和寫摘要文檔了):

版本 用戶 說明 日期
1 張三 刪除段落1 2017.1.1
2 李四 添加段落4 2017.1.3

對于任意兩個版本赴背,用 git diff 命令,可以比較兩個文件的不同晶渠,這樣就解決了修改定位的問題凰荚。完全自動化,Cool褒脯!

2. 代碼同步

我曾經和同學 H 合作寫一個小插件便瑟,剛開始沒有使用 git 或者 svn,一度覺得自己沒辦法干活了番川。比如我編輯MainServlet.java到涂,他編輯 index.jsp脊框,現(xiàn)在需要運行看效果,我們就要通過 qq 把自己修改的文件傳給對方践啄,然后手動覆蓋浇雹。有時我和他同時修改 index.jsp,就得讓他把他的文件發(fā)給我屿讽,我合并兩人的修改后昭灵,再把合并后的文件發(fā)給他。后來改動多了伐谈,我們也不記得我們修改了哪些東西烂完,完全混亂,于是就在同一臺機器上你敲一會兒诵棵,我嗑瓜子抠蚣,再我敲一會兒,你嗑瓜子履澳,嚴重影響了效率嘶窄。有時老板要檢查我們的進度,或者要幫助我們解決bug奇昙,我們就得將最新的版本打成壓縮包 qq 傳給總監(jiān)护侮。

后來我們用了 SVN敌完,這些麻煩就全沒有了储耐。要同步兩人的進度,只需要一人commit滨溉,另一人checkout什湘,根本不需要自己記改了哪些東西。解決沖突同樣是相對麻煩的事情晦攒,但是先 checkout,修改沖突的地方再提交脯颜,步驟清晰且有詳細記錄哟旗,比之前好了不知道多少。老板需要最新的代碼時栋操,也無需找我們要纠脾,直接從倉庫里下載下來就好啦背率!

3. 分支管理

分支在實際中有什么用呢?假設你準備開發(fā)一個新功能,但是需要兩周才能完成宗兼,第一周你寫了50%的代碼,如果立刻提交宿饱,由于代碼還沒寫完,不完整的代碼庫會導致別人不能干活了壹无。如果等代碼全部寫完再一次提交,又存在丟失每天進度的巨大風險「兴В現(xiàn)在有了分支斗锭,就不用怕了。

二失球、Git 與 SVN比較

1. 分布式與集中式

git 是分布式版本管理系統(tǒng)拒迅,SVN 是集中式版本管理系統(tǒng)。

集中式:

在沒有聯(lián)網的情況下不能 commit 操作她倘。只有中央服務器擁有完整倉庫璧微。

image
分布式:

每臺機器上安裝了同一套 git 程序,所以都能持有完整的倉庫硬梁∏傲颍可以方便的克隆倉庫,倉庫與倉庫之間可以互相同步荧止。

svn 并不能克隆倉庫屹电,只能從倉庫中下載文件,即使你用 TortoiseSVN 創(chuàng)建了一個本地倉庫跃巡,你和中央服務器的倉庫也無法進行關聯(lián)危号。

image
git 分布式為什么比 svn 集中式好?
  1. svn 不聯(lián)網就不能 commit素邪。假設小明公司的中央服務器部署在內網外莲,回家了便無法訪問,但小明周末仍然勤奮地在家寫代碼兔朦。周六晚他想將這一天寫的東西 commit偷线,但是并不能夠。周天他將代碼改出bug來了沽甥,想回退到周六晚的版本声邦,事實殘忍地拒絕了他,并讓他手撕bug摆舟。

  2. 集中式中亥曹,中央服務器掛了,倉庫就掛了恨诱。分布式中媳瞪,掛了一臺機器,還能從另一臺機器恢復倉庫胡野。不過據(jù)最新消息證實材失,有些 svn 的客戶端現(xiàn)在也搞分布式技術,一個倉庫同時存在幾臺服務器上硫豆,一個服務器提交了修改龙巨,幾個服務器自動同步笼呆,但是這仍改不了我們工作的筆記本上沒有倉庫的事實。如果我們筆記本上倉庫也能和遠程同步旨别,等等诗赌,那不就和 git 的模式一模一樣了嗎?瞎折騰啥呢少年秸弛,不如一開始就用 git铭若。

  3. git 中我們可以 commit 到本地倉庫而不 push 到遠程倉庫。假設我的 getDataService.java 只寫了一半递览,仍然會報錯叼屠,這時候用 svn 將修改提交,就會影響到隊友(隊友更新代碼 了以后說臥槽怎么 run 不起來了)绞铃。更可怕的是我修改的是已有的文件镜雨。但是不提交,我又面臨著和小明一樣丟失進度的風險儿捧。在 git 中只 commit 不 push 就能解決這個問題荚坞。在我的第一個實習公司,那時想自己改一改代碼玩菲盾,就自己在本地創(chuàng)建了一個分支颓影,隨便瞎折騰,只要不提交懒鉴,別人完全不知道我干了啥诡挂,不會影響到任何人。

2. 分支管理

git 的分支功能比 SVN 好用得多疗我。

其他版本控制系統(tǒng)如SVN等都有分支管理咆畏,但是用過之后你會發(fā)現(xiàn)南捂,這些版本控制系統(tǒng)創(chuàng)建和切換分支比蝸牛還慢吴裤,簡直讓人無法忍受,結果分支功能成了擺設溺健,大家都不去用麦牺。

SVN 使用分支,一般來說是我們直接手動管理文件夾鞭缭,見 trunk+-branches+-tags 目錄結構的使用剖膳。舉個例子,如果需要基于分支1新建一個分支2岭辣,我們就手動將分支1的文件夾拷貝一份命名為分支2吱晒。如果要切換分支,我們就切換文件夾沦童。類似這些操作仑濒,實際上是將文件夾“視作”分支叹话,用了 move、cd 等操作墩瞳,至于合并分支的 merge 命令驼壶,大概沒什么人敢用吧。

但Git的分支是與眾不同的喉酌,無論創(chuàng)建热凹、切換和刪除分支,Git在1秒鐘之內就能完成泪电!無論你的版本庫是1個文件還是1萬個文件般妙。

3. 權限控制

SVN 可以嚴格控制每個目錄的訪問權限(還有一套很變態(tài)的規(guī)則),git 只能控制每個倉庫分支的權限相速。SVN 可以 checkout 任意子目錄股冗,而 git 只能 clone 某個分支。

實際上和蚪,SVN的目錄權限控制和 checkout 子目錄主要是為了方便了基于trunk+-branches+-tags 結構的開發(fā)≈棺矗現(xiàn)在 git 既然已經有了好用的分支功能,目錄權限控制就沒有那么必要了攒霹。

補充:

  • 在任意目錄checkout怯疤,意味著在任何位置都可能出現(xiàn).svn的隱藏文件夾,這樣對整個工程的代碼產生了污染催束。
  • 也有非要像SVN那樣進行目錄權限管理的時候集峦,見知乎的這個問題:https://www.zhihu.com/question/20216542 在上面 SVN 總算占據(jù)了一點優(yōu)勢。

4. .gitignore 文件

git 可以忽略某些文件的提交抠刺,而SVN沒有這個功能塔淤。

5. 版本號

svn 的版本號是1、2速妖、3......的自然數(shù)高蜂,git 的版本號是一堆哈希碼,看起來非常反人類罕容。 其實 git 這樣設計和它的分布式結構有關备恤,作用是防止版本號沖突。

反例如下:如果 git 用自然數(shù)作為版本號锦秒,小明在本地提交了版本1露泊、2,小剛也在本地提交了版本1旅择、2惭笑,兩個倉庫同事 push 到公司的 gitlab上時,版本號就發(fā)生了沖突。而 svn 倉庫只有一個沉噩,不用與別的倉庫同步铺敌,版本也一定有個提交的先后順序,所以不會發(fā)生沖突屁擅。

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

為什么要先 add 再 commit 呢偿凭?我覺得這是為了命令行的使用方便。有時一天的活兒干完派歌,修復了兩個bug弯囊,所以我要分兩次提交。那么先把第一次要提交的文件 add 到暫存區(qū)胶果,再將暫存區(qū)的所有文件進行commit匾嘱。寫命令行的時候,如果沒有 add 只有commit早抠,就要一口氣寫很多個文件霎烙,很不方便。但是圖形界面不存在這樣的不便蕊连,所以大多數(shù) git 的圖形化操作軟件都把 add 和 commit 合二為一操作悬垃。

當然,暫存區(qū)還有一些更靈活的使用甘苍,只要理解下圖尝蠕,便可以依照你自己的喜好使用。

image
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末载庭,一起剝皮案震驚了整個濱河市看彼,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌囚聚,老刑警劉巖靖榕,帶你破解...
    沈念sama閱讀 222,183評論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異顽铸,居然都是意外死亡茁计,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,850評論 3 399
  • 文/潘曉璐 我一進店門跋破,熙熙樓的掌柜王于貴愁眉苦臉地迎上來簸淀,“玉大人,你說我怎么就攤上這事毒返。” “怎么了舷手?”我有些...
    開封第一講書人閱讀 168,766評論 0 361
  • 文/不壞的土叔 我叫張陵拧簸,是天一觀的道長。 經常有香客問我男窟,道長盆赤,這世上最難降的妖魔是什么贾富? 我笑而不...
    開封第一講書人閱讀 59,854評論 1 299
  • 正文 為了忘掉前任,我火速辦了婚禮牺六,結果婚禮上颤枪,老公的妹妹穿的比我還像新娘。我一直安慰自己淑际,他們只是感情好畏纲,可當我...
    茶點故事閱讀 68,871評論 6 398
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著春缕,像睡著了一般盗胀。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上锄贼,一...
    開封第一講書人閱讀 52,457評論 1 311
  • 那天票灰,我揣著相機與錄音,去河邊找鬼宅荤。 笑死屑迂,一個胖子當著我的面吹牛,可吹牛的內容都是我干的冯键。 我是一名探鬼主播屈糊,決...
    沈念sama閱讀 40,999評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼琼了!你這毒婦竟也來了逻锐?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 39,914評論 0 277
  • 序言:老撾萬榮一對情侶失蹤雕薪,失蹤者是張志新(化名)和其女友劉穎昧诱,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體所袁,經...
    沈念sama閱讀 46,465評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡盏档,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 38,543評論 3 342
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了燥爷。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片蜈亩。...
    茶點故事閱讀 40,675評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖前翎,靈堂內的尸體忽然破棺而出稚配,到底是詐尸還是另有隱情,我是刑警寧澤港华,帶...
    沈念sama閱讀 36,354評論 5 351
  • 正文 年R本政府宣布道川,位于F島的核電站,受9級特大地震影響,放射性物質發(fā)生泄漏冒萄。R本人自食惡果不足惜臊岸,卻給世界環(huán)境...
    茶點故事閱讀 42,029評論 3 335
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望尊流。 院中可真熱鬧帅戒,春花似錦、人聲如沸崖技。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,514評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽响疚。三九已至鄙信,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間忿晕,已是汗流浹背装诡。 一陣腳步聲響...
    開封第一講書人閱讀 33,616評論 1 274
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留践盼,地道東北人鸦采。 一個月前我還...
    沈念sama閱讀 49,091評論 3 378
  • 正文 我出身青樓,卻偏偏與公主長得像咕幻,于是被迫代替她去往敵國和親渔伯。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,685評論 2 360

推薦閱讀更多精彩內容

  • 1. 安裝 Github 查看是否安裝git: $ git config --global user.name "...
    Albert_Sun閱讀 13,665評論 9 163
  • 1.git的安裝 1.1 在Windows上安裝Git msysgit是Windows版的Git肄程,從https:/...
    落魂灬閱讀 12,668評論 4 54
  • 沒有經歷過親人突然而逝的人锣吼,是無法體會那種驟然而至的打擊有多大,2004年十月一日的凌晨蓝厌,在父親去世兩年多后玄叠,我的...
    遠方的家園閱讀 328評論 0 2
  • 查理是一個患有先天性弱智的35歲男子,從童年開始當父母發(fā)現(xiàn)他智力水平低下以后漸漸的失去了照顧他的耐心拓提,后來輾轉被叔...
    lunabird閱讀 291評論 0 0
  • 寫給十七歲的我读恃,我很想像你,能坦率把夢提起代态。 親愛的石頭: 你好寺惫,我是十八歲的你,在六月中旬的凌晨蹦疑,突然想起你西雀,現(xiàn)...
    Petrichor_7閱讀 446評論 0 0