7.3 Git Tools - Stashing and Cleaning

下載初始化倉庫

$ 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

清除working dirctory里面的文件

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容