作者 | 梁唐
來源 | TechFlow(ID:techflow2019)
頭圖 | CSDN 下載自東方IC
大家好,今天的文章我們來介紹 git 當中一個非常常用的功能——儲藏。
大家在協同開發的時候應該都有這樣的經曆,有的時候我們的功能開發了一半,因為某些原因我們想要 checkout 到其他的分支上查看代碼或者是執行某個工作。但是如果我們直接執行 checkout,git 會禁止我們的行為。
我拿本地的項目舉個例子,可以看到當我們執行了 checkout 命令之後,git 提示我們在一些文件的改動會被覆蓋,所以拒絕了我們的 checkout 命令。
image-20201023084358700
這個時候應該怎麼辦呢?最好的辦法當然是使用 git commit 把改動提交了。但問題是有的時候我們不想提交一些代碼,比如還沒有經過嚴謹的測試,或者是我們臨時開發的一些測試功能等等。在這種情況下 commit 也是不合适的,即使提交了了,之後在 push 之前也會要把 commit 撤銷了。但如果一不小心忘記了,可能就會造成悲劇。
針對這個問題,git 提供了一個解決策略就是 stash 功能。
儲藏改動
git stash 可以将本地還沒有提交的改動全部存儲起來。接着,我們在之前的某一篇文章當中加上一行 -test stash。
我們執行一下 git diff,可以看到這行改動。
接着我們執行 git stash,會發現我們的 git 目錄又回到了沒有改動的狀态。再執行 git diff 也看不到任何改動了。
這是因為 git 把我們本地還沒有提交的改動都暫存了起來,這樣方便我們進行 checkout 或者是其他一些操作,而不會起沖突或者是其他的影響。
應用改動
那麼當我們操作完成之後,想要還原剛才暫存起來的内容,這個時候應該怎麼辦呢?
也有辦法,我們隻需要使用 git stash apply 或者是 git stash pop 這兩個命令就可以将剛才暫存起來的内容還原了。但是這裡有一個問題,就是 stash apply 和 pop 之間是不同的。
這裡涉及到 stash 内部的實現機制,stash 内部其實是通過堆棧實現的。pop 對于堆棧而言很明确,就是彈出的意思。也就是說如果我們使用的是 pop,那麼當我們 pop 之後,這條記錄會在堆棧當中删除。而如果使用的是 apply 呢,記錄不會從堆棧當中删除,仍然會保留下來。
一般情況下我使用 pop 多一些,但是 pop 也有缺點,比如 pop 沒有辦法選擇應用的記錄。我們可以使用 git stash list 來查看一下當前堆棧當中已經有的記錄。
如果我們使用 git stash pop 的話,默認的是應用的棧頂的記錄,也就是 stash@{0}。但如果我們使用 stash apply 的話,我們可以自由選擇我們想要應用的記錄。比如如果我們想要應用最後一條記錄的話,我們可以這樣:
git stash apply stash@{2}
關于應用儲存的修改也有一些細節,首先是儲藏和修改對應的分支可以不同。我們可以在一個分支儲藏,之後切換到另外一個分支進行應用。并且如果我們在應用之前修改了同樣的内容的話,也會引起合并沖突。
另外就是當我們應用儲藏的時候,會發現我們之前add過的文件又重新回到了未暫存的狀态。如果我們想要重新回到文件被暫存的狀态時,我們可以使用 index 選項來執行。
git stash apply --index
對于我們已經不想要的儲藏記錄,我們可以執行 git stash drop 來進行删除。
其他技巧
除了上述的功能之外,git stash 還有一些其他的用法。
比如 --keep-index 選項,在不加這個選項的時候,當我們使用 git stash,它會把所有沒有 commit 的内容全部 stash。但是有的時候我們不希望這樣,我們希望它隻暫存我們沒有add到暫存區的内容。這個時候我們就可以通過這個參數實現。
另外一個參數是-u 或者是 --include-untracked,我們從這個名字上也看得出來。它們的意思是在 stash 的時候将新創建并且還沒有被 git 管理的文件也一并儲藏起來。
除此之外,還有--patch 的功能也很常用。patch 我們曾經在上篇文章講解交互式命令的時候講到過,它可以将 git 針對的改動縮小到代碼而不是文件級别。交互式地和我們操作哪些代碼層面的改動需要存儲起來,操作方法和上篇文章介紹的一樣。大家如果有所遺忘可以在文末找到上一篇的文章進行回顧。
最後一個功能是從儲藏上新建一個分支,有的時候我們先儲存了代碼之後又繼續進行了一些工作。這個時候如果我們再恢複從前的改動則會引起沖突。這個時候我們可以運行 git stash branch 新建一個新的分支,在這個分支上應用我們的提交。
git stash branch applystash
應用成功之後 Git 會自動抛棄掉對應的 stash 記錄,非常方便,不過我個人沒有用過,因為實際工作當中沒有遇到這麼複雜的情況。
,更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!