Git stash

常用 Git 命令清單點(diǎn)擊打開鏈接

儲(chǔ)藏(Stashing)

經(jīng)常有這樣的事情發(fā)生物蝙,當(dāng)你正在進(jìn)行項(xiàng)目中某一部分的工作荐吵,里面的東西處于一個(gè)比較雜亂的狀態(tài)棠隐,而你想轉(zhuǎn)到其他分支上進(jìn)行一些工作衩茸。問題是暂幼,你不想提交進(jìn)行了一半的工作筹煮,否則以后你無法回到這個(gè)工作點(diǎn)遮精。解決這個(gè)問題的辦法就是git stash命令。

“‘儲(chǔ)藏”“可以獲取你工作目錄的中間狀態(tài)——也就是你修改過的被追蹤的文件和暫存的變更——并將它保存到一個(gè)未完結(jié)變更的堆棧中败潦,隨時(shí)可以重新應(yīng)用本冲。

儲(chǔ)藏你的工作

為了演示這一功能,你可以進(jìn)入你的項(xiàng)目劫扒,在一些文件上進(jìn)行工作檬洞,有可能還暫存其中一個(gè)變更。如果你運(yùn)行 git status沟饥,你可以看到你的中間狀態(tài):

$ git status
# On branch master
# Changes to be committed:
#   (use "git reset HEAD <file>..." to unstage)
#
#      modified:   index.html
#
# Changes not staged for commit:
#   (use "git add <file>..." to update what will be committed)
#
#      modified:   lib/simplegit.rb
#

現(xiàn)在你想切換分支添怔,但是你還不想提交你正在進(jìn)行中的工作湾戳;所以你儲(chǔ)藏這些變更。為了往堆棧推送一個(gè)新的儲(chǔ)藏广料,只要運(yùn)行 git stash

$ git stash
Saved working directory and index state \
  "WIP on master: 049d078 added the index file"
HEAD is now at 049d078 added the index file
(To restore them type "git stash apply")

你的工作目錄就干凈了:

$ git status
# On branch master
nothing to commit, working directory clean

這時(shí)砾脑,你可以方便地切換到其他分支工作;你的變更都保存在棧上艾杏。要查看現(xiàn)有的儲(chǔ)藏韧衣,你可以使用 git stash list

$ git stash list
stash@{0}: WIP on master: 049d078 added the index file
stash@{1}: WIP on master: c264051 Revert "added file_size"
stash@{2}: WIP on master: 21d80a5 added number to log

在這個(gè)案例中,之前已經(jīng)進(jìn)行了兩次儲(chǔ)藏购桑,所以你可以訪問到三個(gè)不同的儲(chǔ)藏畅铭。你可以重新應(yīng)用你剛剛實(shí)施的儲(chǔ)藏,所采用的命令就是之前在原始的 stash 命令的幫助輸出里提示的:git stash apply其兴。如果你想應(yīng)用更早的儲(chǔ)藏顶瞒,你可以通過名字指定它,像這樣:git stash apply stash@{2}元旬。如果你不指明榴徐,Git 默認(rèn)使用最近的儲(chǔ)藏并嘗試應(yīng)用它:

$ git stash apply
# On branch master
# Changes not staged for commit:
#   (use "git add <file>..." to update what will be committed)
#
#      modified:   index.html
#      modified:   lib/simplegit.rb
#

你可以看到 Git 重新修改了你所儲(chǔ)藏的那些當(dāng)時(shí)尚未提交的文件。在這個(gè)案例里匀归,你嘗試應(yīng)用儲(chǔ)藏的工作目錄是干凈的坑资,并且屬于同一分支;但是一個(gè)干凈的工作目錄和應(yīng)用到相同的分支上并不是應(yīng)用儲(chǔ)藏的必要條件穆端。你可以在其中一個(gè)分支上保留一份儲(chǔ)藏袱贮,隨后切換到另外一個(gè)分支,再重新應(yīng)用這些變更体啰。在工作目錄里包含已修改和未提交的文件時(shí)攒巍,你也可以應(yīng)用儲(chǔ)藏——Git 會(huì)給出歸并沖突如果有任何變更無法干凈地被應(yīng)用。對(duì)文件的變更被重新應(yīng)用荒勇,但是被暫存的文件沒有重新被暫存柒莉。想那樣的話,你必須在運(yùn)行 git stash apply 命令時(shí)帶上一個(gè) --index 的選項(xiàng)來告訴命令重新應(yīng)用被暫存的變更沽翔。如果你是這么做的兢孝,你應(yīng)該已經(jīng)回到你原來的位置:

$ git stash apply --index
# On branch master
# Changes to be committed:
#   (use "git reset HEAD <file>..." to unstage)
#
#      modified:   index.html
#
# Changes not staged for commit:
#   (use "git add <file>..." to update what will be committed)
#
#      modified:   lib/simplegit.rb
#

apply 選項(xiàng)只嘗試應(yīng)用儲(chǔ)藏的工作——儲(chǔ)藏的內(nèi)容仍然在棧上。要移除它仅偎,你可以運(yùn)行 git stash drop跨蟹,加上你希望移除的儲(chǔ)藏的名字:

$ git stash list
stash@{0}: WIP on master: 049d078 added the index file
stash@{1}: WIP on master: c264051 Revert "added file_size"
stash@{2}: WIP on master: 21d80a5 added number to log
$ git stash drop stash@{0}
Dropped stash@{0} (364e91f3f268f0900bc3ee613f9f733e82aaed43)

你也可以運(yùn)行 git stash pop 來重新應(yīng)用儲(chǔ)藏,同時(shí)立刻將其從堆棧中移走橘沥。

git stash apply [--index] [<stash>] 不刪除已恢復(fù)的儲(chǔ)存窗轩,其他同git stash pop
git stash pop [--index] [<stash>] 恢復(fù)工作進(jìn)度

--index 參數(shù):不僅恢復(fù)工作區(qū),還恢復(fù)暫存區(qū)
<stash> 指定恢復(fù)某一個(gè)具體進(jìn)度威恼。如果沒有這個(gè)參數(shù)品姓,默認(rèn)恢復(fù)最新進(jìn)度
如:以下命令恢復(fù)編號(hào)為0的進(jìn)度的工作區(qū)和暫存區(qū)
git stash pop --index stash@{0}

取消儲(chǔ)藏(Un-applying a Stash)

在某些情況下寝并,你可能想應(yīng)用儲(chǔ)藏的修改箫措,在進(jìn)行了一些其他的修改后腹备,又要取消之前所應(yīng)用儲(chǔ)藏的修改。Git沒有提供類似于 stash unapply 的命令斤蔓,但是可以通過取消該儲(chǔ)藏的補(bǔ)丁達(dá)到同樣的效果:

$ git stash show -p stash@{0} | git apply -R

同樣的植酥,如果你沒有指定具體的某個(gè)儲(chǔ)藏,Git 會(huì)選擇最近的儲(chǔ)藏:

$ git stash show -p | git apply -R

你可能會(huì)想要新建一個(gè)別名弦牡,在你的 Git 里增加一個(gè) stash-unapply 命令友驮,這樣更有效率。例如:

$ git config --global alias.stash-unapply '!git stash show -p | git apply -R'
$ git stash apply
$ #... work work work
$ git stash-unapply

從儲(chǔ)藏中創(chuàng)建分支

如果你儲(chǔ)藏了一些工作驾锰,暫時(shí)不去理會(huì)卸留,然后繼續(xù)在你儲(chǔ)藏工作的分支上工作,你在重新應(yīng)用工作時(shí)可能會(huì)碰到一些問題椭豫。如果嘗試應(yīng)用的變更是針對(duì)一個(gè)你那之后修改過的文件耻瑟,你會(huì)碰到一個(gè)歸并沖突并且必須去化解它。如果你想用更方便的方法來重新檢驗(yàn)?zāi)銉?chǔ)藏的變更赏酥,你可以運(yùn)行 git stash branch喳整,這會(huì)創(chuàng)建一個(gè)新的分支,檢出你儲(chǔ)藏工作時(shí)的所處的提交裸扶,重新應(yīng)用你的工作框都,如果成功捣鲸,將會(huì)丟棄儲(chǔ)藏砍艾。

$ git stash branch testchanges
Switched to a new branch "testchanges"
# On branch testchanges
# Changes to be committed:
#   (use "git reset HEAD <file>..." to unstage)
#
#      modified:   index.html
#
# Changes not staged for commit:
#   (use "git add <file>..." to update what will be committed)
#
#      modified:   lib/simplegit.rb
#
Dropped refs/stash@{0} (f0dfc4d5dc332d1cee34a634182e168c4efc3359)

這是一個(gè)很棒的捷徑來恢復(fù)儲(chǔ)藏的工作然后在新的分支上繼續(xù)當(dāng)時(shí)的工作肃续。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末淮阐,一起剝皮案震驚了整個(gè)濱河市渐扮,隨后出現(xiàn)的幾起案子帆吻,更是在濱河造成了極大的恐慌剃毒,老刑警劉巖樊拓,帶你破解...
    沈念sama閱讀 216,402評(píng)論 6 499
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件餐塘,死亡現(xiàn)場(chǎng)離奇詭異妥衣,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)戒傻,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,377評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門税手,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人需纳,你說我怎么就攤上這事芦倒。” “怎么了不翩?”我有些...
    開封第一講書人閱讀 162,483評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵兵扬,是天一觀的道長(zhǎng)麻裳。 經(jīng)常有香客問我,道長(zhǎng)器钟,這世上最難降的妖魔是什么津坑? 我笑而不...
    開封第一講書人閱讀 58,165評(píng)論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮傲霸,結(jié)果婚禮上疆瑰,老公的妹妹穿的比我還像新娘。我一直安慰自己昙啄,他們只是感情好穆役,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,176評(píng)論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著梳凛,像睡著了一般耿币。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上韧拒,一...
    開封第一講書人閱讀 51,146評(píng)論 1 297
  • 那天淹接,我揣著相機(jī)與錄音,去河邊找鬼叭莫。 笑死蹈集,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的雇初。 我是一名探鬼主播拢肆,決...
    沈念sama閱讀 40,032評(píng)論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼靖诗!你這毒婦竟也來了郭怪?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,896評(píng)論 0 274
  • 序言:老撾萬榮一對(duì)情侶失蹤刊橘,失蹤者是張志新(化名)和其女友劉穎鄙才,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體促绵,經(jīng)...
    沈念sama閱讀 45,311評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡攒庵,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,536評(píng)論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了败晴。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片浓冒。...
    茶點(diǎn)故事閱讀 39,696評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖尖坤,靈堂內(nèi)的尸體忽然破棺而出稳懒,到底是詐尸還是另有隱情,我是刑警寧澤慢味,帶...
    沈念sama閱讀 35,413評(píng)論 5 343
  • 正文 年R本政府宣布场梆,位于F島的核電站墅冷,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏或油。R本人自食惡果不足惜寞忿,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,008評(píng)論 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望装哆。 院中可真熱鬧罐脊,春花似錦定嗓、人聲如沸蜕琴。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽凌简。三九已至,卻和暖如春恃逻,著一層夾襖步出監(jiān)牢的瞬間雏搂,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,815評(píng)論 1 269
  • 我被黑心中介騙來泰國打工寇损, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留凸郑,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,698評(píng)論 2 368
  • 正文 我出身青樓矛市,卻偏偏與公主長(zhǎng)得像芙沥,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子浊吏,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,592評(píng)論 2 353

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

  • Git 基礎(chǔ) 基本原理 客戶端并不是只提取最新版本的文件快照而昨,而是把代碼倉庫完整的鏡像下來。這樣一來找田,任何一處協(xié)同...
    __silhouette閱讀 15,874評(píng)論 5 147
  • Git 命令行學(xué)習(xí)筆記 Git 基礎(chǔ) 基本原理 客戶端并不是只提取最新版本的文件快照歌憨,而是把代碼倉庫完整的鏡像下來...
    sunnyghx閱讀 3,913評(píng)論 0 11
  • Git是目前最流行的版本管理系統(tǒng),也是最先進(jìn)的分布式版本控制系統(tǒng)(distributed version cont...
    pro648閱讀 5,694評(píng)論 1 17
  • 一墩衙、電腦本地初始化一個(gè)倉庫 1. git init: 初始化一個(gè)電腦上本地倉庫 終端進(jìn)入項(xiàng)目目錄务嫡,輸入: 該命令將...
    dragon_li閱讀 2,910評(píng)論 1 4
  • 做人要心懷善念心铃。小的時(shí)候就期盼做一個(gè)正直的人,也是從那時(shí)候起萌生了學(xué)法的想法籽懦,因?yàn)槲蚁胫朗裁词菍?duì)于个,什么是錯(cuò),作出...
    0c90000b9f5a閱讀 929評(píng)論 0 3