git stash的詳細講解

應用舉例

通過幾個實際的示例來了解一下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>…​]

savepush命令都可以用於存儲修改.並且將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的作用相反.


 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章