天天看點

Git裡的stash指令的應用

git stash 使用的頻率可能不如git commit、git push那麼多,但是在某一些場景下 能起到很好的效果,下面介紹git stash常用場景。

場景一

小明在一家代碼管理做的不是很好的公司上班,開發&生産全在master分支上進行。

有一天,小明正開心的敲着新功能業務的代碼。

突然,項目經理說。線上出了個BUG,要小明趕緊解決。(MMP的)

小明說:老子新功能還沒寫完呢,又來BUG要修複。但是小明不能直接修複BUG去送出,因為目前還有未開發完整的功能也在master分支上。

如果将寫到一半的代碼退回,再去修複BUG,那後面不是需要重新寫一遍現在寫過的代碼。這是在做重複廉價勞動,對于小明這樣優雅的程式員來說是萬萬不可能的。

小明的推薦做法就是:

使用git stash将目前工作區未送出的變動儲存起來,然後去再修改BUG送出到遠端,修複線上的BUG,然後本地git stash pop繼續優雅的寫。

場景二:

小明在寫一個 統計功能 的業務代碼,由于業務簡單 小明直接在develop分支上進行開發。

這個時候小李在維護另外一個資料查詢子產品,小李是個天天混日子的人,經常寫BUG,是以這次又寫了BUG。但是恰恰不巧的是,這次出的BUG影響到了小明寫的 統計功能 業務(小明心裡一群可愛的小馬奔跑)。

小李修複好BUG後對小明說,我在develop上commit了一個fix修複了那個BUG,你pull一下代碼。

小明這時候自己 統計功能的業務代碼 還沒寫完,甚至還有文法錯誤。但是又必須合并小李送出的代碼,因為自己開發的功能基于對方的結果。小明心裡難受啊~

現在可以有兩種處理方法:

1、直接commit目前工作區到develop分支,然後pull遠端的develop合并到本地develop,然後繼續開發(pull指令一般需要在目前工作區幹淨的情況下才被允許)。這樣其實沒什麼問題。但是會産生一個commit,且這個commit是功能不完整的(其實很多程式員就是這樣幹的)。

2、使用git stash, 先使用git stash 将目前工作區未commit的變動儲存起來,然後工作區移除這些變動,目前工作區變成幹淨的。這個時候就可以git pull拉取遠端代碼合并。然後在git pop将上一次儲存起來的變動代碼再放出來。這樣沒有産生commit,可以繼續寫了。

場景三:

小明接到一個需求,讓他嘗試性的去研究一下一個功能的實作。但是小明沒做過,也沒有人可以請教,隻好自己開始折騰。

在嘗試性的修修改改了一堆檔案後,發現可能順着這個思路行不通。準備另外換一個方向重寫。但是在之前的嘗試當中,發現自己寫了幾段非常棒的地方。想儲存下來或者思考也許會對後面的新思路可能有借鑒。

現在可以有三種處理方法:

1、将之前的修改過的地方全部撤回修改,然後複制那段覺得很棒的代碼在其他文本裡(不過失去上下文環境的 孤立代碼段在 以後review将會很難了解)。

2、将修改的代碼注釋掉,然後在後面寫新的代碼。

3、使用git stash指令,然後重新寫。

其實都不用多說了,哪一種更好。

git stash 相關指令的一些常用介紹

添加一個stash

git stash # 該指令會情況目前工作區 還未commit的變動,儲藏起來。
           

添加一個stash并備注

git stash push -m "message" # 儲藏工作區中未送出的變動,并添加備注message
           

檢視已經儲存的stash清單

git stash list # 檢視儲藏

[email protected]{0}: WIP on master: 049d078 added the index file
[email protected]{1}: WIP on master: c264051 Revert "added file_size"
[email protected]{2}: WIP on master: 21d80a5 added number to log

           

應用最新儲存的stash并删除存儲棧裡面的記錄

git stash pop # 應用最新一個,并删除
           

應用儲藏 但不删除

git stash apply # 預設最近一個
git stash apply [email protected]{2} # 恢複指定一個儲藏
           

删除儲藏

git stash drop [email protected]{2}
           

檢視儲藏(與目前工作區做對比)

git stash show  [email protected]{1} -p # 檢視具體某個儲藏的差異
           

更近一步了解git stash

你可以看到 git stash 重新修改了你所儲藏的那些當時尚未送出的檔案。上面的案例中,你應用儲藏的工作目錄是幹淨的,并且屬于同一分支;

但是一個幹淨的工作目錄和應用到相同的分支上并不是應用儲藏的必要條件。

  • 你可以在其中一個分支上保留一份儲藏,随後切換到另外一個分支,再重新應用這些變更。
  • 在工作目錄裡包含已修改和未送出的檔案時,你也可以應用儲藏——Git 會給出歸并沖突如果有任何變更無法幹淨地被應用。