[TOC]
聊聊Git的使用
一、Git簡介
Git是目前世界上最先進(jìn)的分布式版本控制系統(tǒng)(沒有之一)狰挡。這個人說的——廖雪峰甜癞。
1.1 分布式vs集中式
先說集中式版本控制系統(tǒng),版本庫是集中存放在中央服務(wù)器的抄课,而干活的時候稿黄,用的都是自己的電腦喊衫,所以要先從中央服務(wù)器取得最新的版本,然后開始干活杆怕,干完活了族购,再把自己的活推送給中央服務(wù)器。中央服務(wù)器就好比是一個圖書館陵珍,你要改一本書寝杖,必須先從圖書館借出來,然后回到家自己改互纯,改完了瑟幕,再放回圖書館。
<center><font color="#888888" size=2>圖一:集中式</font></center>
分布式版本控制系統(tǒng)沒有“中央服務(wù)器”留潦,每個人的電腦上都是一個完整的版本庫只盹,這樣,你工作的時候兔院,就不需要聯(lián)網(wǎng)了殖卑,因為版本庫就在你自己的電腦上。既然每個人電腦上都有一個完整的版本庫坊萝,那多個人如何協(xié)作呢孵稽?比方說你在自己電腦上改了文件A,你的同事也在他的電腦上改了文件A十偶,這時菩鲜,你們倆之間只需把各自的修改推送給對方,就可以互相看到對方的修改了扯键。分布式版本控制系統(tǒng)通常也有一臺充當(dāng)“中央服務(wù)器”的電腦睦袖,但這個服務(wù)器的作用僅僅是用來方便“交換”大家的修改。
<center><font color="#888888" size=2>圖二:分布式</font></center>
1.2 Git相對SVN的優(yōu)勢
- Git每個機(jī)器都保存了代碼庫的完整副本荣刑;
- Git 的內(nèi)容完整性要優(yōu)于SVN,Git使用文件的哈希值索引文件而不是文件名伦乔;
- Git的Commit操作不需要聯(lián)網(wǎng)厉亏,速度快、獨立化有利于模塊化開發(fā)烈和;
- Git查看log等日志文件不需要聯(lián)網(wǎng)爱只,速度快;
- Git的分支管理機(jī)制遠(yuǎn)遠(yuǎn)領(lǐng)先于SVN:
- 速度:SVN建立新分支是拷貝出一個當(dāng)前分支的副本招刹,是一個新的完整的目錄恬试,而Git相當(dāng)只拷貝出一個指針因此速度不在一個量級上窝趣;
- 獨立性:新建了SVN分支,則SVN會在遠(yuǎn)端立刻生成一個新的分支训柴,此時團(tuán)隊每個成員均可以獲取到該分支代碼哑舒,而Git可在本地完成所有必要的修改再提交到遠(yuǎn)端,甚至可以在本地合并到主分支再推送到遠(yuǎn)端幻馁;
- 靈活性:譬如SVN在切換分支前洗鸵,必須將代碼推送到遠(yuǎn)端,而Git則既可以提交到本地分支仗嗦,又可以靈活地使用git stash push/pop命令暫存/恢復(fù)工作區(qū)代碼膘滨;
1.3 Git倉庫組成
打開terminal工具,新建一個Git版本庫僅需要兩行命令:
mkdir testgit && cd testgit # 新建工作目錄后進(jìn)入工作目錄
git init # 初始化版本庫
git init
命令執(zhí)行完成后稀拐,會在當(dāng)前工作目錄生成一個.git文件夾火邓,當(dāng)前工作目錄就成為新建版本庫的工作區(qū)(Working Directory),而.git文件夾則保存了git版本管理所必須的文件也就是真正的版本庫所在德撬,版本庫中包含了暫存區(qū)(Index/Stage)铲咨、倉庫區(qū)(Repository)如下圖所示:
<center><font color="#888888" size=2>圖一:工作區(qū)、暫存區(qū)砰逻、倉庫區(qū)</font></center>
打開.git目錄鸣驱,可看到目錄中主要包括,其中index文件對應(yīng)上圖中的stage暫存區(qū)蝠咆,:
- COMMIT_EDITMSG
- config
- description
- HEAD:HEAD指向的快照object的引用
- index:暫存區(qū)(工作區(qū)的修改通過
git add
添加到暫存區(qū)時記錄到index文件踊东,該文件是git倉庫文件系統(tǒng)的索引文件,記錄了工作區(qū)中所有文件的快照object的索引)刚操。若要看看里面有什么內(nèi)容可以通過git ls-files --stage
命令闸翅,打印的內(nèi)容如下:- 第一列:
- 第二列:暫存區(qū)中該文件最近一次快照object的哈希值;
- 第三列:
- 第四列:文件名菊霜;
- [branches]
- [hooks]:
- [info]:
- [logs]:本地日志
- [objects]:版本庫整個生命周期內(nèi)生成的所有快照object(區(qū)分快照和備份)坚冀。若要看看里面有什么內(nèi)容可以通過
git cat-file -p <object hash>
,其主要內(nèi)容包括了- tree:工作目錄的快照object(tree)
- parent:上一次提交的快照object(blob)鉴逞,合并的節(jié)點會有兩個parent
- author:作者+郵箱+時間戳
- committer:提交者+郵箱+時間戳
- commit message:提交時
-m
指定的提交日志
- [refs]:
- stash:指向stash棧的快照object的引用
- [heads]:指向所有本地版本庫的分支快照object的引用
- [remotes]:指向所有遠(yuǎn)程版本庫的分支快照object的引用
- [tags]:指向所有tag的快照object的引用
至此记某,上文已經(jīng)提到了諸多關(guān)于Git的概念如工作區(qū)、暫存區(qū)构捡、倉庫區(qū)液南、HEAD引用、分支等名詞勾徽,這里先不作深究滑凉,后文中具體使用時自然可以很好的理解。
二、Hello Git
該部分介紹git的基本使用畅姊。
2.1 添加并提交修改
上一部分咒钟,我們新建了一個testgit版本庫,現(xiàn)在我們往版本庫中加入文件:
vim readme.md # 在vim中輸入Hello git!后使用`:wq`命令保存并退出
# 其他編輯文件命令
# rm -rvf <file or directory> # 該刪除命令十分強(qiáng)力需謹(jǐn)慎使用
# mv <file or directory> <file or directory> # 移動或重命名
# mkdir <directory> # 新建文件夾
# touch <directory> # 新建文件
可以看到目錄中增加了readme.md文本文件若未,現(xiàn)在我們查看一下版本庫的變更:
git status
更具體的文件內(nèi)容的變更朱嘴,用diff命令查看,使用例如git diff > ~/Desktop/diff-out.txt
命令可以將diff內(nèi)容輸出到指定文本文件陨瘩。一般指向當(dāng)前分支頂部的HEAD
指針腕够,在diff命令中可以當(dāng)作<commit id>使用,表示HEAD指向的分支的最近一次提交舌劳,HEAD~3
是指HEAD指向的分支的最近3次提交提交帚湘,HEAD^
則是HEAD指向的分支的最近一次提交的上一次提交:
git diff <file or directory> # 比較工作區(qū)與暫存區(qū)
git diff --cached <file or directory> # 比較暫存區(qū)與HEAD
git diff <commit id> <file or directory> # 比較工作區(qū)與指定commit
git diff --cached <commit id> <file or directory> # 比較暫存區(qū)與指定commit
git diff <commit id> <commit id> # 比較兩次提交,注意第一個<commit id>一定要早于第二個<commit id>甚淡,否則
可以看到Git追蹤到的工作區(qū)變動大诸,然后將工作區(qū)變動添加到暫存區(qū):
git add <file or directory> #支持通配符*(任意多個字符)、?(任意一個字符)
執(zhí)行git add
命令時贯卦,git對指定的文件和目錄生成快照object保存到objects文件夾并記錄到暫存區(qū)资柔。先暫存后提交的好處是可以將生成文件快照object的性能負(fù)載分散到各次add操作中,在下面Commit提交時僅需對暫存區(qū)中的內(nèi)容撵割,生成提交的哈希值(快照object文件路徑)贿堰、提交的log message(提交日志)、并將暫存區(qū)中的快照object拷貝到objects文件夾特定目錄(根據(jù)上面的哈希值)中生成一次提交即可啡彬。提交的命令如下:
git commit <file or directory> -m "<commit message>" # 提交暫存區(qū)內(nèi)容
git commit -a -m <file or directory> -m "<commit message>" # 將指定文件或目錄羹与,無論有沒有追加到暫存區(qū),均生成快照并提交
git commit --amend <file or directory> # 也叫追加提交庶灿,它可以在不增加一個新的commit id的情況下將新修改的代碼追加到前一次的<commit id>中
2.2 修改撤銷
2.2.1 Git支持的撤銷操作
從添加文件纵搁、編輯文件、add往踢、commit整個本地的管理代碼文件的過程腾誉,用戶有三次“反悔”的機(jī)會,分別是工作區(qū)修改撤銷峻呕、暫存區(qū)修改撤銷利职、提交回滾。
- 工作區(qū)撤銷:
增刪改工作區(qū)的文件瘦癌,git可以追蹤到工作區(qū)修改的內(nèi)容(工作區(qū)與暫存區(qū)的差異)眼耀,由上文可知可以通過git status
命令查看修改的文件及目錄列表,通過git diff
可以查看工作區(qū)的具體修改內(nèi)容佩憾,此時代碼仍在工作區(qū),若想撤銷工作區(qū)的修改,可以使用git checkout
系列命令實現(xiàn):
git checkout -- <file or directory> # 將工作區(qū)中文件或目錄恢復(fù)到暫存區(qū)所記錄的對應(yīng)文件或目錄的狀態(tài)妄帘,其中“--”符號可以省略
- 暫存區(qū)撤銷:
若文件已經(jīng)添加到暫存區(qū)楞黄,可以分兩步撤銷。先將暫存區(qū)中的代碼恢復(fù)到工作區(qū)抡驼,然后再用上面的方法撤銷工作區(qū)的修改鬼廓。將暫存區(qū)的代碼恢復(fù)到工作區(qū)的命令是
git reset HEAD <file or directory>
-
版本回滾:
若文件已經(jīng)提交并生成一個新的commit提交,撤銷提交的操作也叫版本回滾致盟,版本回滾的原理可以看以下兩張圖示碎税,實際上就是將HEAD指針指向之前的版本,然后根據(jù)需要處理工作區(qū)馏锡、暫存區(qū)中的內(nèi)容
<center><font color="#888888" size=2>圖一:HEAD初始指向</font></center>
<center><font color="#888888" size=2>圖二:版本回滾后的HEAD指向</font></center>
注意:
git checkout
和git reset
的區(qū)別是雷蹂,前者是直接把HEAD指針指向指定的節(jié)點,當(dāng)前的分支的指針仍然指向分支頂部節(jié)點杯道,HEAD指針不是指向某個分支的指針匪煌,此時處于detached state,一般不在這種狀態(tài)下開發(fā)代碼只做查看党巾;后者是把分支的指針指向指定的節(jié)點萎庭,同時HEAD指針也指向分支的指針。
2.2.2 版本回滾命令詳解
版本回滾同樣通過reset
系列命令實現(xiàn)齿拂,版本回滾有三種方式--soft
驳规、--mixed
、--hard
署海,默認(rèn)是--mixed
方式吗购。回滾命令如下所示:
git reset --soft <file or directory> # HEAD從源commit指向回滾版本commit叹侄,原暫存區(qū)及工作區(qū)的修改集不變巩搏,回滾版本commit到源commit所做的修改集恢復(fù)到“暫存區(qū)”中;
git reset --mixed <file or directory> # HEAD從源commit指向回滾版本commit趾代,原暫存區(qū)中的修改集回退到工作區(qū)中贯底,原工作區(qū)中的修改集不變,回滾版本commit到源commit所做的修改集恢復(fù)到“工作區(qū)”中撒强;
git reset --hard <file or directory> # HEAD從源commit指向回滾版本commit禽捆,丟棄原暫存區(qū)與工作區(qū)中的修改集;
<center><font color="#888888" size=2>圖一:初始化倉庫</font></center>
<center><font color="#888888" size=2>圖二:使用soft回滾選項</font></center>
<center><font color="#888888" size=2>圖三:使用mixed回滾選項</font></center>
<center><font color="#888888" size=2>圖四:使用hard回滾選項</font></center>
版本回滾還可以使用git revert
命令飘哨,與git reset
的區(qū)別是胚想,使用git reset
回滾是直接改變HEAD指針的指向,而git revert
則是將代碼恢復(fù)到指定節(jié)點的狀態(tài)芽隆,并生成一個新的提交把HEAD指向該提交浊服。且git revert
不可以針對單文件回滾统屈。前者版本樹丟棄了回滾目標(biāo)節(jié)點之后的修改(實際上只要記住版本號還是可以檢索到被丟棄的節(jié)點),后者保留牙躺。
三愁憔、Git分支
分支是Git的精髓所在,其最大的特點就是快孽拷。分支的概念可以用一個成語形容殊途同歸吨掌。其意義在于分支上的開發(fā)不會受到其他分支的開發(fā)代碼的影響,而且能夠自由控制在何時將開發(fā)代碼提交到主干版本脓恕,同樣也能自由合并其他分支的代碼膜宋。
試想當(dāng)我們接到多個新需求,這些需求下個版本可能只上線其中一部分炼幔,若直接在master分支中開發(fā)顯然是不合理秋茫,我們要么需要在上線前加上臨時的功能屏蔽代碼,或者先開發(fā)下個版本發(fā)布的功能 而在下個版本正式發(fā)布后才啟動其他功能的開發(fā)江掩,前者容易出現(xiàn)屏蔽的疏漏学辱、后者可能導(dǎo)致開發(fā)資源分配不合理。分支能夠很好地解決上述的問題环形,我們?yōu)樾枨箝_辟新的分支策泣,然后在該需求的分支上開發(fā),僅當(dāng)功能在本地測試通過后再合并到master提交測試抬吟,使用分支的一般操作如下:
一萨咕、創(chuàng)建分支前,倉庫一般有一個默認(rèn)的master分支火本,當(dāng)前的HEAD指針一般指向master分支的頂端危队,如下圖所示,
二钙畔、通過git branch
命令創(chuàng)建dev分支茫陆,此時HEAD指針仍指向master分支,再通過git checkout
命令檢出到dev分支擎析,此時HEAD指針轉(zhuǎn)而指向dev分支簿盅,檢出dev分支后如下圖所示
git branch <branch name>
三、在dev分支上完成開發(fā)并提交后揍魂,先檢出分支到master桨醋,此時HEAD指針指回master分支,然后使用git merge
命令將dev分支合并到master分支:
git checkout master
git merge dev
若提示存在沖突(conflict)现斋,按以下步驟解決:
先
git status
查看both modify的文件然后在文件中搜索“>>>>>”或“<<<<<”或“=====”喜最,根據(jù)實際需求選擇代碼是全部保留、或是只保留其中一個分支庄蹋、或者重新編寫沖突部分的邏輯的解決方法瞬内,強(qiáng)烈反對在沒弄清代碼邏輯之前迷雪,直接使用自己分支的代碼 或保留雙方代碼來解決沖突;
完成修改后提交代碼遂鹊,使用命令
git commit -m "<commit message>"
振乏。注意出現(xiàn)沖突時不能部分提交,只能全量提交秉扑;
四、通過git branch
命令刪除dev分支调限,刪除dev分支時當(dāng)前分支一定不能是dev舟陆,否則不能刪除。注意刪除分支的操作最好是在需求發(fā)布之后耻矮,在需要代碼回滾時秦躯,有原分支的情況下會有更多可選的解決方案
git branch -d <branch name> # 若有代碼未合并會先報錯,此時確認(rèn)代碼可丟棄后用git branch -D <branch name>可強(qiáng)制刪除分支
注意:分支合并有兩種方式no-fast-forward和fast-forward裆装,其區(qū)別是
--no-ff
生成合并Commit日志并保留原分支的提交時間線踱承;而--ff
直接將目標(biāo)分支的提交并入主分支的時間線。默認(rèn)是fast-forward哨免。兩者區(qū)別如下圖所示
四茎活、Git實用舉例
4.1 常用命令
- 牛逼的查看日志命令:
git log --oneline # 只打印短版本號和日志
git log -p # 打印具體變更內(nèi)容
git log --stat # 打印變更文件列表
git log --committer <committer> # 只打印由某人提交的代碼
git log --grep "<commit message keyword>" # 根據(jù)提交的message關(guān)鍵字搜索日志
git log --before "<date>" # 只打印<date>之前的日志,例如git log --before "2017-10-10 12:00:00"
git log --after "<date>" # 只打印<date>之后的日志
git log --graph # 顯示ASCII圖形表示的分支合并歷史
git log -G "<content keyword>" # 根據(jù)提交的內(nèi)容搜索琢唾,由于搜索范圍較大因此速度一般會比較慢
git log --no-merges # 過濾掉合并日志
git log --first-parent # 過濾掉其他分支上提交的日志只顯示其合并日志
git log > <file path> # 輸出日志內(nèi)容到文件
- 本地分支推送到遠(yuǎn)端:
git push --set-upstream origin <branch name>
- 刪除遠(yuǎn)程分支:
git push origin --delete <branch name>
- 刪除本地緩存的已刪除的遠(yuǎn)程分支:
git remote update # 若遠(yuǎn)端創(chuàng)建分支后载荔,在本地創(chuàng)建遠(yuǎn)程追蹤分支
git remote prune origin --dry-run # 查看哪些分支需要清理
git remote prune origin # 清理失效分支
單文件版本回滾:(見前文,具體push時可能需要加
--force
)全量版本回滾:(見前文采桃,具體push時可能需要加
--force
懒熙,若合并分支后解決沖突的過程中又想放棄剛剛的合并可使用命令git merge --abort
撤銷上一次合并操作)如果本地已經(jīng)修改了一些文件,然后由于某些需求必須先合并另外一個分支普办,而此時又不想生成一次新的提交工扎,可以將代碼暫存到暫存棧,待合并完成后再從暫存棧推出(這種情況下衔蹲,先生成一個提交后續(xù)再用
git commit --amend
追加提交也是可以的):
git stash push # 將修改內(nèi)容推入暫存棧
git status # 當(dāng)前工作區(qū)是否clean
git merge master # 完成合并分支肢娘、解決沖突等操作
git stash pop # 推出修改內(nèi)容
指定版本庫忽略文件:使用.gitignore文件指定
遠(yuǎn)程相關(guān)命令:
git remote get-url origin # 獲取git遠(yuǎn)程倉庫的地址
git remote set-url origin <git-url> # 設(shè)置git遠(yuǎn)程倉庫的地址
4.2 結(jié)合實際場景
4.2.1 場景1:上線當(dāng)天版本回退
實際開發(fā)中有時會出現(xiàn)原先規(guī)劃在下個版本上線的需求,延期到后續(xù)的版本再上線踪危,而此時代碼已經(jīng)提交的master分支蔬浙。遇到這種情況該如何解決呢?
方法一:若功能的入口非常明確贞远,可以用少量的代碼屏蔽畴博,則增加暫時屏蔽的代碼(可選擇#if 0預(yù)編譯指令、#ifdef/#ifndef DEBUG預(yù)編譯指令蓝仲、注釋代碼等任意一種方法)俱病,注意最好打上// TODO:
待辦事件注釋以備忘官疲;
方法二:若需求提交節(jié)點離當(dāng)前HEAD節(jié)點很近,則參照上文使用全量代碼版本回退的方法進(jìn)行回退亮隙,注意在需求上線以前一定要保留其對應(yīng)的feature分支途凫,這樣即使master分支代碼回滾后,還可以很容易地找回代碼溢吻;
方法三:當(dāng)需求分支涉及的文件比較少维费,其獨立于其他需求,則參照上文使用部分代碼版本回退的方法進(jìn)行回退促王;
以上涉及版本回滾的操作犀盟,一般需要以遵循以下規(guī)則:
- 盡量保持分支獨立,新建分支后盡量不合并其他分支代碼蝇狼,包括master分支阅畴;
- 使用
--amend
選項提交,減少不必要的日志迅耘; - 重視
-m
字段的書寫贱枣,有利于日志搜索; - 合并代碼時最好使用
--no-ff
選項颤专; - 對分支修改了哪些文件需要了然于心纽哥,至少要可以通過靈活使用log命令查看;
下面以最近一次升級的智能組網(wǎng)增加字段的需求上線當(dāng)天版本回退的場景為例血公。該需求的開發(fā)的具體情況是:1、智能組網(wǎng)需求是分期交付且前后經(jīng)過兩人開發(fā)摔笤,三期的擴(kuò)展方式是拷貝了二期的一個副本然后編輯垦写,而由于系統(tǒng)中還存在一些遺留的二期工單吕世,因此二期的頁面也沒有廢棄梯投,因此本次開發(fā)將二期三期頁面整合為一個文件,避免一個功能需兩處改動的麻煩分蓖;2尔艇、開發(fā)過程中有反饋智能組網(wǎng)模塊的問題,自測中也有發(fā)現(xiàn)一些漏洞终娃,直接在新整合頁面中解決(對舊文件為何出現(xiàn)此種情況不太清楚)蒸甜;3、頁面中的XIB文件有改動辉巡。針對以上情況蕊退,制定的回滾策略是:1、回退XIB文件(本場景中XIB文件的布局改動較大)痢甘;2茉贡、保留.h腔丧、.m文件的整合邏輯(保留解決遺留Bug的代碼)作烟,用//TODO:
注釋暫時屏蔽新功能邏輯拿撩。
4.2.1.1 XIB文件版本回退;
- 切到智能組網(wǎng)分支
git checkout dev-1212-智能組網(wǎng)業(yè)務(wù)服開接口增加字段`
- 合并master上的修改影暴;
git merge master
- 查看XIB提交日志
git log --online GDWWNOP/家寬開通/工單詳情/待處理信息/智能組網(wǎng)/二期/View/GDIntelNetInstallInfoSectionCell.xib`型宙,
輸出以下內(nèi)容:
aae2ae42 1伦吠、智能組網(wǎng)業(yè)務(wù)服開接口增加字段:上門測試及整改增加界面圖片框毛仪、剩余具體字段的處理,2腺逛、智能組網(wǎng)二期三期整合(yanyongcai)
bb753795 智能組網(wǎng)增加字段(chenhuijin)
c1a01372 智能組網(wǎng)增加字段(chenhuijin)
fabc49ea 家寬開通虛擬文件夾創(chuàng)建(liupengcheng)
- 回退XIB文件
git reset bb753795 GDWWNOP/家寬開通/工單詳情/待處理信息/智能組網(wǎng)/二期/View/GDIntelNetInstallInfoSectionCell.xib`
執(zhí)行
git status
屉来,查看到工作區(qū)中有本地修改,此時運(yùn)行Target得到的結(jié)果跟回滾前是一樣的茂契,原因是使用缺省的--mixed
版本回滾所需修改在暫存區(qū)中掉冶,回滾版本后續(xù)的修改在工作區(qū)中脐雪,所以彼此抵消了战秋;丟棄工作區(qū)中的本地修改
git checkout GDWWNOP/家寬開通/工單詳情/待處理信息/智能組網(wǎng)/二期/View/GDIntelNetInstallInfoSectionCell.xib`
4.2.1.2 Controller文件使用TODO注釋屏蔽;
修改GDJKKTIntelNetVisitTestController.m 文件癣蟋,注釋添加字段相關(guān)內(nèi)容并添加“//TODO: 屏蔽智能組網(wǎng)增加字段” 的注釋疯搅;
修改GDJKKTLightChangeController.m 文件幔欧,注釋添加字段相關(guān)內(nèi)容并添加“//TODO: 屏蔽智能組網(wǎng)增加字段” 的注釋丽声;
提交回退及修改恒序,生成的提交號為(a9978564):
git add .
git commit -m "智能組網(wǎng)業(yè)務(wù)服開接口增加字段:回退XIB,并屏蔽GDJKKTIntelNetVisitTestController.m滋饲、GDJKKTLightChangeController.m中的相關(guān)代碼"
git checkout master && git merge dev-1212-智能組網(wǎng)業(yè)務(wù)服開接口增加字段
至此完成版本回退屠缭,可提交代碼發(fā)布版本崭参。
4.2.1.3 恢復(fù)所需的操作
由于需求是延期上線,并不是永久廢棄新功能代碼铐殃,因此我們需要在智能組網(wǎng)分支中將之前的回滾和修改再恢復(fù)原樣跨新。此時直接使用git reset --hard
全量回滾到合并前的版本是不可行的域帐,因為該命令不會生成日志肖揣,而是直接把HEAD指針往回移動,因此合并到master分支后羊异,上一部分的回滾提交仍然是位于智能組網(wǎng)分支的HEAD指針之后球化,因此合并智能組網(wǎng)分支不會對master產(chǎn)生任何作用瓦糟。而使用git reset <file or directory>
命令菩浙,會在智能組網(wǎng)分支生成一個新的提交劲蜻,這個提交是在回滾節(jié)點之后考余,因此合并智能組網(wǎng)分支恢復(fù)操作同樣能作用到master分支楚堤。
- 檢出到智能組網(wǎng)分支
git checkout dev-1212-智能組網(wǎng)業(yè)務(wù)服開接口增加字段
- 回滾文件身冬,此時回滾所作修改保存在暫存區(qū),回滾版本后續(xù)的修改保存在工作
git reset 2c20de30 GDWWNOP/家寬開通/工單詳情/待處理信息/智能組網(wǎng)/二期/View/GDIntelNetInstallInfoSectionCell.xib GDWWNOP/家寬開通/工單詳情/待處理信息/智能組網(wǎng)/GDJKKTIntelNetVisitTestController.m GDWWNOP/家寬開通/工單詳情/光功率整改/質(zhì)檢整改/GDJKKTLightChangeController.m
- 廢棄工作區(qū)中回滾版本后續(xù)的修改
git checkout GDWWNOP/家寬開通/工單詳情/待 處理信息/智能組網(wǎng)/二期/View/GDIntelNetInstallInfoSectionCell.xib GDWWNOP/家寬開通/工單詳情/待處理信息/智能組網(wǎng)/GDJKKTIntelNetVisitTestController.m GDWWNOP/家寬開通/工單詳情/光功率整改/質(zhì)檢整改/GDJKKTLightChangeController.m
- 全量提交代碼
git commit -m "智能組網(wǎng)業(yè)務(wù)服開接口增加字 段:恢復(fù)增加字段"
至此,到該需求上線時,再將dev-1212-智能組網(wǎng)業(yè)務(wù)服開接口增加字段
分支茁影,合并回master
即可募闲。
五蝇更、Git遠(yuǎn)程倉庫搭建
5.1 利用Docker在MacOS上運(yùn)行Gitlab服務(wù)器
安裝Docker 注意下載前必須注冊Docker賬號呼盆,注冊過程中引用到的i'm not a robot插件必須翻墻才能使用访圃。下載圖形界面客戶端Kitematic可以更方便地使用Docker腿时,接下來的步驟都是使用Docker實現(xiàn);
-
下載gitlab-ce鏡像
docker pull gitlab/gitlab-ce
-
運(yùn)行g(shù)itlab實例
GITLAB_HOME=`pwd`/data/gitlab \ docker run -d \ --hostname gitlab \ --publish 8443:443 --publish 80:80 --publish 2222:22 \ --name gitlab \ --restart always \ --volume $GITLAB_HOME/config:/etc/gitlab \ --volume $GITLAB_HOME/logs:/var/log/gitlab \ --volume $GITLAB_HOME/data:/var/opt/gitlab \ gitlab/gitlab-ce
-
用Docker配置gitlab-ce實例格了,先配置郵箱
docker exec -t -i gitlab vim /etc/gitlab/gitlab.rb
用
/gitlab_rails['smtp_enable']
命令搜索到目標(biāo)行盛末,完成后:wq
命令保存退出悄但,該配置文件并不是在系統(tǒng)的/etc目錄下石抡,而是在Docker的gitlab-ce容器中啰扛。以163郵箱為例侠讯。注意xxxx@163.com
代表用戶名,即郵箱地址膜眠,而xxxxpassword
不是郵箱的登陸密碼而是網(wǎng)易郵箱的客戶端授權(quán)密碼, 再網(wǎng)易郵箱web頁面的設(shè)置-POP3/SMTP/IMAP-客戶端授權(quán)密碼
查看宵膨。gitlab_rails['smtp_enable'] = true gitlab_rails['smtp_address'] = "smtp.163.com" gitlab_rails['smtp_port'] = 25 gitlab_rails['smtp_user_name'] = "xxxx@163.com" gitlab_rails['smtp_password'] = "xxxxpassword" gitlab_rails['smtp_domain'] = "163.com" gitlab_rails['smtp_authentication'] = "login" gitlab_rails['smtp_enable_starttls_auto'] = false gitlab_rails['smtp_openssl_verify_mode'] = "peer" gitlab_rails['gitlab_email_from'] = "xxxx@163.com" user["git_user_email"] = "xxxx@163.com"
-
配置gitlab外部訪問url辟躏,這個必須配置,否則默認(rèn)以容器的主機(jī)名作為URL会涎,剛開始由于做了端口映射80->8080, 因此設(shè)置為
external_url "http://192.168.0.1:8080"
后來發(fā)現(xiàn)external_url只能配置ip或者域名末秃,不能有端口练慕,否則不能啟動技掏。于是只能把端口設(shè)置為80->80哑梳,然后external_url設(shè)置為:
external_url "http://192.168.0.1"
-
重啟gitlab
docker exec -t -i gitlab vim /etc/gitlab/gitlab.rb
六鸠真、總結(jié)
Git倉庫使用的不僅僅在于代碼管理弧哎,如果合理地利用起Gitlab強(qiáng)大的鉤子程序稚虎,可以使項目實現(xiàn)持續(xù)集成蠢终、自動化測試(單元測試)以及自動化打包發(fā)布等等寻拂,可以大大提高開發(fā)效率。
參考文獻(xiàn):
[1] Git教程-廖雪峰的官方網(wǎng)站
[2] 詳細(xì)透徹解讀Git與SVN的區(qū)別
[3] Git Reference