stash
在英文意思是隱藏。git stash
的作用也是隱藏沒完成的程式碼,防止它干擾別人或者新分支的工作。
一、背景
1.1 我們經常會遇到這樣的情況
正在
dev
分支開發新功能,做到一半時有人過來反饋一個bug
,需要馬上解決,但是新功能做到了一半你又不想提交。
這時就可以使用 git stash
命令先把當前進度儲存起來,然後切換到另一個分支去修改bug
;修改完提交後,再切回 dev
分支,使用git stash pop
來恢復之前的進度繼續開發新功能。
看到這裡,有些小夥伴就有疑問:沒必要啊,修 BUG
的時候,直接切換分支,修改完提交後再切回來到原來的分支不就行了。
1.2 真的要這麼麻煩嗎?
- 比如有情景如下:
- 在
dev
分支下建立一個檔案dev_file.txt
,並add
,讓它stage
; - 這時切到
master
分支,你會看到這個dev_file.txt
居然也在master
分支裡。他不是應該只在dev
分支嗎?
- 如果你試試你再試試:
- 切回
dev
分支,執行git stash
; - 這時你在切回
master
分支,dev_file.txt
就消失了。
這時候,我不禁想說:git stash,YYDS !
二、git stash
當你執行 git stash
時會提醒你:
Saved working directory and index state WIP on newF2: b63fbcb add dev_file.txt
HEAD is now at b63fbcb add dev_file.txt。
它已經把 dev_file.txt
儲存好了。
2.1 git stash 幹了什麼
它會儲存當前工作進度,會把暫存區和工作區的改動儲存到一個未完結變更的堆疊中;執行完這個命令後,在執行git status
命令,就會發現當前是一個乾淨的工作區,沒有任何改動。
git stash
是本地的,不會上傳到伺服器上;- 可以通過使用
git stash save 'message...'
可以新增一些註釋。
2.2 git stash 相關命令
命令名 | 作用 |
---|---|
git stash | 隱藏當前的工作現場, 此時, git status的結果是 clean |
git stash list | 檢視所有隱藏, 每一行的冒號前面的字串就是標識此隱藏的id |
git stash apply |
重新顯示標識為 id 的隱藏 |
git stash drop |
git apply恢復隱藏後, 需要手動刪除 list 列表中的記錄 |
git stash pop | 恢復最新的進度到工作區 |
git stash pop stash@[stash_id] | 恢復指定的進度到工作區 |
如:
git stash pop stash@{1}
。stash_id
是通過git stash list
命令得到的;
三、git stash 使用場景
3.1 有人與我改動同一分支
我在本地修改好後,發現遠端分支已經被改動了,此時我本地也被改動了就造成了衝突,無法
push
或者pull
。
此時,就可以用 git stash
來處理
// 把本地的改動暫存起來
git stash
// 拉取遠端分支(此時本地分支會回滾到上次commit的情況,你的改動都存在stash中)
git pull
// 將stash中改動重新加回本地分支,就可以繼續修改了,當然,如果改好了就是add,commit,push
git stash pop
3.2 不小心改動了其他分支
例如忘記切換,將程式碼寫錯了分支,直接在
master
分支上做改動,這裡假設我的分支是feature/category_vechice
分支。
// 把本地當前改動暫存起來,此時master分支就恢復到了上次拉取時的狀態
git stash
// 切換到需要改動的分支
git checkout test
// 將改動pop到自己當前的分支
git stash pop
四、小結
顧名思義,
stash
就是一個棧,平時我們把需要暫存的檔案存到棧中,把程式碼恢復到上次拉取的狀態以進行操作。
就我個人使用而言,git stash pop
就已經滿足日常需要了,畢竟頻繁的線上 bug
或者忘記切程式碼啥的,我們應該考慮的不是這個命令的問題,是開發質量的範疇了。