作者 | 梁唐
來源 | 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每日頭條,我们将持续为您更新最新资讯!