應用舉例
通過幾個實際的示例來了解一下git stash
的強大.
開發到一半,同步遠端代碼
當你的開發進行到一半,但是代碼還不想進行提交 ,然後需要同步去關聯遠端代碼時.如果你本地的代碼和遠端代碼沒有衝突時,可以直接通過git pull
解決.但是如果可能發生衝突怎麼辦.直接git pull
會拒絕覆蓋當前的修改.
遇到這種情況,需要先保存本地的代碼,進行git pull
,然後再pop出本地代碼:
git stash
git pull
git stash pop
工作流被打斷,需要先做別的需求
當開發進行到一半需要修改一個線上BUG,當然,你可以開一個新的分支,把當前代碼提交過去,回頭再merge,具體代碼如下
繁瑣的工作流示例
# ... hack hack hack ...
git checkout -b my_wip
git commit -a -m "WIP"
git checkout master
edit emergency fix
git commit -a -m "Fix in a hurry"
git checkout my_wip
git reset --soft HEAD^
# ... continue hacking ...
我們可以通過git stash
來簡化這個流程
正確姿勢
# ... hack hack hack ...
git stash //保存開發到一半的代碼
edit emergency fix
git commit -a -m "Fix in a hurry"
git stash pop //將代碼追加到最新的提交之後
# ... continue hacking ...
提交特定文件
如果對多個文件做了修改,但是隻想提交幾個文件,或者想先暫時保存幾個修改,測試其他文件的執行結果.可以通過git stash save --keep-index
來進行.
# ... hack hack hack ...
git add --patch foo //只將第一部分加入管理the index
git stash save --keep-index //將其餘部分保存起來
edit/build/test first part
git commit -m 'First part' //提交全部的git管理中的代碼
git stash pop //繼續進行存儲代碼的工作
# ... repeat above five steps until one commit remains ...
edit/build/test remaining parts
git commit foo -m 'Remaining parts'
恢復被錯誤clear/drop
的存儲
如果因爲失誤對存儲倉庫進行了clear
或者drop
操作,在一般機制下是不能恢復的.但是可以通過以下指令來獲取仍在倉庫中的,但是已經不可獲取的存儲列表
git fsck --unreachable |
grep commit | cut -d\ -f3 |
xargs git log --merges --no-walk --grep=WIP
git stash 的具體用法
git stash
通過在指令後添加其他的附件選項,實現複雜的定製化操作,下面我們來對具體用法進行講解.
save, push
-
save [-p|--patch] [-k|--[no-]keep-index] [-u|--include-untracked] [-a|--all] [-q|--quiet] [<message>]
-
push [-p|--patch] [-k|--[no-]keep-index] [-u|--include-untracked] [-a|--all] [-q|--quiet] [-m|--message <message>] [--] [<pathspec>…]
save
和push
命令都可以用於存儲修改.並且將git
的工作狀態切回到HEAD
也就是上一次合法提交上.後面的<message>
是選填項.
如果給定具體的文件路徑,git stash
只會處理路徑下的文件.其他的文件不會被存儲
--keep-index
(簡寫爲-k
)只會存儲爲加入git
管理的文件
--include-untracked
爲追蹤的文件也會被緩存,當前的工作空間會被恢復爲完全清空的狀態.如果不使用--include-untracked
而是用--all
,那麼除了未加入管理的文件,被git
忽略(ignore
)的文件也會被緩存.
--patch
命令可以讓我們選擇當前修改和HEAD
提交diff
部分.
list
list [<options>]
展示當前存儲庫中的存儲單元列表.每個元素包含的信息有索引位置,存儲時所在的分支,存儲前的提交的描述.舉例
stash@{0}: WIP on submit: 6ebd0e2... Update git-stash documentation
stash@{1}: On master: 9cc0589... Add git-stash
show
show [<stash>]
展示存儲單元和最新提交的diff
結果.如果沒有給定<stash>
參數時,會對比最新的存儲單元.
pop
pop [--index] [-q|--quiet] [<stash>]
移除單個存儲單元.和git stash save
的作用相反.