git stash 保存當(dāng)前工作區(qū)和暫存區(qū)進(jìn)度,回退到上一個(gè) git commit 之后的狀態(tài)
git stash save 'msg' 添加注釋
git stash list 顯示保存的列表
git stash pop 恢復(fù)最新的進(jìn)度到工作區(qū)
git stash pop stash@{1} 恢復(fù)指定的保存列表到工作區(qū)(通過 git stash list 得到 stash@{1})
git stash clear 刪除所有保存的工作進(jìn)度
總結(jié):
git stash 會(huì)將當(dāng)前修改保存(默認(rèn)只會(huì)保存加入到版本管理的文件,Untracked 文件不會(huì)存儲(chǔ)),然后將當(dāng)前工作區(qū)恢復(fù)到最近的一次提交,在此干凈的基礎(chǔ)上可以做其它工作,最后將工作區(qū)修改恢復(fù)
注意:恢復(fù)工作區(qū)修改,不是完全恢復(fù)到保存時(shí)候的狀態(tài),只是將修改恢復(fù),在 stash 保存之后做的工作仍將保留
使用場(chǎng)景:
場(chǎng)景一:
先弄清楚幾個(gè)事情:
- 線上用 master 分支
- 開發(fā)用 dev 分支
- bug 修復(fù)用 bugfix 分支(該分支可以不存在)
假如現(xiàn)在只有一個(gè) master 分支,并且開發(fā)也是在 master 上(哦,糟糕的分支職責(zé)劃分),
線上發(fā)生一個(gè)緊急bug 需要修復(fù),又不想將目前的修改和bug 修復(fù)一塊提交
傳統(tǒng)方式:新建分支,在新分支上拉取 master 最新代碼并修復(fù),然后合并到 master 推送
解決: 使用 stash
git stash 保存當(dāng)前修改
...bug 修復(fù)提交
git stash pop 恢復(fù)修改,繼續(xù)工作
方便在于不用為了避免當(dāng)前修改工作而另外建立分支
問題來了:
問題一: git stash pop 之后, bugfix 的內(nèi)容還存在嗎?
答: 存在
問題二: bugfix 和我們保存之前的修改沖突了怎么辦?
答: 和 git merge 一樣,會(huì)自動(dòng) merge, 并提示發(fā)生了沖突
image.png
場(chǎng)景二:
還是上面那個(gè)例子,只不過現(xiàn)在開發(fā)是在 dev 分支上
我們知道,dev 分支上有修改未提交,我們是不能切換到 別的分支上的,不管是 master 分支上還是 bugfix 分支上,一般情況下,我們需要提交 dev 分支上的修改再切換,那么 dev 分支上多了一次無畏的提交記錄,如果不想加一次不必要的提交呢?
解決:用 git stash 保存當(dāng)前修改,那么 dev 分支狀態(tài)回退到 最近的一次提交,就是說這個(gè)時(shí)候 dev 分支是沒有發(fā)生變化的(變化被保存到 stash 里了),那么就可以立刻切換分支
在 master 或 bugfix 分支上解決完 bug 后,就可以切換回 dev 分支,用 git stash pop 恢復(fù)之前的修改,繼續(xù)工作。
總結(jié):
git stash 之后,版本庫狀態(tài)會(huì)恢復(fù)到最近的一次提交完的狀態(tài)
git stash 之后,做的修改,在 git stash pop 之后,仍然會(huì)保留,合并當(dāng)前狀態(tài)和 stash 狀態(tài),有沖突會(huì)默認(rèn) merge, 并提示沖突文件
git stash 默認(rèn)只會(huì)保存已經(jīng)加入到版本管理的文件
再說一句:
假如 A 文件已經(jīng)被加入版本庫,做以下操作:
git stash 保存
刪除 A 文件
git stash pop 之后, A 文件是被刪除掉的,不會(huì)再顯示出來
