在閱讀的時候,如果突然有事情必須暫停,我們可能會在書裡夾上書籤,等待其他的事情處理完畢,再透過書籤回到正在閱讀的地方。而製作樂高手冊,假設目前正在做的這個步驟,想了想,想要晚點再放進來,但已經在舞台區的內容又不想歸零,那我們可能就會把目前用到的這些積木,先放到一個區域,稍微紀錄一下這些怎麼放,等時間點到了,再放回來,正式加入手冊裡。
那在 GIT 版本控制的機制裡,如果編輯一半的內容,想要保留,等待其他事情完成,再取回來,我們應該怎麼做呢?
指令:git stash
在 GIT 的環境裡,裡頭假設現在原始碼編輯到一半突然有其他事情必須要先處理,而目前已經編輯到一半的原始碼內容又不想要還原,想保留下來,這時候就可以使用 git stash
指令。我們首先以 SourceTree 軟體作一次示範。
如下圖,我們有六行的原始碼編輯到一半,要暫存:
這時候點選畫面上方的 stash
指令,會跳出訊息,詢問你要不要記錄點什麼訊息。
點下stash
之後,在畫面左邊的 SATSHES區域就可以看到標示在 master 上的剛剛那些原始碼。
這時候,如果需要還原回來,也只需要在左邊想要還原的那則訊息上,點選右鍵選擇「apply stash」;也可以再要還原的 stash 上連點兩下,效果一樣。
而後依據還要不要保留這個 stash 勾選「Delete after applying」,再選擇「OK」就可以還原回來剛剛的暫存了。
還原的部分,細節就如以下的動畫所示:
P.S. 目前這張動畫結尾沒呈現到檔案復原的畫面
git stash
的小細節git stash
在 CLI 模式下git stash push
: 在 git stash
指令中,其實完整的指令是 git stash push
也就是 push 為預設,可以省略。git stash list
: 可以列出目前在 stash 區域中的暫存列表。git stash pop
: push 與 pop 是一對的,把變更推入使用 push,那推出來還原,當然就是使用 pop 囉,但要記得,先進後出,如果使用 pop 把 stash 還原回來,在沒有接參數的狀況下,最後一筆 stash 會先被推出來。如果要指令某一筆 stash,則只要在尾巴接上 stash 的名稱,如 git stash pop stash@{1}
git stash apply
: 與 pop 的行為一致,但不會把 stash 的暫存清除。git stash drop
: 清除某一筆 stash,可以從 git stash list
查看 stash 的名稱,如:stash@{1}
,那就是 git stash drop stash@{1}
。對應 GUI,也就是 SourceTree 上面顯示的:「Delete Stash」。git stash clear
: 清除所有的 stash 區域暫存。實作的時候可能會發現,如果已經部分的變更已經放在舞台區,這時候選擇 stash 則會把舞台區的檔案們也一併的存到 stash 區域裡,如果這時候不要讓檔案進到 stash 區,則在 SourceTree 的畫面上,要記得選擇 「Keep staged changes」,如下圖:
這樣還在舞台區的變更們,就不會被帶進 stash 區域裡。其參數對應在 CLI 下,則是在 git shash push
之後加上 --keep-index
參數,如 git shash push --keep-index
。
git stash
指令是我個人還蠻常使用的指令,也都是用在臨時有其他狀況,必須先切換到其他分支,之後再從暫存區取回來的情境。
如果是直接切換 branch 處理完其他事再切回來,
這跟 stash 是兩種完全不同的需求嗎?
stash 的用意在於,把寫到一半還沒 commit (還沒進儲存庫)的那些變更暫存起來。
而 branch 就真的在儲存庫裡的切換。不太一樣的需求。
喔喔! 有更理解了, 感謝~
今天早上起來腰跟手臂好痠 XD
記得之前遇過code寫一寫突然要去改別的branch,這個時候我也是採用stash的方式去處理,想請問如果這邊用checkout branch會很怪嗎?
checkout branch 跟 stash 要解決的問題不一樣唷。
所以,如果是工作到一半,想切換到其他分支,改其他分支的內容的話,則需要先把還沒放到目前分支的變更存到 stash,而後 checkout branch 到另外一個分支。
另外一個角度,如果你目前工作的分支裡頭有修改到兩個分支的有的原始碼,則直接執行 git checkout 時,GIT 即會提醒必須要把有變更的內容存起來 stash。
再另外一個角度,如果懶的儲存,也懶得分支切來切去,可以試試看 GIT 在 2.5 版之後提供的 worktree 功能。