Git Stash用法
最近在使用Git管理項(xiàng)目工程的時(shí)候,遇到了很多問(wèn)題碎连,也學(xué)習(xí)到了很多關(guān)于Git常見(jiàn)使用的技巧锦溪,下面就其中關(guān)于Git Stash的用法和大家分享下。
首先卫枝,簡(jiǎn)單介紹下Git Stash命令的用法,詳細(xì)的用法在man文檔中有相關(guān)介紹讹挎,下面我來(lái)說(shuō)明常見(jiàn)的使用校赤。
git stash: 備份當(dāng)前的工作區(qū)的內(nèi)容,從最近的一次提交中讀取相關(guān)內(nèi)容筒溃,讓工作區(qū)保證和上次提交的內(nèi)容一致马篮。同時(shí),將當(dāng)前的工作區(qū)內(nèi)容保存到Git棧中怜奖。
git stash pop: 從Git棧中讀取最近一次保存的內(nèi)容浑测,恢復(fù)工作區(qū)的相關(guān)內(nèi)容。由于可能存在多個(gè)Stash的內(nèi)容烦周,所以用棧來(lái)管理,pop會(huì)從最近的一個(gè)stash中讀取內(nèi)容并恢復(fù)怎顾。
git stash list: 顯示Git棧內(nèi)的所有備份读慎,可以利用這個(gè)列表來(lái)決定從那個(gè)地方恢復(fù)。
git stash clear: 清空Git棧槐雾。此時(shí)使用gitg等圖形化工具會(huì)發(fā)現(xiàn)夭委,原來(lái)stash的哪些節(jié)點(diǎn)都消失了。
關(guān)于Git Stash的詳細(xì)解釋募强,適用場(chǎng)合株灸,這里做一個(gè)說(shuō)明:
使用git的時(shí)候,我們往往使用branch解決任務(wù)切換問(wèn)題擎值,例如慌烧,我們往往會(huì)建一個(gè)自己的分支去修改和調(diào)試代碼,?如果別人或者自己發(fā)現(xiàn)原有的分支上有個(gè)不得不修改的bug,我們往往會(huì)把完成一半的代碼?commit提交到本地倉(cāng)庫(kù)鸠儿,然后切換分支去修改bug屹蚊,改好之后再切換回來(lái)厕氨。這樣的話往往log上會(huì)有大量不必要的記錄。其實(shí)如果我們不想提交完成一半或者不完善的代碼汹粤,但是卻不得不去修改一個(gè)緊急Bug命斧,那么使用'git?stash'就可以將你當(dāng)前未提交到本地(和服務(wù)器)的代碼推入到Git的棧中,這時(shí)候你的工作區(qū)間和上一次提交的內(nèi)容是完全一樣的嘱兼,所以你可以放心的修?Bug国葬,等到修完Bug,提交到服務(wù)器上后芹壕,再使用'git?stash?apply'將以前一半的工作應(yīng)用回來(lái)汇四。也許有的人會(huì)說(shuō),那我可不可以多次將未提交的代碼壓入到棧中哪雕?答案是可以的船殉。當(dāng)你多次使用'git?stash'命令后,你的棧里將充滿了未提交的代碼斯嚎,這時(shí)候你會(huì)對(duì)將哪個(gè)版本應(yīng)用回來(lái)有些困惑利虫,'git?stash?list'命令可以將當(dāng)前的Git棧信息打印出來(lái),你只需要將找到對(duì)應(yīng)的版本號(hào)堡僻,例如使用'git?stash?apply?stash@{1}'就可以將你指定版本號(hào)為stash@{1}的工作取出來(lái)糠惫,當(dāng)你將所有的棧都應(yīng)用回來(lái)的時(shí)候,可以使用'git?stash?clear'來(lái)將棧清空钉疫。
在這里順便提下git?format-patch-n?,?n是具體某個(gè)數(shù)字硼讽,?例如'git?format-patch?-1'這時(shí)便會(huì)根據(jù)log生成一個(gè)對(duì)應(yīng)的補(bǔ)丁,如果'git?format-patch?-2'那么便會(huì)生成2個(gè)補(bǔ)丁牲阁,當(dāng)然前提是你的log上有至少有兩個(gè)記錄固阁。
看過(guò)上面的信息,就可以知道使用場(chǎng)合了:當(dāng)前工作區(qū)內(nèi)容已被修改城菊,但是并未完成备燃。這時(shí)Boss來(lái)了,說(shuō)前面的分支上面有一個(gè)Bug凌唬,需要立即修復(fù)并齐。可是我又不想提交目前的修改客税,因?yàn)樾薷臎](méi)有完成况褪。但是,不提交的話更耻,又沒(méi)有辦法checkout到前面的分支测垛。此時(shí)用Git Stash就相當(dāng)于備份工作區(qū)了。然后在Checkout過(guò)去修改秧均,就能夠達(dá)到保存當(dāng)前工作區(qū)赐纱,并及時(shí)恢復(fù)的作用脊奋。
下面,將我使用過(guò)程中遇到的一個(gè)問(wèn)題和大家分享:
首先疙描,在Git Stash之后诚隙,提交圖如下所示:
從圖中可以看到,develop和newdevelop是在同一個(gè)分支上起胰,因?yàn)榉种ewdevelop是在develop分支的基礎(chǔ)上開發(fā)的久又。想加入一個(gè)新的特性,所以就開了newdevelop分支效五,然后就在上面加?xùn)|西地消,加特性,該代碼畏妖。這個(gè)時(shí)候工作的內(nèi)容已經(jīng)變化了脉执,但是develop和newdevelop都是指向同一個(gè)提交的,因?yàn)閚ewdevelop上面還木有提交戒劫。
這個(gè)時(shí)候半夷,Boss來(lái)了,說(shuō)develop上面有個(gè)Bug迅细,趕快改一下巫橄,手頭的工作先放放,穩(wěn)定版本不能有缺陷茵典。沒(méi)辦法湘换,當(dāng)前正在newdevelop上搞的high呢,就Git Stash一下统阿。所以會(huì)看到上面有兩個(gè)節(jié)點(diǎn)彩倚,紅色以及上面一個(gè)。就是stash之后的結(jié)果扶平,注意是在newdevelop上面進(jìn)行的stash帆离。
正如前面所說(shuō),stash會(huì)暫存當(dāng)前的工作區(qū)內(nèi)容蜻直,然后將工作區(qū)內(nèi)容保持和上次提交相同盯质,此時(shí)內(nèi)容都是上面8a32那個(gè)提交的內(nèi)容袁串。從終端中查看相應(yīng)的信息內(nèi)容概而,如下:
印證了簽名的說(shuō)法,newdevelop是有修改囱修,modified赎瑰,然后stash之后,工作區(qū)是最近一次提交破镰,此時(shí)newdevelop和develop都是相同的餐曼,所以再git status查看發(fā)現(xiàn)压储,都一樣,nothing to commit.
然后Stash完成之后源譬,就要Fix Bug了集惋。為此,回到develop分支上進(jìn)行修復(fù)踩娘,然后提交刮刑,完成后的提交圖如下所示:
從途中可以看到,newdevelop還是在下面养渴,因?yàn)橹赶虻氖抢系哪莻€(gè)8a32的commit雷绢。新的develop由于修復(fù)了Bug,所以產(chǎn)生一個(gè)新提交理卑。
然后在develop上面修復(fù)了Bug之后翘紊,在回到newdevelop上面進(jìn)行一個(gè)新的特性的繼續(xù)編碼,此時(shí)checkout回去的時(shí)候藐唠,沒(méi)有神馬內(nèi)容可以提交帆疟,因?yàn)槎即嬖赟tash中了,沒(méi)有任何修改中捆。如上圖鸯匹。
那么,恢復(fù)工作區(qū)內(nèi)容吧泄伪。于是git stash pop(注意這里由于只Stash了一次所以使用pop殴蓬,具體你存放了多少,要恢復(fù)哪一個(gè)要自己清楚蟋滴,否則會(huì)出錯(cuò)H咎)
恢復(fù)之后,從上圖中可以看到津函,此時(shí)再git status就會(huì)發(fā)現(xiàn)文件有修改肖粮,說(shuō)明恢復(fù)過(guò)來(lái)了。然后就繼續(xù)編碼尔苦,提交一個(gè)穩(wěn)定的新特性版本涩馆,如下圖,產(chǎn)生的新提交為0906.
然后再查看提交圖允坚,會(huì)發(fā)現(xiàn)魂那,stash pop之后,對(duì)應(yīng)的存放的stash被清空掉了稠项,提交圖中涯雅,newdevelop上面對(duì)應(yīng)一個(gè)新的提交。并且在develop上面展运。分支的develop那個(gè)紅色活逆,即為前面修復(fù)Bug的那個(gè)提交精刷。
總結(jié)起來(lái):
操作很簡(jiǎn)單,但是頭腦要清楚蔗候。要在哪個(gè)分支上修復(fù)Bug怒允,要暫存哪個(gè)地方的內(nèi)容,之后修復(fù)完了在那個(gè)地方提交锈遥,然后要到哪個(gè)分支上面恢復(fù)工作區(qū)误算,都是需要注意的,否則迷殿,很容易造成提交圖混亂儿礼。只有弄清楚了工作流程,才不容易出錯(cuò)庆寺,才能保證很高的工作效率蚊夫。