下載初始化倉庫
$ git status
當前位于test分支,并且修改啦兩個文件,一個已經staged,還有一個沒有
$ git stash
stash命令把當前`working directory`和`index`的內容都存儲起來
$ git status
現在status命令查看,`working directory`已經沒有修改啦,是干凈的。
$ git stash list
`stash list`命令就是列出已經stash的內容,輸出結果還包括啦stash時的分支和當時所在commit的SHA-1值
如果有新的stash時,會在老的列表上面新建,把現在的這個stash@{0}壓下去,變成stash@{1}
$ git log --oneline --graph --decorate
分支結構圖可知,`stash list`輸出結果中的確實是stash時所在分支所指向的commit的SHA-1值
$ git checkout master
切換到`master`分支
打開hello.txt,作如上的修改
$ git stash apply
$ git stash apply stash@{0}
恢復stash的內容,用上面的命令就行,可以在apply后面聲明是哪一個stash,
不聲明,Git會默認選擇最新的那個。
恢復stash并不一定要保持`working directory`干凈,
也不一定要在同一個branch上(在test的stash可以恢復到master分支),
如果恢復時出現沖突,git停止恢復,提示沖突。
因為stash存儲啦對hello的修改,所以恢復時提示沖突,停止恢復,
提示我們要先commit或者stash才可以繼續恢復
但是,如果修改的是afternoon.txt文件(stash存儲中沒有對這個文件的修改),
那么可以直接`git stash apply`完成恢復,不會產生沖突
$ git add hello.txt
$ git stash apply
因為stash apply命令是把原來存儲的修改都恢復到`working dirctory`,
所以可以先把當前對hello.txt的修改添加到`Index`,
然后在stash apply恢復
$ git checkout -- hello.txt morning.txt
$ git status
用checkout命令,把`working dirctory`中剛剛恢復的修改撤銷掉,然后再查看status,只有index里面還有hello的修改
$ git stash apply --index
這個命令恢復stash的內容時,
會把原來已經staged的文件(就是在index中的文件)也恢復,
不加`--index`時,會把所有存儲的操作都恢復到`working directory`,
因為index中有對hello的修改存在,所以恢復依然終止
$ git status
查看status,stash沒有恢復,原來index中的修改也清楚啦,`working directory`的修改保留
$ git checkout -- hello.txt
$ git stash apply stash@{0} --index
撤銷`working directory`的hello.txt修改,然后用加上`--index`的命令恢復stash,此時輸出結果可以看到,跟剛開始在test分支時的狀態是一樣的,修改的hello.txt添加到index,morning.txt的修改沒有添加
$ git stash list
$ git stash drop stash@{0}
用drop stash命令丟棄無用的stash
$ git status
$ git stash
此時master分支仍然保留著恢復時的狀態,再次用git stash存儲狀態
$ git stash list
$ git stash pop stash@{0}
$ git stash list
用`git stash pop`命令恢復stash后會立即從棧中刪除對應的stash
`git stash list`沒有輸出結果
Stash命令的一些其他參數的使用
$ git add hello.txt
$ git status -s
把hello.txt添加到index,然后再復制一份hello.txt,名字是`hello (2).txt`
用git status -s查看狀態,如上圖
$ git stash --keep-index --include-untracked
$ git stash --keep-index -u //-u == --include-untracked
$ git status -s
參數`--keep-index`表示保留index里面的狀態
`--include-untracked`表示包括沒有追蹤的文件(就是上面復制的hello (2).txt)
然后在用`status -s`查看,只剩下index中的狀態啦
$ git checkout --f master
$ git status -s
`checkout --f master`撤銷掉所有更改,打開hello.txt文件,前面兩行添加(master1)(master2)最后兩行加上(master19)和(master20)
$ git stash --patch
y
n
`--patch`參數用于存儲部分的修改,如圖,對前面兩個修改進行存儲,不存儲后面兩個修改
打開hello.txt,可以看到,上面兩行的修改已經存儲起來了,下面的兩行依然保留
如果stash已經無法在當前分支上恢復,可以嘗試從stash新建一個branch測試代碼
$ git checkout -f HEAD //撤銷掉上面剩下的所有修改
$ git stash branch testchanges stash@{0}
`stash branch testchanges`命令將新建testchanges分支,checkout執行stash存儲命令時所在的那個commit,然后把存儲的修改重新引用到那個commit上,testchanges分支指向那個commit