Git | 如何優(yōu)♂雅地管理版本

Git

什么是Git搂抒?

Git直接翻譯是「蠢貨,飯桶」朝群,然而卻是由天才開發(fā)出來的燕耿,被全世界最活躍的開發(fā)者使用的版本管理系統(tǒng)〗郑可能是一些黑色幽默吧,就像Geek這個詞一樣淀散。

這里簡單介紹一下右莱,詳情請查閱資料蚜锨,本文主要是要講解一下使用中的一些問題。

Git是一款免費慢蜓、開源的分布式版本控制系統(tǒng)亚再,用于敏捷高效地處理任何或小或大的項目。 Git的讀音為/g?t/晨抡。

Git是一個開源的分布式版本控制系統(tǒng)氛悬,可以有效、高速的處理從很小到非常大的項目版本管理耘柱。 Git 是 Linus Torvalds 為了幫助管理 Linux 內(nèi)核開發(fā)而開發(fā)的一個開放源碼的版本控制軟件如捅。

常用基本命令

git init:初始化
git clone:克隆
git status:查看狀態(tài)
git add:添加
git commit:提交
git pull:拉
git push:推

以上幾個命令比較簡單,略微查下資料即可順利使用调煎。

稍復雜基本命令

git log: 查看所有commit記錄镜遣。

git tag: 在進行客戶端開發(fā)時,常會考慮到版本士袄。使用git tag v1.0,那么就在當前代碼狀態(tài)下新建了一個v1.0的標簽恐疲,使用git tag可以查看當前所有標簽逢捺。使用git checkout v1.1的話,那么就切換到v1.1的代碼狀態(tài)下。

git diff: 比較當前文件和暫存區(qū)的差異笤受,兩次commit之間的差異,兩條分支之間的差異架曹,兩個版本庫之間的差異捞蚂。

git checkout: 切換,checkout可以切換標簽需了,分支跳昼。checkout還能撤銷還沒有add進暫存區(qū)的代碼,比如git checkout readme.md即可撤銷對于md文檔的改動肋乍。

git rm --cached: 移除暫存區(qū)中等待提交的代碼

git remote add origin test: 本地倉庫與遠程名為tes的t倉庫進行關聯(lián)

別名alias

當經(jīng)常使用Git時鹅颊,會在輸入命令上消耗一些時間,尤其是一些比較長的命令墓造,這時候用戶可以自定義別名堪伍,用來簡化命令。比如:
git config --global alias.co checkout
git config --global alias.ci commit
git config --global alias.psm 'push origin master'
git config --global alias.plm 'pull origin master'

下面是這篇文章所要講的重點:團隊協(xié)作觅闽。

分支

  • 什么是分支帝雇?為什么需要分支?

可以設想這么一個情況蛉拙,假如一款產(chǎn)品只有一份代碼尸闸,而需要多人開發(fā),那么每個人都在這一份代碼上隨意修改,那豈不是亂了套吮廉?

這時候我們就需要用到分支苞尝,使一個項目組中的不同開發(fā)者相互獨立,互不干擾宦芦。
在云端宙址,首先需要一份代碼之源,我們稱之為:主分支(master)调卑,猶如青藏高原巴顏喀拉山脈之于黃河抡砂。另外一條重要分支是開發(fā)分支(develop)。

可以概括為:
master:隨時處于準備發(fā)布狀態(tài)
develop:最新的開發(fā)狀態(tài)

  • 初步協(xié)調(diào)團隊

線上一般保留master恬涧,develop兩條分支注益,開發(fā)者首先從master分支pull下代碼,然后在本地基于master再新建本地develop分支气破,然后在develop分支上進行開發(fā)聊浅。

  1. 若在本地完成開發(fā)內(nèi)容,可以將本地develop合并到本地master现使,將本地master推到線上master低匙,切換回本地develop,將本地develop推到線上develop碳锈。(有點拗口顽冶,其實就兩個步驟)
  2. 若在本地只開發(fā)到一半,可以將本地develop推到線上develop售碳。
  • 命令行
  1. git branch test :新建test分支强重。需要提一下的是,所建分支是基于當前分支的贸人。
  2. git checkout test:切換到分支test间景。
  3. git checkout -b test:將上述兩步合為一步。
  4. git push origin test:將本地test分支推送到遠程倉庫艺智。
  5. git branch:查看本地分支列表倘要。
  6. git branch -r:查看遠端分支列表。
  7. git branch -d test:刪除本地分支test十拣。
  8. git branch -D test: 強制刪除本地分支,為什么要強制刪除封拧?因為在一些情況下是無法常規(guī)刪除的,比如:你的test分支本身還存在未合并的代碼夭问,此時想要使用 git branch -d a是無法刪除這個分支的泽西,會出現(xiàn)智能提示。
  9. git push origin :test:刪除遠程分支缰趋。
  10. git checkout develop origin/develop:將遠程分支遷移到本地捧杉。

合并

合并有兩種方式:merge rebase

  • merge

假如在test分支上進行開發(fā)陕见,開發(fā)完成后想要把分支合并到master分支。

  1. 首先需要切換到master分支 git checkout master
  2. git merge test 不出意外就能將test分支合并進來糠溜,但是需要考慮意外情況:發(fā)生版本沖突淳玩。
  • rebase
    rebase和merge有異曲同工之處直撤,使用rebase也能達到合并分支的效果非竿。
    git checkout master
    git rebase test

但是這兩點的差異在哪?這是stormzhang的一個比喻:

rebasemerge 的區(qū)別你們可以理解成有兩個書架谋竖,你需要把兩個書架的書整理到一起去红柱,第一種做法是 merge ,比較粗魯暴力蓖乘,就直接騰出一塊地方把另一個書架的書全部放進 去锤悄,雖然暴力,但是這種做法你可以知道哪些書是來自另一個書架的嘉抒;第二種做法就是 rebase 零聚,他會把兩個書架的書先進行比較,按照購書的時間來給他重新排序些侍,然后重新放置 好隶症,這樣做的好處就是合并之后的書架看起來很有邏輯,但是你很難清晰的知道哪些書來自哪個書架的岗宣。

沖突

兩個人在兩條分支上開發(fā)不同的功能蚂会,然后依次合并到主分支,一般來說兩人各司其職是不會出現(xiàn)問題的耗式。但是有些情況胁住,兩個人對同一塊公共代碼進行了更改,比如工具類刊咳。
此時第一個人可以順利合并master彪见,但是第二個人提交時會出現(xiàn)沖突,需要手動解決沖突才能順利合并娱挨。

在解決沖突問題時余指,我們可以根據(jù)提示的代碼差異進行更改后重新提交。

Stash

假如我們已經(jīng)在一個分支開發(fā)到了一半让蕾,現(xiàn)在需要切換到別的分支去完成一些任務浪规,那么現(xiàn)在當前的代碼如何保留呢?

此時需要用到stash探孝,當然前提是沒有commit笋婿。
首先執(zhí)行 git stash
此時會將還沒有commit的代碼保存到一個暫存區(qū),此時執(zhí)行git status查看顿颅,會發(fā)現(xiàn)當前分支沒有等待提交的代碼缸濒。
git stash list可以 查看暫存區(qū)有多少條記錄(一條分支暫存的所有代碼只會生成一條記錄)

此時可以切換到其他分支,將任務完成,再切回到原來的分支庇配,此時斩跌,如何將未提交的代碼還原?
執(zhí)行git stash apply,然后使用git stash drop將暫存區(qū)的記錄刪除捞慌。
git stash pop相當于將上述兩步變?yōu)橐徊健?/p>

進階協(xié)調(diào)

理想化的狀態(tài)是這樣:比如有三個人開發(fā)一款產(chǎn)品耀鸦,那三個人分別創(chuàng)建三個分支,在各自的分支上完成后合依次合并到master啸澡。而現(xiàn)實情況的干擾因素卻多得多袖订。這時候需要用到分支管理流程GitFlow

  • 一般狀態(tài)下有兩個主要分支:
    master:隨時處于準備發(fā)布狀態(tài)
    develop:最新的開發(fā)狀態(tài)

如果出現(xiàn)了線上版本出現(xiàn)嚴重bug需要緊急修復嗅虏,或者某些功能完成后出現(xiàn)了需求變更洛姑,這時,需要再引入三個輔助分支皮服。

  • feature: 開發(fā)新功能的分支, 基于 develop, 完成后 mergedevelop
  • release: 準備要發(fā)布版本的分支, 用來修復 bug楞艾,基于 develop,完成后 mergedevelopmaster
  • hotfix: 修復 master 上的問題,緊急情況龄广, 等不及 release 版本就必須馬上上線. 基于 master, 完成后 mergemasterdevelop
情景:

假如我們現(xiàn)在的項目有masterdevelop分支

  • 現(xiàn)在我準備開發(fā)一個登錄功能硫眯,B同學準備開發(fā)一個注冊功能,那么我需要基于develop分支新建 git branch feature/login,B同學需要基于develop新建git branch feature/register

  • 比如突然說線上版本的圖片顯示出了bug蜀细,需要緊急修復舟铜,盡快上線,那么需要在master分支下執(zhí)行 git branch hotfix/imgDisplay,修復完成后合并到masterdevelop

  • 如果某一階段開發(fā)的差不多了奠衔,功能都已經(jīng)合并到了develop谆刨,現(xiàn)在需要對develop上的代碼進行一個整體的測試,假如測試通過归斤,可以發(fā)布到正式環(huán)境痊夭,此時可以基于develop新建一個分支git branch release/v1.0

這是一個規(guī)范化的分支管理流程,可能在小團隊的開發(fā)中脏里,有些步驟可以忽略她我,但是我建議還是按照這一套邏輯管理代碼會更為高效。

當然迫横,如果你覺得輸入這些命令很麻煩番舆,尤其是可以將命令行合并為命令塊的情況,你可以使用gitflow[圖片上傳中...(git2.jpg-5e9156-1516778428798-0)]
推出的一套工具矾踱,簡化命令恨狈。開源地址:https://github.com/nvie/gitflow

Git

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市呛讲,隨后出現(xiàn)的幾起案子禾怠,更是在濱河造成了極大的恐慌返奉,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,590評論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件吗氏,死亡現(xiàn)場離奇詭異芽偏,居然都是意外死亡,警方通過查閱死者的電腦和手機弦讽,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,157評論 3 399
  • 文/潘曉璐 我一進店門污尉,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人坦袍,你說我怎么就攤上這事十厢〉忍” “怎么了捂齐?”我有些...
    開封第一講書人閱讀 169,301評論 0 362
  • 文/不壞的土叔 我叫張陵,是天一觀的道長缩抡。 經(jīng)常有香客問我奠宜,道長,這世上最難降的妖魔是什么瞻想? 我笑而不...
    開封第一講書人閱讀 60,078評論 1 300
  • 正文 為了忘掉前任压真,我火速辦了婚禮,結(jié)果婚禮上蘑险,老公的妹妹穿的比我還像新娘滴肿。我一直安慰自己,他們只是感情好佃迄,可當我...
    茶點故事閱讀 69,082評論 6 398
  • 文/花漫 我一把揭開白布泼差。 她就那樣靜靜地躺著,像睡著了一般呵俏。 火紅的嫁衣襯著肌膚如雪堆缘。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,682評論 1 312
  • 那天普碎,我揣著相機與錄音吼肥,去河邊找鬼。 笑死麻车,一個胖子當著我的面吹牛缀皱,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播动猬,決...
    沈念sama閱讀 41,155評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼啤斗,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了枣察?” 一聲冷哼從身側(cè)響起争占,我...
    開封第一講書人閱讀 40,098評論 0 277
  • 序言:老撾萬榮一對情侶失蹤燃逻,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后臂痕,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體伯襟,經(jīng)...
    沈念sama閱讀 46,638評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,701評論 3 342
  • 正文 我和宋清朗相戀三年握童,在試婚紗的時候發(fā)現(xiàn)自己被綠了姆怪。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,852評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡澡绩,死狀恐怖稽揭,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情肥卡,我是刑警寧澤溪掀,帶...
    沈念sama閱讀 36,520評論 5 351
  • 正文 年R本政府宣布,位于F島的核電站步鉴,受9級特大地震影響揪胃,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜氛琢,卻給世界環(huán)境...
    茶點故事閱讀 42,181評論 3 335
  • 文/蒙蒙 一喊递、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧阳似,春花似錦骚勘、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,674評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至挽荡,卻和暖如春藐石,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背定拟。 一陣腳步聲響...
    開封第一講書人閱讀 33,788評論 1 274
  • 我被黑心中介騙來泰國打工于微, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人青自。 一個月前我還...
    沈念sama閱讀 49,279評論 3 379
  • 正文 我出身青樓株依,卻偏偏與公主長得像,于是被迫代替她去往敵國和親延窜。 傳聞我的和親對象是個殘疾皇子恋腕,可洞房花燭夜當晚...
    茶點故事閱讀 45,851評論 2 361

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

  • 今天5點05分起床,尿尿之后計劃起來聽課逆瑞,可是眼皮睜不開荠藤,知道做兩分鐘平板就可治愈伙单,但是還是臥回床上,開始聽課找安...
    于路撿閱讀 216評論 0 0
  • 又是一次哈肖,腸胃炎又發(fā)作了…果然在人過分的追求太多東西吻育,或者貪婪于更多自己得不到的食事物時,上帝就會給這個人...
    _麥克斯_閱讀 246評論 0 0