1.測試場景一:
假設index.html本來就在程式碼倉庫中,現在修改了index.html頁面,然後add暫存index.html頁面,接著繼續修改index.html頁面,然後git stash,這個時候程式碼倉庫乾淨了,修改被暫存,然後執行git stash pop,還原修改,這個時候發現,工作區的修改還原了,但是暫存區的修改丟失了。 也就是git status發現,沒有任何修改被暫存,之前暫存的修改被廢棄了,但是工作區的修改完全被保留。
2.測試場景二:
現在加入test01.html頁面,git status顯示test01.html並沒有被git跟踪,然後修改index.html文件,這個時候git stash,發現index.html文件被暫存,但是test01 .html檔案沒有被暫存。 也就是git status並沒有暫存沒有被git追蹤的檔案。
3.測試場景三:
延續場景二,修改index.html文件,test01.html文件為新添文件,這個時候git add test01.html文件,讓test01.html被git追踪,再git stash,通過git stash show方法可以看到test01.html檔案被暫存,接著git stash pop,修改被還原,git status發現test01.html檔案是被暫存狀態,index.html還是被保留的工作區的修改。 也就是git add 一個之前未被git追蹤的文件,git stash後,這個文件會被暫存,而且git stash pop後,新加入的這個文件還是暫存狀態,對比測試場景一中,index.html文件只是工作區的修改被暫存,暫存區的修改被遺失。
4.測試場景四:
延續場景三,修改index.html文件,test01.html文件為新添文件,這個時候git add test01.html文件,讓test01.html被git追踪,然後再修改test01.html文件,接著git stash,git stash pop,發現test01.html依然是暫存狀態,但是被暫存的文件內容卻是工作區最終的修改內容。 也就是git add 一個之前未被git追蹤的文件,然後再修改這個文件,git stash後,這個文件會被暫存,而且git stash pop後,新加入的這個文件還是暫存狀態,但是暫存的修改內容是先前工作區的修改內容而不是透過add暫存的修改內容。
通過以上測試,我沒有發現git stash的工作規律,非常暈,希望git高手給我指導分析一下。
曾经蜡笔没有小新2017-05-02 09:46:35
首先,我說明一下git stash
指令的基本功能:處理工作目錄髒的狀態,即修改的追蹤檔案與暫存改動,然後將未完成的修改儲存到一個堆疊上。知道了這些之後,讓我們來看看我總結的幾個重點:
git stash
指令會將已追蹤的檔案壓入堆疊中,而未被追蹤的檔案不會被壓入堆疊中,正如樓主的實驗2所描述的。
如果之前的工作有被添加到暫存區,git stash
命令默認不會將彈出棧的那個修改再加入暫存區,正如樓主的實驗1所描述的那樣,但是樓主的描述其實有誤,先前暫存的修改並不是被廢棄或遺失而是保留在工作區,只是未加入暫存區而已。
對於樓主的實驗2、3中的新新增檔案test01.html,其實這算一種特殊情況吧。我們可以這樣理解:stash pop
的結果就是還原先前的修改,而它對於test01.html所能做的復原操作也只能是重新加入暫存區,否則的話,test01.html將回到未被追蹤的狀態。
如果想要重新應用之前暫存的修改,可以在git stash pop
后加上--index
選項,這樣的話就可以恢復到和之前一模一樣了,即之前暫存過的現在也會是暫存狀態,為暫存的仍是未暫存的狀態。
最後,我需要聲明下樓主所說的:
之前暫存的修改被廢棄了
或
暫存區的修改被遺失
其實描述有誤,或者不該這樣描述,因為這樣會使我們誤解——我們可能會誤認為,而实际情况应该是这样的:git stash
只会暂存工作区的修改git stash
只會暫存工作區的修改,而實際情況應該是這樣的:默認會將恢復的操作保留在工作區,但不會自動幫你重新暫存
。