Git -- Stash

solenovex發表於2018-03-23

git stash(儲藏)

準備好專案, 然後修改某個檔案.

這時, 如果我不準備commit這個檔案的話, 我需要立即修改改另外一個檔案.

為了儲存這第一個變化, 就可以使用git stash命令.

“‘stash”“可以獲取你工作目錄的中間狀態——也就是你修改過的被追蹤的檔案和暫存的變更——並將它儲存到一個未完結變更的堆疊中,隨時可以重新應用。

git stash save
git stash

 

可以不加save引數, 因為執行git stash 預設就帶著save引數.

可以看到沒有需要commit的變化了.

開啟修改的檔案, 又恢復到原來的樣子了.

然後我再做一些修改, 修改另一個檔案:

然後commit:

現在是clean working directory.

那麼剛才的stash 怎麼辦呢?

git stash apply.

這個命令會顯示出來當前的狀態. 這時開啟我第一次修改的檔案, 發現我做出的變化又出現了.

然後 commit即可:

但是到現在還沒完, 下面執行這個命令:

git stash list:

因為我們已經apply這個stash了, 所以可以把它刪掉了:

git stash drop, 它會刪除最新的一個stash.

 

Stash Untracked / Pop.

git stash 只對被追蹤的檔案起作用.

修改某個被追蹤的檔案.

然後新增一個檔案, 這個檔案暫時git還沒有去追蹤.

如果現在執行git stash:

那麼它只會儲存被追蹤檔案的變化. 而未追蹤的檔案依然可以看到:

現在把儲存恢復:

git stash apply:

然後刪除這個stash:

現在有幾種可選的做法:

1. 可以把未追蹤的檔案新增到staging 區.

2. 或者你仍想把這個未追蹤的檔案儲存起來, 那麼可以使用git stash 加引數, 下面就做這個:

git stash -u

現在就是clean working directory了.

然後編輯另一個檔案, 然後commit:

然後我在apply之前的stash, 這次我將使用一個更直接的命令:

git stash pop 它相當於這兩個命令: git stash apply 和 git stash drop (apply並drop上一個stash).

然後我刪除z.txt. commit.

 

多個Stash.

修改某個檔案, 然後執行stash, 這次加上save引數, 並指定資訊:

git stash save "xxx".

再修改另一個檔案, 並stash:

然後再修改上面的一個檔案, 並stash:

列出stash:

注意, 這裡0表示最新的一個stash.

檢視某個stash:

git stash show stash@{1}.

具體恢復某一個stash:

git stash apply stash@{1}.

然後刪除這個stash:

git stash drop stash@{1}.

剩下的stash的索引可能會更新一下.

如果剩下的stash我不需要了:

git stash clear:

 

Stash到分支.

現在專案的狀態是有一個變化還沒有stage:

我再修改其他幾個檔案:

我把README.md新增到staging區:

我再新增一個新檔案 z1.txt:

現在檔案的狀態有3種, 等待被commit的, 沒有 stage的, 未被追蹤的.

首先執行stash 所有檔案:

然後我把這個stash apply到分支上:

git stash branch xxx分支名.

這個過程發生了好幾件事:

1.建立了一個分支, 並切換到這個分支了

2.apply 這個stash到這個分支

3.刪除了這個stash.

檢視狀態:

然後commit, 併合併到master分支:

最後刪除分支:

 

相關文章