git stash

鴨脖發表於2015-06-16

開發人員常常遇到這種情況:花了幾天時間一直在做一個新功能,已經改了差不多十幾個檔案,突然有一個bug需要緊急解決,然後給一個build測試組。在Git問世之前基本上靠手動備份,費時且容易出錯。

git stash命令簡而言之就是幫助開發人員暫時擱置當前已做的改動,倒退到改動前的狀態,進行其他的必要操作(比如釋出,或者解決一個bug,或者branch,等等),之後還可以重新載入之前擱置的改動,很cool吧?

首先,用git add把所有的改動加到staging area。

git add .

接著用git stash把這些改動擱置。

git stash

到這裡,當前工作平臺就回復到改動之前了。該幹嘛幹嘛,此處省略1萬字。

需要找回之前擱置的改動繼續先前的工作了?

git stash apply 即可。

也可以用 git stash list 來檢視所有的擱置版本(可能擱置了很多次,最好不要這樣,容易搞混)

在出現一個擱置棧的情況下,比如如果你想找回棧中的第2個,可以用 git stash apply stash@{1}

如果想找回第1個,可以用 git stash pop

如果想刪除一個stash,git stash drop <id>

刪除所有stash,git stash clear


轉載二:

我第一次用這個命令時被坑過,經過是這樣的:我發現有一個類是多餘的,想刪掉它又擔心以後需要檢視它的程式碼,想儲存它但又不想增加一個髒的提交。這時我想到了git stash,於是那一天我執行了下這個命令就回去睡覺了。 第二天我繼續在這個目錄裡工作,coding了半天才發現前一天的修改都不見了,暫存區裡也沒有任何昨天修改的紀錄。是我忘了儲存了嗎?

相信git老手們早就看出問題所在了,修改消失了並不是因為我忘了儲存,而是git stash在儲存完當前工作目錄和暫存區以後,會用HEAD重置這兩者。因為我昨天的修改沒有提交,HEAD指向的是前天的版本,所以stash以後工作目錄和暫存區就會被前天的的版本所重置。

正確的做法應該是在git stash後再執行git stash apply,當前的工作目錄就恢復回來了。

git stash apply相當於利用過去貯藏(stashed)的工作目錄快照,恢復當前的工作目錄。如果工作目錄在貯藏之後發生了變化,恢復時就會產生衝突(conflict),這種情況下git stash apply會對工作目錄進行merge操作。

和merge一樣,git stash apply之前要保持當前目錄是乾淨的(沒有未提交的改變),否則會保錯:

error: Your local changes to the following files would be overwritten by merge: Please, commit your changes or stash them before you can merge.

git stash apply只能恢復工作目錄,如果想把暫存區也按照貯藏時的暫存區恢復的話,可以加上--index,如果暫存區恢復時發生衝突了會怎麼辦呢?嘿嘿,它會直接報錯不允許你這麼做:

相關文章