【Git 系列】一個超好用的命令你會用嗎?

風塵部落格發表於2021-11-12

stash在英文意思是隱藏。git stash 的作用也是隱藏沒完成的程式碼,防止它干擾別人或者新分支的工作。

一、背景

1.1 我們經常會遇到這樣的情況

正在 dev 分支開發新功能,做到一半時有人過來反饋一個 bug ,需要馬上解決,但是新功能做到了一半你又不想提交。

這時就可以使用 git stash 命令先把當前進度儲存起來,然後切換到另一個分支去修改bug;修改完提交後,再切回 dev 分支,使用git stash pop來恢復之前的進度繼續開發新功能。

看到這裡,有些小夥伴就有疑問:沒必要啊,修 BUG 的時候,直接切換分支,修改完提交後再切回來到原來的分支不就行了。

1.2 真的要這麼麻煩嗎?

  • 比如有情景如下:
  1. dev 分支下建立一個檔案 dev_file.txt,並 add,讓它 stage
  2. 這時切到 master 分支,你會看到這個 dev_file.txt 居然也在 master 分支裡。他不是應該只在 dev 分支嗎?
  • 如果你試試你再試試:
  1. 切回 dev 分支,執行 git stash
  2. 這時你在切回 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命令,就會發現當前是一個乾淨的工作區,沒有任何改動。

  1. git stash 是本地的,不會上傳到伺服器上;
  2. 可以通過使用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 或者忘記切程式碼啥的,我們應該考慮的不是這個命令的問題,是開發質量的範疇了。

相關文章