iT邦幫忙

第 11 屆 iThome 鐵人賽

DAY 10
2
Software Development

用樂高玩轉 GIT 版本控制系列 第 10

Day 10 - 編輯到一半突然有其他事情插進來要先做,該怎麼辦?談 git stash

在閱讀的時候,如果突然有事情必須暫停,我們可能會在書裡夾上書籤,等待其他的事情處理完畢,再透過書籤回到正在閱讀的地方。而製作樂高手冊,假設目前正在做的這個步驟,想了想,想要晚點再放進來,但已經在舞台區的內容又不想歸零,那我們可能就會把目前用到的這些積木,先放到一個區域,稍微紀錄一下這些怎麼放,等時間點到了,再放回來,正式加入手冊裡。

那在 GIT 版本控制的機制裡,如果編輯一半的內容,想要保留,等待其他事情完成,再取回來,我們應該怎麼做呢?

GIT 的暫存指令

指令:git stash

在 GIT 的環境裡,裡頭假設現在原始碼編輯到一半突然有其他事情必須要先處理,而目前已經編輯到一半的原始碼內容又不想要還原,想保留下來,這時候就可以使用 git stash 指令。我們首先以 SourceTree 軟體作一次示範。

如下圖,我們有六行的原始碼編輯到一半,要暫存:

右邊顯示編輯了六行的原始碼

這時候點選畫面上方的 stash 指令,會跳出訊息,詢問你要不要記錄點什麼訊息。

右邊顯示編輯了六行的原始碼

點下stash 之後,在畫面左邊的 SATSHES區域就可以看到標示在 master 上的剛剛那些原始碼。

左邊的 STASHES 區域

這時候,如果需要還原回來,也只需要在左邊想要還原的那則訊息上,點選右鍵選擇「apply stash」;也可以再要還原的 stash 上連點兩下,效果一樣。

選擇 stash 作 apply stash

而後依據還要不要保留這個 stash 勾選「Delete after applying」,再選擇「OK」就可以還原回來剛剛的暫存了。

點選選擇及 OK 的畫面

還原的部分,細節就如以下的動畫所示:

動畫一次操作 apply stash

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 區域裡,如果這時候不要讓檔案進到 stash 區,則在 SourceTree 的畫面上,要記得選擇 「Keep staged changes」,如下圖:

Keep staged changes

這樣還在舞台區的變更們,就不會被帶進 stash 區域裡。其參數對應在 CLI 下,則是在 git shash push 之後加上 --keep-index 參數,如 git shash push --keep-index

總結:

git stash 指令是我個人還蠻常使用的指令,也都是用在臨時有其他狀況,必須先切換到其他分支,之後再從暫存區取回來的情境。


上一篇
Day 09 - 寫好的手冊想改寫怎麼辦?談 GIT RESET
下一篇
Day 11 - 切換 branch 與 還原目前工作區檔案:git checkout, restore, switch
系列文
用樂高玩轉 GIT 版本控制30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

1 則留言

0
PeterLiao
iT邦新手 4 級 ‧ 2019-09-27 21:24:16

如果是直接切換 branch 處理完其他事再切回來,
這跟 stash 是兩種完全不同的需求嗎?

看更多先前的回應...收起先前的回應...
墨嗓 iT邦研究生 4 級 ‧ 2019-09-27 21:28:26 檢舉

stash 的用意在於,把寫到一半還沒 commit (還沒進儲存庫)的那些變更暫存起來。

而 branch 就真的在儲存庫裡的切換。不太一樣的需求。

PeterLiao iT邦新手 4 級 ‧ 2019-09-27 21:40:58 檢舉

喔喔! 有更理解了, 感謝~

今天早上起來腰跟手臂好痠 XD

jjlayyl iT邦新手 5 級 ‧ 2019-10-22 17:39:35 檢舉

記得之前遇過code寫一寫突然要去改別的branch,這個時候我也是採用stash的方式去處理,想請問如果這邊用checkout branch會很怪嗎?

墨嗓 iT邦研究生 4 級 ‧ 2019-10-23 10:28:23 檢舉

checkout branch 跟 stash 要解決的問題不一樣唷。

  • stash 是把還沒放到儲存庫的變更,存起來。
  • checkout branch 是把目前工作的位置,切換到另外的分支上。

所以,如果是工作到一半,想切換到其他分支,改其他分支的內容的話,則需要先把還沒放到目前分支的變更存到 stash,而後 checkout branch 到另外一個分支。

另外一個角度,如果你目前工作的分支裡頭有修改到兩個分支的有的原始碼,則直接執行 git checkout 時,GIT 即會提醒必須要把有變更的內容存起來 stash。

再另外一個角度,如果懶的儲存,也懶得分支切來切去,可以試試看 GIT 在 2.5 版之後提供的 worktree 功能。

我要留言

立即登入留言