Git 入門(mén)系列(五)- stash 貯藏

我在當(dāng)前分支開(kāi)發(fā)了偿洁,開(kāi)發(fā)一部分,然后需要在其他分支解決問(wèn)題沟优,怎么辦涕滋?

在介紹合并的時(shí)候,有提到需要保持分支干凈挠阁,所以將修改的內(nèi)容提交后再合并操作宾肺。此時(shí)如果還不想提交的話,可以使用 git stash 命令將修改的內(nèi)容保存至 堆棧區(qū)侵俗,待合適的時(shí)候恢復(fù)锨用。如果在錯(cuò)誤的分支進(jìn)行了開(kāi)發(fā),也可以先將內(nèi)容保存至堆棧區(qū)隘谣,然后在目標(biāo)分支恢復(fù)內(nèi)容增拥。

stash 顧名思義就是儲(chǔ)藏,在 Git 管理中可以將工作區(qū)的內(nèi)容先存起來(lái),然后合適的時(shí)候再拿出來(lái)跪者。

學(xué)會(huì)使用 stash 能很好的輔助我們進(jìn)行分支的管理和維護(hù)棵帽,命令也比較簡(jiǎn)單,主要有以下幾個(gè)操作渣玲。

儲(chǔ)存修改的內(nèi)容

git stash

可以將所有未提交的修改(工作區(qū)和暫存區(qū)的內(nèi)容逗概,不包括 untracked 文件或目錄) 保存至堆棧區(qū),在需要的時(shí)候恢復(fù)內(nèi)容忘衍,可以是同分支逾苫,也可以是不同的分支。

在 master 分支創(chuàng)建一個(gè)名為 stash 1.txt 的文件枚钓,然后使用 stash 放入堆棧區(qū)

git stash save <message>

  • 用法同 git stash铅搓,如果使用 git stash,會(huì)產(chǎn)生一條名為" WIP on branchname …?"的內(nèi)容搀捷,使用 git stash save 可以添加描述信息

創(chuàng)建一個(gè) stash 2.txt星掰,再操作一次,那么 stash 2 這個(gè)改動(dòng)也被放入了堆棧區(qū)


默認(rèn)情況下嫩舟,git stash 會(huì)緩存下列文件:

  • 添加到暫存區(qū)的修改(staged changes)
  • Git 跟蹤的但并未添加到暫存區(qū)的修改(unstaged changes)

但不會(huì)緩存以下文件:

  • 在工作目錄中新的文件(untracked files)
  • 被忽略的文件(ignored files)

git stash 命令提供了參數(shù)用于緩存上面兩種類(lèi)型的文件氢烘。

  • 使用 -u 或者 --include-untracked 可以 stash untracked 文件。
  • 使用 -a 或者 --all 命令可以 stash 當(dāng)前目錄下的所有修改家厌。

完整的 git stash 命令如下播玖,可以根據(jù)需求使用(參考文檔 https://git-scm.com/docs/git-stash/2.0.0
git stash [save [-p|--patch] [-k|--[no-]keep-index] [-q|--quiet] [-u|--include-untracked] [-a|--all] [<message>]]
順便說(shuō)下,在參數(shù)說(shuō)明中饭于,中括號(hào)[] 的內(nèi)容表示是可選項(xiàng)

查看 stash 棧

git stash list 可以查看 stash 的內(nèi)容
下面顯示的兩條蜀踏,分別是第一次操作 git stash 和第二次操作 git stash save stash 2 產(chǎn)生的兩條記錄,可以看出掰吕,stash 儲(chǔ)藏是棧的形式果覆,最新的一條記錄在棧頂。

應(yīng)用 stash

如果想應(yīng)用 stash 的內(nèi)容畴栖,有兩種命令可以實(shí)現(xiàn)

git stash pop

git stash pop 命令會(huì)恢復(fù)之前緩存的工作目錄随静,這個(gè)指令將緩存堆棧中的第一個(gè) stash 刪除(棧是先進(jìn)后出)


在 pop 之后 我們最后入棧的改動(dòng) stash 2.txt 恢復(fù)了八千,而且 stash 列表也被刪除了

pop 后面也可以添加 <stash>吗讶, git stash pop <stash> 來(lái)恢復(fù)指定的 stash 內(nèi)容
<stash> 表示 stash 名稱(chēng),具體用 stash@{n} 表示恋捆。比如stash@{0}是棧頂(最新的)的內(nèi)容, stash@{1} 就是更早的照皆,前一個(gè)內(nèi)容。通過(guò) git stash list 也可以查看每個(gè)的 stash 編號(hào)

git stash apply

后面也可接 <stash> 沸停,git stash apply <stash> 應(yīng)用某一個(gè)stash 內(nèi)容膜毁,不刪除記錄,默認(rèn)是應(yīng)用棧頂(即最新)的一條 stash

為了方便說(shuō)明,再新建一個(gè) stash 3.txt 瘟滨,并且 stash


此時(shí)將前一個(gè) stash 1.txt 恢復(fù): git stash apply stash@{1}

文件 stash 1.txt 恢復(fù)了候醒,并且在stash list 中也沒(méi)有被刪除
(可能有人問(wèn),前面恢復(fù)的 文件 stash 2.txt 去哪兒了杂瘸?在進(jìn)行 stash 3 操作時(shí)倒淫,stash 2.txt 和 stash 3.txt 都是在暫存區(qū),所以都暫存到第三次 stash 中了)

刪除 stash 內(nèi)容

若某個(gè) stash 內(nèi)容不會(huì)再被應(yīng)用了败玉,可以使用 git stash drop [<stash>] 刪除敌土,默認(rèn)為棧頂?shù)?stash
刪除掉剛剛恢復(fù)的內(nèi)容 git stash drop stash@{1}

清空 stash 堆棧

git stash clear會(huì)將堆棧所有內(nèi)容清空
使用 git stash clear 之后,再看下 list运翼, list 中已經(jīng)沒(méi)有內(nèi)容了

查看 stash 的 diff

git stash show [ -p | --patch] <stash>返干, show 這個(gè)命令會(huì)顯示 stash 的修改內(nèi)容
當(dāng)前 添加一個(gè)名為 stash.txt 文件,并且在 text.txt 文件追加一行內(nèi)容 "Line: stash add"血淌,將這些修改 stash 一下

  • git stash show 可以查看 stash 的 diff
  • git stash show -p 添加 -p 或者 --patch 可以查看 stash 的全部 diff
  • git stash show [ -p | --patch] [<stash>] show 后面可以跟 <stash> 查看特定 stash 的 diff

創(chuàng)建含有 stash 內(nèi)容的分支

其實(shí)在應(yīng)用 stash 的過(guò)程中矩欠,也可能和當(dāng)前內(nèi)容產(chǎn)生沖突,比如下面 ===== 上面是應(yīng)用 stash 之前的內(nèi)容悠夯,下面就是 stash 的內(nèi)容晚顷,此時(shí)也是需要解決沖突的(和合并差不多)

<<<<<<< Updated upstream
Line:stash branch
=======
Line: stash add
>>>>>>> Stashed changes

如果 stash 的內(nèi)容是未完成的內(nèi)容,此時(shí)應(yīng)用還要先處理沖突再繼續(xù)完成之前的內(nèi)容疗疟,那么推薦使用 stash 的 branch 命令

git stash branch <new_branch> [<stash>]

這個(gè)命令的作用是:會(huì)創(chuàng)建一個(gè)新的分支该默,檢出(checkout)在儲(chǔ)藏工作時(shí)的所處的提交,重新應(yīng)用 stash 內(nèi)容策彤,如果成功栓袖,將會(huì)丟棄(drop)該條 stash 的內(nèi)容。

什么意思呢店诗,看下圖:現(xiàn)在在 Commit 2 除裹刮,儲(chǔ)存了一次修改的內(nèi)容,然后提交了 C3庞瘸,之后又 stash 了一次
如果是 git stash branch <new_branch> stash@{1}那么就是在 C2 處 創(chuàng)建并切換一個(gè)分支捧弃,并將 Stash 1 的內(nèi)容帶到新的分支中,此時(shí) Stash 1 就會(huì)在 list 中刪除

上面介紹了 stash 用法擦囊,stash 功能在 Git 版本管理中是非常實(shí)用的功能违霞,再來(lái)復(fù)習(xí)下 stash 相關(guān)命令

git stash 儲(chǔ)存修改的內(nèi)容
git stash save [<message>] 儲(chǔ)存修改的內(nèi)容,可以添加描述瞬场,如果沒(méi)有描述 Git 會(huì)默認(rèn)添加买鸽,
git stash save -u [<message>] 前面可以?xún)?chǔ)存的內(nèi)容包含暫存區(qū)和工作區(qū)的內(nèi)容

  • 使用 -u 或者 --include-untracked 可以 stash untracked 文件。
  • 使用 -a 或者 --all命令可以 stash 當(dāng)前目錄下的所有修改贯被。

git stash list 查看已經(jīng) stash 的棧

git stash show 可以查看 stash 的 diff
git stash show -p 添加 -p 或者 --patch 可以查看 stash 的全部 diff
上面命令后面都可以添加 <stash> 以查看特定 stash 的 diff

git stash pop <stash> 應(yīng)用指定的 stash 內(nèi)容眼五,并刪除 list 中的 stash 記錄
git stash apply <stash> 應(yīng)用指定的 stash 內(nèi)容妆艘,不刪除 list 中的 stash 記錄
git stash drop <stash> 刪除指定的 stash 內(nèi)容
git stash clear 清空 stash 棧

git stash branch <new_branch> [<stash>] 在儲(chǔ)藏工作時(shí)的所處的提交處創(chuàng)建一個(gè)新分支并切換,重新應(yīng)用 stash 內(nèi)容看幼,完成后批旺,將會(huì)丟棄該條 stash 的內(nèi)容。

以上未明確 <stash> 時(shí) 诵姜,默認(rèn)為棧頂?shù)?stash

stash 的命令有些多朱沃,但其實(shí)并不復(fù)雜,孰能生巧茅诱,會(huì)在 Git 管理中起到大的作用的逗物!

系列文章傳送門(mén)

Git 入門(mén)系列(一)- Git 概念/安裝/基本操作/遠(yuǎn)程推送更新
Git 入門(mén)系列(二)- 修改管理 / 撤銷(xiāo)操作 / 命令及區(qū)間關(guān)系
Git 入門(mén)系列(三)- 分支(上)創(chuàng)建與切換 / 合并 / 查看 / 刪除
Git 入門(mén)系列(四)- 分支(下)合并解決沖突 / 遠(yuǎn)程分支
Git 入門(mén)系列(五)- stash 貯藏
Git 入門(mén)系列(六)- 標(biāo)簽 tag
Git 入門(mén)系列(七)- 可視化 Git 管理工具
Git 入門(mén)系列(八) - FAQ

歡迎關(guān)注個(gè)人公眾號(hào),【程序媛春哥的手記】


最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末瑟俭,一起剝皮案震驚了整個(gè)濱河市翎卓,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌摆寄,老刑警劉巖失暴,帶你破解...
    沈念sama閱讀 212,718評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異微饥,居然都是意外死亡逗扒,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,683評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門(mén)欠橘,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)矩肩,“玉大人,你說(shuō)我怎么就攤上這事肃续∈蜷荩” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 158,207評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵始锚,是天一觀的道長(zhǎng)刽酱。 經(jīng)常有香客問(wèn)我续滋,道長(zhǎng)虱肄,這世上最難降的妖魔是什么群扶? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,755評(píng)論 1 284
  • 正文 為了忘掉前任宽闲,我火速辦了婚禮,結(jié)果婚禮上聚至,老公的妹妹穿的比我還像新娘系枪。我一直安慰自己命迈,他們只是感情好皮钠,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,862評(píng)論 6 386
  • 文/花漫 我一把揭開(kāi)白布稳捆。 她就那樣靜靜地躺著,像睡著了一般麦轰。 火紅的嫁衣襯著肌膚如雪乔夯。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 50,050評(píng)論 1 291
  • 那天款侵,我揣著相機(jī)與錄音末荐,去河邊找鬼。 笑死新锈,一個(gè)胖子當(dāng)著我的面吹牛甲脏,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播妹笆,決...
    沈念sama閱讀 39,136評(píng)論 3 410
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼块请,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了拳缠?” 一聲冷哼從身側(cè)響起墩新,我...
    開(kāi)封第一講書(shū)人閱讀 37,882評(píng)論 0 268
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎窟坐,沒(méi)想到半個(gè)月后海渊,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,330評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡哲鸳,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,651評(píng)論 2 327
  • 正文 我和宋清朗相戀三年臣疑,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片徙菠。...
    茶點(diǎn)故事閱讀 38,789評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡讯沈,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出婿奔,到底是詐尸還是另有隱情芙盘,我是刑警寧澤,帶...
    沈念sama閱讀 34,477評(píng)論 4 333
  • 正文 年R本政府宣布脸秽,位于F島的核電站儒老,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏记餐。R本人自食惡果不足惜驮樊,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,135評(píng)論 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望片酝。 院中可真熱鬧囚衔,春花似錦、人聲如沸雕沿。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,864評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)审轮。三九已至肥哎,卻和暖如春辽俗,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背篡诽。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,099評(píng)論 1 267
  • 我被黑心中介騙來(lái)泰國(guó)打工崖飘, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人杈女。 一個(gè)月前我還...
    沈念sama閱讀 46,598評(píng)論 2 362
  • 正文 我出身青樓朱浴,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親达椰。 傳聞我的和親對(duì)象是個(gè)殘疾皇子翰蠢,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,697評(píng)論 2 351