前言
由于剛開始對(duì)git stash命令理解不透徹,誤以為代碼不見了齐唆,所以記錄一下git stash的使用以及過程中遇到的坑??(stash文件和本地UserInterfaceState.xcuserstate沖突贷腕,無法stash pop)
git stash的應(yīng)用場(chǎng)景
當(dāng)正在dev分支上開發(fā)某個(gè)項(xiàng)目,這時(shí)項(xiàng)目中出現(xiàn)一個(gè)bug,需要緊急修復(fù)尘应,但是正在開發(fā)的內(nèi)容只是完成一半,還不想提交吼虎,這時(shí)可以用git stash命令將修改的內(nèi)容保存至堆棧區(qū)犬钢,然后順利切換到hotfix分支進(jìn)行bug修復(fù),修復(fù)完成后思灰,再次切回到dev分支玷犹,從堆棧中恢復(fù)剛剛保存的內(nèi)容
由于疏忽,本應(yīng)該在dev分支開發(fā)的內(nèi)容洒疚,卻在master上進(jìn)行了開發(fā)歹颓,需要重新切回到dev分支上進(jìn)行開發(fā),可以用git stash將內(nèi)容保存至堆棧中拳亿,切回到dev分支后晴股,再次恢復(fù)內(nèi)容即可
總的來說,git stash命令的作用就是將目前還不想提交的但是已經(jīng)修改的內(nèi)容進(jìn)行保存至堆棧中肺魁,后續(xù)可以在某個(gè)分支上恢復(fù)出堆棧中的內(nèi)容电湘。這也就是說,stash中的內(nèi)容不僅僅可以恢復(fù)到原先開發(fā)的分支鹅经,也可以恢復(fù)到其他任意指定的分支上寂呛。git stash作用的范圍包括工作區(qū)和暫存區(qū)中的內(nèi)容,也就是說沒有提交的內(nèi)容都會(huì)保存至堆棧中瘾晃。
命令
git stash 或 git stash save ""
可以看到test.swift文件不見了贷痪,git stash 能夠?qū)⑺形刺峤坏男薷模üぷ鲄^(qū)和暫存區(qū))保存至堆棧中,用于后續(xù)恢復(fù)當(dāng)前工作目錄
git stash list
rhp$ git stash list
stash@{0}: WIP on thirdIss: 0624f25 刪除stash命令測(cè)試文件
rhpdembp:ToyStory rhp$
查看當(dāng)前stash中的內(nèi)容
git stash pop
rhpdembp:ToyStory rhp$ git stash pop
On branch thirdIss
Your branch is up to date with 'origin/thirdIss'.
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git checkout -- <file>..." to discard changes in working directory)
modified: ToyStory.xcodeproj/project.pbxproj
Untracked files:
(use "git add <file>..." to include in what will be committed)
test.swift
no changes added to commit (use "git add" and/or "git commit -a")
Dropped refs/stash@{0} (d46cdf62251c21e5eceffbf092c49fb60ed9a501)
rhpdembp:ToyStory rhp$
這時(shí)候會(huì)看到test.swift文件恢復(fù)了蹦误,git stash pop將當(dāng)前stash中的內(nèi)容彈出劫拢,并應(yīng)用到當(dāng)前分支對(duì)應(yīng)的工作目錄上肉津。
注:該命令將堆棧中最近保存的內(nèi)容刪除(棧是先進(jìn)后出)
git stash apply
將堆棧中的內(nèi)容應(yīng)用到當(dāng)前目錄,不同于git stash pop舱沧,該命令不會(huì)將內(nèi)容從堆棧中刪除妹沙,也就說該命令能夠?qū)⒍褩5膬?nèi)容多次應(yīng)用到工作目錄中,適應(yīng)于多個(gè)分支的情況熟吏。
git stash drop + 名稱
從堆棧中移除某個(gè)指定的stash
git stash clear
清除堆棧中的所有內(nèi)容
git stash show
查看堆棧中最新保存的stash和當(dāng)前目錄的差異
git stash show -p
查看堆棧中最新保存的stash和當(dāng)前目錄的差異的詳細(xì)內(nèi)容
git stash branch
從最新的stash創(chuàng)建分支距糖。
應(yīng)用場(chǎng)景:當(dāng)儲(chǔ)藏了部分工作,暫時(shí)不去理會(huì)牵寺,繼續(xù)在當(dāng)前分支進(jìn)行開發(fā)悍引,后續(xù)想將stash中的內(nèi)容恢復(fù)到當(dāng)前工作目錄時(shí),如果是針對(duì)同一個(gè)文件的修改(即便不是同行數(shù)據(jù))帽氓,那么可能會(huì)發(fā)生沖突趣斤,恢復(fù)失敗,這里通過創(chuàng)建新的分支來解決杏节』I可以用于解決stash中的內(nèi)容和當(dāng)前目錄的內(nèi)容發(fā)生沖突的情景典阵。 發(fā)生沖突時(shí)奋渔,需手動(dòng)解決沖突。
恢復(fù)stash內(nèi)容的坑:
git stash 后切換到其它分支再回來, 因?yàn)镚it 沒有設(shè)置忽略UserInterfaceState.xcuserstate文件壮啊,(UserInterfaceState.xcuserstate這個(gè)文件一直在自動(dòng)更新嫉鲸,即使我的代碼沒改變,提交時(shí)也有它歹啼。后來百度到這是Xcode自帶的文件玄渗,不應(yīng)該被提交到版本管理中),導(dǎo)致git stash pop 提示沖突狸眼,瘋狂百度也沒能解決問題藤树,最后無意發(fā)現(xiàn)執(zhí)行g(shù)it stash clear 后,本地目錄的文件都回來了拓萌,不知道為什么岁钓,知道原來的可以底下留言,謝謝
擴(kuò)展:
gitignore配置
git stash詳解
特別感謝以上朋友的技術(shù)分享