Git的點(diǎn)點(diǎn)滴滴巷帝,附帶Android Studio中的操作(四):用Git進(jìn)行協(xié)同開(kāi)發(fā)

在協(xié)同開(kāi)發(fā)中,為了項(xiàng)目管理的方便扫夜,會(huì)采用各種各樣的工作流楞泼,有關(guān)工作流方面的內(nèi)容,可以到開(kāi)頭提供的第三個(gè)網(wǎng)址里學(xué)習(xí)笤闯。這里只簡(jiǎn)單介紹兩個(gè)實(shí)用的技巧堕阔。

01 一個(gè)干凈的push!

在Git中颗味,我們很少會(huì)改變中央倉(cāng)庫(kù)的已有的提交歷史印蔬。因?yàn)槟菢訒?huì)使所有的開(kāi)發(fā)者的本地倉(cāng)庫(kù)和中央倉(cāng)庫(kù)處在不一致的狀態(tài),所有開(kāi)發(fā)者都需要因?yàn)檫@個(gè)改動(dòng)調(diào)整自己的本地倉(cāng)庫(kù)來(lái)與中央倉(cāng)庫(kù)保持一致脱衙。如果改動(dòng)很大侥猬,調(diào)整將會(huì)很復(fù)雜。只要不是及其嚴(yán)重的事情捐韩,我們都不會(huì)去調(diào)整中央倉(cāng)庫(kù)的提交歷史退唠。所以,推送上去是什么樣的荤胁,以后就會(huì)是什么樣的瞧预,對(duì)于中央倉(cāng)庫(kù)來(lái)說(shuō),第一印象會(huì)伴隨一生仅政。

所以垢油,就像女生出門前要化妝一樣,在推送本地分支到中央倉(cāng)庫(kù)前圆丹,要把本地分支整理干凈滩愁。一般,我們會(huì)給每個(gè)功能新建一個(gè)分支辫封,在功能開(kāi)發(fā)完成后硝枉,可以用git rebase -i命令刪去那些無(wú)關(guān)緊要的提交廉丽,并將提交歷史書(shū)寫(xiě)成我們邏輯中的樣子。

比如我們接到了生產(chǎn)車門的任務(wù)妻味,現(xiàn)在我們把它完成了正压,開(kāi)發(fā)歷史如下。

在我們把它推送到中央倉(cāng)庫(kù)前责球,我們用git rebase -i <commitID>整理一下它的提交歷史焦履,commitID參數(shù)用來(lái)指定我們要從哪個(gè)提交開(kāi)始修改。由于我們是從BetterWheelCompleted這個(gè)提交開(kāi)始開(kāi)發(fā)車門的雏逾,所以commitID參數(shù)應(yīng)該是這個(gè)提交的版本號(hào)裁良,為99c7ed1578c0a16a0f1de58548883a8d6e8eeb8a。執(zhí)行以下指令校套。

$ git rebase -i 99c7ed1578c0a16a0f1de58548883a8d6e8eeb8a

之后价脾,在命令行中會(huì)顯示vi文本編輯窗口。

在最前面的是各個(gè)提交笛匙,每個(gè)提交的前面是要對(duì)該提交執(zhí)行的命令侨把,默認(rèn)是pick采用提交,我們主要會(huì)用到squash命令妹孙,squash命令可以讓我們把對(duì)應(yīng)提交合并到上一次提交中秋柄,舉個(gè)栗子,給69218a4提交加上squash命令就可以把它合并到f7a6770提交上蠢正。我們開(kāi)發(fā)車門主要有三個(gè)階段骇笔,設(shè)計(jì)車架,設(shè)計(jì)車窗嚣崭,加入手勢(shì)開(kāi)門功能笨触,所以我們要分別合并第二、三雹舀、四次提交芦劣。我們把它編輯如下,然后保存并退出編輯窗口说榆。

之后在合并第二虚吟、三、四次提交時(shí)签财,Git又會(huì)彈出一個(gè)文本編輯窗口串慰,讓我們合并三次提交的提交信息。

因?yàn)檫@一次合并提交的信息應(yīng)該為“設(shè)計(jì)了車窗”唱蒸,剛好是第二個(gè)提交的提交信息邦鲫,所以我們?cè)诓灰男畔⑶凹?code>#把他們忽略即可。合并完成后油宜,我們的提交歷史就變成了如下模樣掂碱。

然后就可以把他們推送到遠(yuǎn)端怜姿,由其他人檢查代碼慎冤,然后合并或者變基到主分支上了疼燥。如果在開(kāi)發(fā)完后就已經(jīng)決定要這條分支變基到主分支上,那也可以直接用git rebase -i <branch_name>來(lái)修改提交歷史并變基蚁堤。

很多時(shí)候醉者,我們會(huì)把一個(gè)功能的實(shí)現(xiàn)分為好幾個(gè)功能點(diǎn),然后給功能點(diǎn)新建一條分支披诗,然后在這個(gè)功能點(diǎn)開(kāi)發(fā)完后把修改整合回功能分支撬即。這樣做的好處是可以保持功能分支的整潔,不會(huì)在功能分支上生成很多備份代碼的提交呈队,但是如果用普通的merge操作的話剥槐,合并生成的提交除了指向主功能分支外,也會(huì)指向功能點(diǎn)分支宪摧,那樣還是會(huì)把功能點(diǎn)分支上的提交歷史混合進(jìn)來(lái)粒竖。

這時(shí)我們可以使用git merge --squash <branch_name>,在merge指令中加入--squash后會(huì)把branch_name分支上的所有提交壓縮成一個(gè)加入到當(dāng)前分支上來(lái)几于,并且這個(gè)提交不會(huì)指向被合并的分支蕊苗。舉個(gè)栗子,在上次我們把車門的分支推送上去給老大檢查后沿彭,老大說(shuō)要再加一個(gè)手勢(shì)關(guān)門的功能朽砰!然后我們?yōu)榱酥鞣种У恼麧崳o這個(gè)小功能新建了一個(gè)分支進(jìn)行開(kāi)發(fā)喉刘。接著瞧柔,經(jīng)過(guò)了不懈努力,我們終于開(kāi)發(fā)完了睦裳,現(xiàn)在提交歷史如下非剃。

我們用以下指令把feature-CloaseDoorwithGesture分支的上的提交壓縮成一個(gè)一條放到produceDoor分支上。

$ git checkout produceDoor
$ git merge --squash feature-CloseDoorwithGesture
$ git commit -m "給車門加上了手勢(shì)關(guān)門的功能"

執(zhí)行完成后我們的提交歷史就變成了下圖所示模樣推沸。

可以看到新建的提交并沒(méi)有指向feature-CloaseDoorwithGesture分支备绽。在合并完后,我們可以刪除feature-CloaseDoorwithGesture分支鬓催。

$ git branch -D feature-CloseDoorwithGesture

OK肺素。老大說(shuō)干的不錯(cuò),讓我們把分支合并到主分支上宇驾,然后推送到中央倉(cāng)庫(kù)來(lái)結(jié)束這個(gè)功能的開(kāi)發(fā)倍靡。

$ git merge --no-ff produceDoor -m "車門生產(chǎn)完成"
$ git push origin master

執(zhí)行完成后,提交歷史如下课舍。

Android Studio中的相應(yīng)操作
VCS->Git->Merge Changes下的合并操作塌西,并選中squash commit選項(xiàng)他挎,即可完成git merge --squash <branch_name>操作。

git rebase -i <commitID>可以用VCS->Git->Rebase完成捡需。點(diǎn)擊后會(huì)彈出如下對(duì)話框办桨,選中Interactive選項(xiàng),在Branch選項(xiàng)中選中要變基的分支站辉,在Onto選項(xiàng)中呢撞,填寫(xiě)新基點(diǎn)(會(huì)從這個(gè)提交開(kāi)始修改歷史)。

點(diǎn)擊Rebase之后饰剥,會(huì)彈出如下對(duì)話框殊霞, 在這里你可以選擇要對(duì)每個(gè)提交執(zhí)行的命令。選完命令之后汰蓉,按下Start Rebasing就會(huì)開(kāi)始變基绷蹲。

02 push失敗顾孽?

·我們把前面開(kāi)發(fā)車門那個(gè)同學(xué)叫做小明祝钢,在小明開(kāi)發(fā)車門,引擎和輪子的同時(shí)岩齿,還有一個(gè)叫小剛的同學(xué)在開(kāi)發(fā)制動(dòng)系統(tǒng)太颤。小剛現(xiàn)在剛把制動(dòng)系統(tǒng)開(kāi)發(fā)完畢,他現(xiàn)在的提交歷史如下盹沈。

現(xiàn)在他要把master分支推送到中央倉(cāng)庫(kù)上龄章。小剛運(yùn)行了如下指令。

$ git push origin master

但是Git告訴他乞封,push被拒絕了做裙,因?yàn)橹醒雮}(cāng)庫(kù)的master分支里有本地還沒(méi)有的改動(dòng),并讓我們把改動(dòng)集成到本地倉(cāng)庫(kù)中再進(jìn)行push肃晚。

所以在每次push前锚贱,應(yīng)該先抓取中央倉(cāng)庫(kù)上的更新,然后集成到本地关串,再提交拧廊。抓取更新的指令是git fetch <remote_name> <branch_name>。現(xiàn)在小明用以下指令拉取了中央倉(cāng)庫(kù)上的更新晋修。

$ git fetch origin master

拉取后吧碾,本地的提交歷史變成了這樣。其中墓卦,origin/master表示的就是遠(yuǎn)程倉(cāng)庫(kù)上的master分支倦春,遠(yuǎn)程分支是只讀的,不能修改。

現(xiàn)在小明要把遠(yuǎn)程倉(cāng)庫(kù)的master分支上的改動(dòng)集成到本地的master上睁本。根據(jù)之前學(xué)的知識(shí)尿庐,有兩種方法,rebasemerge呢堰。

如果使用merge抄瑟,把本地origin/master分支的內(nèi)容合并到master上,合并后提交歷史如下暮胧。很亂锐借,而且因?yàn)楹喜⒍律闪艘粋€(gè)節(jié)點(diǎn)问麸。

如果用rebase,把本地master分支的內(nèi)容變基到origin/master上,合并后提交歷史如下叶圃。清楚了很多梢什,而且看起來(lái)像是串行開(kāi)發(fā)的一樣。一般把遠(yuǎn)端更新整合到本地會(huì)用rebase指令哮笆。

注意: rebase操作會(huì)把可以快進(jìn)的合并記錄刪掉来颤,最后rebase結(jié)果就像是合并時(shí)使用了快進(jìn)一樣。如果要保留合并記錄稠肘,可以加入--preserve-merges參數(shù)福铅。

上面提到過(guò)git pull <remote_name> <branch_name>操作,它其實(shí)是git fetch <remote_name> <branch_name>git merge的結(jié)合项阴。當(dāng)然也可以轉(zhuǎn)化為rebase版本滑黔,在中間加個(gè)參數(shù),git pull --rebase <remote_name> <branch_name>环揽。

其實(shí)上面的操作有更好的處理方法略荡。在功能開(kāi)發(fā)完成后,可以先把遠(yuǎn)端的更新用git pull --rebase拉取下來(lái)歉胶,并把本地分支的更新變基到上面去汛兜。之后,把功能分支rebase到主分支上通今,這個(gè)時(shí)候遠(yuǎn)端的更新就全部整合進(jìn)功能分支了粥谬,這個(gè)時(shí)候我們可以測(cè)試一下合并之后代碼還正不正確。最后再把功能分支合并到主分支并推送上去辫塌。

Android Studio中的相應(yīng)操作
在Android Studio中漏策,可以選擇用merge版本還是rebase版本的pull操作。按下下圖中的按鈕璃氢。

在彈出的對(duì)話框中哟玷,選擇拉取方式。右邊的選項(xiàng)是存儲(chǔ)當(dāng)前工作區(qū)修改的方式。選擇完成后巢寡,點(diǎn)擊ok即可開(kāi)始拉取喉脖。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市抑月,隨后出現(xiàn)的幾起案子树叽,更是在濱河造成了極大的恐慌,老刑警劉巖谦絮,帶你破解...
    沈念sama閱讀 206,839評(píng)論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件题诵,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡层皱,警方通過(guò)查閱死者的電腦和手機(jī)性锭,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,543評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)叫胖,“玉大人草冈,你說(shuō)我怎么就攤上這事∥驮觯” “怎么了怎棱?”我有些...
    開(kāi)封第一講書(shū)人閱讀 153,116評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)绷跑。 經(jīng)常有香客問(wèn)我拳恋,道長(zhǎng),這世上最難降的妖魔是什么砸捏? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,371評(píng)論 1 279
  • 正文 為了忘掉前任谬运,我火速辦了婚禮,結(jié)果婚禮上带膜,老公的妹妹穿的比我還像新娘吩谦。我一直安慰自己,他們只是感情好膝藕,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,384評(píng)論 5 374
  • 文/花漫 我一把揭開(kāi)白布式廷。 她就那樣靜靜地躺著,像睡著了一般芭挽。 火紅的嫁衣襯著肌膚如雪滑废。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 49,111評(píng)論 1 285
  • 那天袜爪,我揣著相機(jī)與錄音蠕趁,去河邊找鬼。 笑死辛馆,一個(gè)胖子當(dāng)著我的面吹牛俺陋,可吹牛的內(nèi)容都是我干的豁延。 我是一名探鬼主播,決...
    沈念sama閱讀 38,416評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼腊状,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼诱咏!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起缴挖,我...
    開(kāi)封第一講書(shū)人閱讀 37,053評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤袋狞,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后映屋,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體苟鸯,經(jīng)...
    沈念sama閱讀 43,558評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,007評(píng)論 2 325
  • 正文 我和宋清朗相戀三年棚点,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了早处。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,117評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡乙濒,死狀恐怖陕赃,靈堂內(nèi)的尸體忽然破棺而出卵蛉,到底是詐尸還是另有隱情颁股,我是刑警寧澤,帶...
    沈念sama閱讀 33,756評(píng)論 4 324
  • 正文 年R本政府宣布傻丝,位于F島的核電站甘有,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏葡缰。R本人自食惡果不足惜亏掀,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,324評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望泛释。 院中可真熱鬧滤愕,春花似錦、人聲如沸怜校。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,315評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)茄茁。三九已至魂贬,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間裙顽,已是汗流浹背付燥。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,539評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留愈犹,地道東北人键科。 一個(gè)月前我還...
    沈念sama閱讀 45,578評(píng)論 2 355
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親勋颖。 傳聞我的和親對(duì)象是個(gè)殘疾皇子梆掸,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,877評(píng)論 2 345

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