Git stash
介紹:
有時(shí)肩刃,正在開發(fā)進(jìn)行到一部分的時(shí)候卸伞,比如有個(gè)緊急的bug需要處理歪泳,這時(shí)需要切換到另一個(gè)分支修復(fù)。 問(wèn)題继阻,你不想僅僅因?yàn)檫^(guò)會(huì)兒回到這一點(diǎn)而為做了一半的工作創(chuàng)建一次提交耻涛。 針對(duì)這個(gè)問(wèn)題的答案是 git stash
命令。
git stash
(暫存)會(huì)處理工作目錄的臟的狀態(tài) 瘟檩,修改的跟蹤文件與暫存改動(dòng) - 然后將未完成的修改保存到一個(gè)棧上抹缕,而你可以在任何時(shí)候重新應(yīng)用這些改動(dòng)。
暫存
git stash
或 git stash save [--keep-index] [-u|--include-untracked] [--patch] [message]
暫存修改(把當(dāng)前目錄修改保存到暫存區(qū))兩個(gè)命令等價(jià)墨辛。
默認(rèn)git stash
只會(huì)暫存已經(jīng)在索引的文件
- message 暫存信息(不帶默認(rèn)自動(dòng)添加信息)
- --keep-index 不要暫存已經(jīng)通過(guò)
git add
過(guò)的文件 - --include-untracked或是-u 暫存任何創(chuàng)建未跟蹤文件
- --patch 交互式手動(dòng)確認(rèn)哪些修改需要暫存(應(yīng)用在不需要全部暫存的場(chǎng)景)
$ git stash
Saved working directory and index state WIP on dev: 0ac2bea test fetch
$ git stash save 'test stash'
Saved working directory and index state On dev: test stash
# 修改b.py和c.py, git add b.py
$ git add b.py
$ git stash save --keep-index 'test keep index'
Saved working directory and index state On dev: test keep index
$ git status
On branch dev
Changes to be committed:
(use "git reset HEAD <file>..." to unstage)
modified: b.py
# 新建d.py 修改b.py
$ git stash save -u 'test include untracked'
Saved working directory and index state On dev: test include untracked
$ git status
On branch dev
nothing to commit, working tree clean
# 修改c.py
$ git stash --patch
diff --git a/c.py b/c.py
index e69de29..d98124f 100644
--- a/c.py
+++ b/c.py
@@ -0,0 +1 @@
+print 'patch'
Stash this hunk [y,n,q,a,d,/,e,?]? y
Saved working directory and index state WIP on dev: 0ac2bea test fetch
查看暫存
git list
查看暫存區(qū)列表
$ git stash list
stash@{0}: WIP on dev: 0ac2bea test fetch
stash@{1}: On dev: test stash
恢復(fù)暫存區(qū)
git stash apply [stash]
恢復(fù)暫出區(qū)修改到工作目錄
git stash pop [stash]
恢復(fù)暫存區(qū)修改到工作目錄 并刪除暫存區(qū)對(duì)應(yīng)暫存
- stash 暫存信息標(biāo)識(shí)(stash@{1} 不帶默認(rèn)是stash@{0})
# apply恢復(fù)
$ git stash apply
On branch dev
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git checkout -- <file>..." to discard changes in working directory)
modified: b.py
no changes added to commit (use "git add" and/or "git commit -a")
# 查看暫存列表
$ git stash list
stash@{0}: WIP on dev: 0ac2bea test fetch
stash@{1}: On dev: test stash
# pop恢復(fù)
$ git stash pop
On branch dev
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git checkout -- <file>..." to discard changes in working directory)
modified: b.py
no changes added to commit (use "git add" and/or "git commit -a")
Dropped refs/stash@{0} (61d62ac45e6608259d5f1ba9485319021b52f1b0)
# 查看暫存 stash@{1}已經(jīng)被刪除了
$ git stash list
stash@{0}: On dev: test stash
暫存區(qū)新建分支
當(dāng)你暫存以后在當(dāng)前的分支有了新的提交卓研,如果恢復(fù)剛才的暫存區(qū)可能會(huì)有沖突,如果有沖突就不得不去解決沖突。如果在繼續(xù)在暫存區(qū)處繼續(xù)工作奏赘?可以運(yùn)行git stash branch
創(chuàng)建新的分支寥闪,檢出存儲(chǔ)區(qū)所在的提交,重新在那應(yīng)用工作,然后在應(yīng)用成功后扔掉儲(chǔ)藏
git stash branch [stash]
從暫存區(qū)新建分支
- stash 暫存信息標(biāo)識(shí)(stash@{1} 不帶默認(rèn)是stash@{0})
$ git stash branch testchanges stash@{2}
Switched to a new branch 'testchanges'
d.py already exists, no checkout
Could not restore untracked files from stash
$ git branch
dev
foo
master
* testchanges