聊聊Git終端命令

[TOC]

聊聊Git的使用

一、Git簡介

Git是目前世界上最先進(jìn)的分布式版本控制系統(tǒng)(沒有之一)狰挡。這個人說的——廖雪峰甜癞。

1.1 分布式vs集中式

先說集中式版本控制系統(tǒng),版本庫是集中存放在中央服務(wù)器的抄课,而干活的時候稿黄,用的都是自己的電腦喊衫,所以要先從中央服務(wù)器取得最新的版本,然后開始干活杆怕,干完活了族购,再把自己的活推送給中央服務(wù)器。中央服務(wù)器就好比是一個圖書館陵珍,你要改一本書寝杖,必須先從圖書館借出來,然后回到家自己改互纯,改完了瑟幕,再放回圖書館。


集中式版本管理-c400

<center><font color="#888888" size=2>圖一:集中式</font></center>


分布式版本控制系統(tǒng)沒有“中央服務(wù)器”留潦,每個人的電腦上都是一個完整的版本庫只盹,這樣,你工作的時候兔院,就不需要聯(lián)網(wǎng)了殖卑,因為版本庫就在你自己的電腦上。既然每個人電腦上都有一個完整的版本庫坊萝,那多個人如何協(xié)作呢孵稽?比方說你在自己電腦上改了文件A,你的同事也在他的電腦上改了文件A十偶,這時菩鲜,你們倆之間只需把各自的修改推送給對方,就可以互相看到對方的修改了扯键。分布式版本控制系統(tǒng)通常也有一臺充當(dāng)“中央服務(wù)器”的電腦睦袖,但這個服務(wù)器的作用僅僅是用來方便“交換”大家的修改。


分布式式版本管理-c400

<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)如下圖所示:

Git倉庫結(jié)構(gòu)-c400

<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)容


    回滾前-c250

<center><font color="#888888" size=2>圖一:HEAD初始指向</font></center>


回滾后-c250

<center><font color="#888888" size=2>圖二:版本回滾后的HEAD指向</font></center>


注意:git checkoutgit 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ū)中的修改集;
源.jpg-c600

<center><font color="#888888" size=2>圖一:初始化倉庫</font></center>


soft.jpg-c600

<center><font color="#888888" size=2>圖二:使用soft回滾選項</font></center>


mixed.jpg-c600

<center><font color="#888888" size=2>圖三:使用mixed回滾選項</font></center>


hard.jpg-c600

<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分支的頂端危队,如下圖所示,


初始-c

二钙畔、通過git branch命令創(chuàng)建dev分支茫陆,此時HEAD指針仍指向master分支,再通過git checkout命令檢出到dev分支擎析,此時HEAD指針轉(zhuǎn)而指向dev分支簿盅,檢出dev分支后如下圖所示

git branch <branch name>
創(chuàng)建并檢出到dev分支-c

三、在dev分支上完成開發(fā)并提交后揍魂,先檢出分支到master桨醋,此時HEAD指針指回master分支,然后使用git merge命令將dev分支合并到master分支:

git checkout master
git merge dev
在dev分支上開發(fā)并提交-c
合并dev分支到master分支-c

若提示存在沖突(conflict)现斋,按以下步驟解決:

  1. git status查看both modify的文件

  2. 然后在文件中搜索“>>>>>”或“<<<<<”或“=====”喜最,根據(jù)實際需求選擇代碼是全部保留、或是只保留其中一個分支庄蹋、或者重新編寫沖突部分的邏輯的解決方法瞬内,強(qiáng)烈反對在沒弄清代碼邏輯之前迷雪,直接使用自己分支的代碼 或保留雙方代碼來解決沖突;

  3. 完成修改后提交代碼遂鹊,使用命令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)制刪除分支
刪除dev分支-c

注意:分支合并有兩種方式no-fast-forward和fast-forward裆装,其區(qū)別是--no-ff生成合并Commit日志并保留原分支的提交時間線踱承;而--ff直接將目標(biāo)分支的提交并入主分支的時間線。默認(rèn)是fast-forward哨免。兩者區(qū)別如下圖所示

fast-forward和no-ff-c400

四茎活、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文件版本回退;
  1. 切到智能組網(wǎng)分支
git checkout dev-1212-智能組網(wǎng)業(yè)務(wù)服開接口增加字段`
  1. 合并master上的修改影暴;
git merge master
  1. 查看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)
  1. 回退XIB文件
git reset bb753795 GDWWNOP/家寬開通/工單詳情/待處理信息/智能組網(wǎng)/二期/View/GDIntelNetInstallInfoSectionCell.xib`
  1. 執(zhí)行git status屉来,查看到工作區(qū)中有本地修改,此時運(yùn)行Target得到的結(jié)果跟回滾前是一樣的茂契,原因是使用缺省的--mixed版本回滾所需修改在暫存區(qū)中掉冶,回滾版本后續(xù)的修改在工作區(qū)中脐雪,所以彼此抵消了战秋;

  2. 丟棄工作區(qū)中的本地修改

git checkout GDWWNOP/家寬開通/工單詳情/待處理信息/智能組網(wǎng)/二期/View/GDIntelNetInstallInfoSectionCell.xib`
4.2.1.2 Controller文件使用TODO注釋屏蔽;
  1. 修改GDJKKTIntelNetVisitTestController.m 文件癣蟋,注釋添加字段相關(guān)內(nèi)容并添加“//TODO: 屏蔽智能組網(wǎng)增加字段” 的注釋疯搅;

  2. 修改GDJKKTLightChangeController.m 文件幔欧,注釋添加字段相關(guān)內(nèi)容并添加“//TODO: 屏蔽智能組網(wǎng)增加字段” 的注釋丽声;

  3. 提交回退及修改恒序,生成的提交號為(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分支楚堤。

  1. 檢出到智能組網(wǎng)分支
git checkout dev-1212-智能組網(wǎng)業(yè)務(wù)服開接口增加字段
  1. 回滾文件身冬,此時回滾所作修改保存在暫存區(qū),回滾版本后續(xù)的修改保存在工作
git reset 2c20de30 GDWWNOP/家寬開通/工單詳情/待處理信息/智能組網(wǎng)/二期/View/GDIntelNetInstallInfoSectionCell.xib GDWWNOP/家寬開通/工單詳情/待處理信息/智能組網(wǎng)/GDJKKTIntelNetVisitTestController.m GDWWNOP/家寬開通/工單詳情/光功率整改/質(zhì)檢整改/GDJKKTLightChangeController.m
  1. 廢棄工作區(qū)中回滾版本后續(xù)的修改
git checkout GDWWNOP/家寬開通/工單詳情/待 處理信息/智能組網(wǎng)/二期/View/GDIntelNetInstallInfoSectionCell.xib GDWWNOP/家寬開通/工單詳情/待處理信息/智能組網(wǎng)/GDJKKTIntelNetVisitTestController.m GDWWNOP/家寬開通/工單詳情/光功率整改/質(zhì)檢整改/GDJKKTLightChangeController.m
  1. 全量提交代碼
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ù)器

  1. 安裝Docker 注意下載前必須注冊Docker賬號呼盆,注冊過程中引用到的i'm not a robot插件必須翻墻才能使用访圃。下載圖形界面客戶端Kitematic可以更方便地使用Docker腿时,接下來的步驟都是使用Docker實現(xiàn);

  2. 下載gitlab-ce鏡像

    docker pull gitlab/gitlab-ce
    
  3. 運(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
    
  4. 用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"
    
  5. 配置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"
    
  6. 重啟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

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市距境,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌师幕,老刑警劉巖霹粥,帶你破解...
    沈念sama閱讀 206,968評論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件后控,死亡現(xiàn)場離奇詭異忆蚀,居然都是意外死亡瑟匆,警方通過查閱死者的電腦和手機(jī)巨缘,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,601評論 2 382
  • 文/潘曉璐 我一進(jìn)店門茴厉,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人怀酷,你說我怎么就攤上這事蜕依⊙撸” “怎么了翠肘?”我有些...
    開封第一講書人閱讀 153,220評論 0 344
  • 文/不壞的土叔 我叫張陵被丧,是天一觀的道長。 經(jīng)常有香客問我抓半,道長笛求,這世上最難降的妖魔是什么糕簿? 我笑而不...
    開封第一講書人閱讀 55,416評論 1 279
  • 正文 為了忘掉前任蜂嗽,我火速辦了婚禮殃恒,結(jié)果婚禮上离唐,老公的妹妹穿的比我還像新娘亥鬓。我一直安慰自己,他們只是感情好覆积,可當(dāng)我...
    茶點故事閱讀 64,425評論 5 374
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著庵朝,像睡著了一般偿短。 火紅的嫁衣襯著肌膚如雪昔逗。 梳的紋絲不亂的頭發(fā)上勾怒,一...
    開封第一講書人閱讀 49,144評論 1 285
  • 那天笔链,我揣著相機(jī)與錄音鉴扫,去河邊找鬼。 笑死炕婶,一個胖子當(dāng)著我的面吹牛柠掂,可吹牛的內(nèi)容都是我干的依沮。 我是一名探鬼主播危喉,決...
    沈念sama閱讀 38,432評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼姥饰,長吁一口氣:“原來是場噩夢啊……” “哼列粪!你這毒婦竟也來了岂座?” 一聲冷哼從身側(cè)響起费什,我...
    開封第一講書人閱讀 37,088評論 0 261
  • 序言:老撾萬榮一對情侶失蹤鸳址,失蹤者是張志新(化名)和其女友劉穎稿黍,沒想到半個月后巡球,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體邓嘹,經(jīng)...
    沈念sama閱讀 43,586評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,028評論 2 325
  • 正文 我和宋清朗相戀三年棚贾,在試婚紗的時候發(fā)現(xiàn)自己被綠了鸟悴。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片细诸。...
    茶點故事閱讀 38,137評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡震贵,死狀恐怖猩系,靈堂內(nèi)的尸體忽然破棺而出寇甸,到底是詐尸還是另有隱情疗涉,我是刑警寧澤咱扣,帶...
    沈念sama閱讀 33,783評論 4 324
  • 正文 年R本政府宣布闹伪,位于F島的核電站偏瓤,受9級特大地震影響厅克,放射性物質(zhì)發(fā)生泄漏已骇。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,343評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望浪读。 院中可真熱鬧碘橘,春花似錦吱肌、人聲如沸氮墨。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,333評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽奸忽。三九已至月杉,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間桨昙,已是汗流浹背蛙酪。 一陣腳步聲響...
    開封第一講書人閱讀 31,559評論 1 262
  • 我被黑心中介騙來泰國打工翘盖, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留桂塞,地道東北人。 一個月前我還...
    沈念sama閱讀 45,595評論 2 355
  • 正文 我出身青樓馍驯,卻偏偏與公主長得像阁危,于是被迫代替她去往敵國和親玛痊。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,901評論 2 345

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

  • Git 基礎(chǔ) 基本原理 客戶端并不是只提取最新版本的文件快照狂打,而是把代碼倉庫完整的鏡像下來擂煞。這樣一來趴乡,任何一處協(xié)同...
    __silhouette閱讀 15,855評論 5 147
  • Git 命令行學(xué)習(xí)筆記 Git 基礎(chǔ) 基本原理 客戶端并不是只提取最新版本的文件快照对省,而是把代碼倉庫完整的鏡像下來...
    sunnyghx閱讀 3,905評論 0 11
  • 一、電腦本地初始化一個倉庫 1. git init: 初始化一個電腦上本地倉庫 終端進(jìn)入項目目錄晾捏,輸入: 該命令將...
    dragon_li閱讀 2,881評論 1 4
  • 終于讀完門羅的《親愛的生活》惦辛,受夠她的循環(huán)敘事方法和隱晦的語言劳秋,近期一直在讀福樓拜寫的《包法利夫人》。 這本小說的...
    熱愛一生閱讀 6,518評論 5 12
  • 星期六了裙品,睡了個懶覺俗批,美美的吃了次早餐,打了一下午英雄聯(lián)盟市怎,可爽了(我要遠(yuǎn)離毒包子) 穿的雖然看起來特屌絲岁忘,但是感...
    赤子追夢閱讀 145評論 8 1