?
本文檔使用 php中文網(wǎng)手冊(cè) 發(fā)布
git-stash - 將變化存儲(chǔ)在臟的工作目錄中
git stash list [<options>]git stash show [<stash>]git stash drop [-q|--quiet] [<stash>]git stash ( pop | apply ) [--index] [-q|--quiet] [<stash>]git stash branch <branchname> [<stash>]git stash save [-p|--patch] [-k|--[no-]keep-index] [-q|--quiet] [-u|--include-untracked] [-a|--all] [<message>]git stash [push [-p|--patch] [-k|--[no-]keep-index] [-q|--quiet] [-u|--include-untracked] [-a|--all] [-m|--message <message>]] [--] [<pathspec>…]]git stash clear git stash create [<message>]git stash store [-m|--message <message>] [-q|--quiet] <commit>
使用git stash
時(shí)要錄制工作目錄和索引的當(dāng)前狀態(tài),但想回到干凈的工作目錄。該命令保存您的本地修改,并恢復(fù)工作目錄以匹配HEAD
提交。
通過(guò)此命令隱藏的修改可以使用git stash list
,檢查git stash show
和恢復(fù)(可能在不同的提交之上)git stash apply
。git stash
沒(méi)有任何參數(shù)的調(diào)用相當(dāng)于git stash save
。默認(rèn)情況下,存儲(chǔ)列為“WIP on branchname
...”,但在創(chuàng)建存儲(chǔ)時(shí),可以在命令行上提供更多描述性消息。
您創(chuàng)建的最新儲(chǔ)藏器存儲(chǔ)在refs/stash
; 舊的存儲(chǔ)在這個(gè)引用的reflog中可以找到,并且可以使用通常的reflog語(yǔ)法來(lái)命名(例如stash@{0}
,最近創(chuàng)建的存儲(chǔ),stash@{1}
是之前的存儲(chǔ),stash@{2.hours.ago}
也是可能的)。通過(guò)指定存儲(chǔ)索引也可以引用Stache(例如,整數(shù)n
等價(jià)于stash@{n}
)。
save -p|--patch-k|--no-keep-index] -u|--include-untracked -q|--quiet push -p|--patch-k|--no-keep-index] -u|--include-untracked -q|--quiet --
將您的本地修改保存為新的stash entry
并將它們回滾到 HEAD(在工作樹(shù)和索引中)。<message>部分是可選的,并給出說(shuō)明以及隱藏狀態(tài)。
為了快速制作快照,您可以省略“推送”。在此模式下,不允許使用非選項(xiàng)參數(shù)來(lái)防止拼寫(xiě)錯(cuò)誤的子命令產(chǎn)生不需要的存儲(chǔ)條目。對(duì)此的兩個(gè)例外是stash -p
作為 alias stash push -p
和 pathspecs,它們?cè)?code>--消除歧義之后使用雙連字符。
當(dāng)指定 pathspec 時(shí)git stash push
,新存儲(chǔ)條目?jī)H記錄與 pathspec匹配的文件的已修改狀態(tài)。索引條目和工作樹(shù)文件然后僅回滾到 HEAD中的這些文件的狀態(tài),從而留下與 pathspec 完全不匹配的文件。
如果使用該--keep-index
選項(xiàng),則已添加到索引的所有更改均保持不變。
如果使用該--include-untracked
選項(xiàng),則所有未跟蹤的文件也會(huì)被隱藏起來(lái),然后進(jìn)行清理git clean
,使工作目錄處于非常干凈的狀態(tài)。如果使用該--all
選項(xiàng),則除了未跟蹤文件之外,還會(huì)隱藏和清除被忽略的文件。
使用--patch
,您可以交互式地從 HEAD 和工作樹(shù)之間的差異中選擇區(qū)塊來(lái)隱藏。存儲(chǔ)條目的構(gòu)建方式使其索引狀態(tài)與存儲(chǔ)庫(kù)的索引狀態(tài)相同,其工作樹(shù)僅包含交互式選擇的更改。所選的更改將從您的工作樹(shù)中回滾。請(qǐng)參閱 git-add [1]的“交互模式”部分了解如何操作該--patch
模式。
該--patch
選項(xiàng)意味著--keep-index
。您可以使用--no-keep-index
來(lái)覆蓋此。
list <options>
列出您當(dāng)前擁有的存儲(chǔ)條目。每個(gè)stash entry
列表都以其名稱列出(例如,stash@{0}
是最新的條目,stash@{1}
是之前的條目等等),條目的當(dāng)前分支的名稱以及條目所基于的提交的簡(jiǎn)短描述。
stash@{0}: WIP on submit: 6ebd0e2... Update git-stash documentation stash@{1}: On master: 9cc0589... Add git-stash
該命令使用適用于該git log
命令的選項(xiàng)來(lái)控制顯示內(nèi)容和方式。參見(jiàn) git-log [1]。
show <stash>
顯示存儲(chǔ)條目中記錄的更改,作為隱藏內(nèi)容和提交首次創(chuàng)建存儲(chǔ)條目時(shí)的提交之間的差異。當(dāng)沒(méi)有<stash>
給出時(shí),它顯示最新的一個(gè)。默認(rèn)情況下,該命令顯示diffstat,但它將接受已知的任何格式git diff
(例如,git stash show -p stash@{1}
以補(bǔ)丁形式查看第二個(gè)最新條目)。您可以使用 stash.showStat 和/或 stash.showPatch 配置變量來(lái)更改默認(rèn)行為。
pop --index <stash>
從存儲(chǔ)列表中刪除一個(gè)單獨(dú)的存儲(chǔ)狀態(tài)并將其應(yīng)用于當(dāng)前工作樹(shù)狀態(tài)的頂部,即進(jìn)行反操作git stash save
。工作目錄必須與索引匹配。
應(yīng)用狀態(tài)可能會(huì)因沖突而失敗; 在這種情況下,它不會(huì)從存儲(chǔ)列表中刪除。您需要git stash drop
手動(dòng)解決沖突,然后手動(dòng)調(diào)用。
如果使用該--index
選項(xiàng),則嘗試不僅恢復(fù)工作樹(shù)的更改,而且還恢復(fù)索引的更改。但是,如果發(fā)生沖突(存儲(chǔ)在索引中,因此您不能再像原來(lái)那樣應(yīng)用更改),這可能會(huì)失敗。
當(dāng)沒(méi)有<stash>
給出時(shí),stash@{0}
假定,否則<stash>
必須是表格的參考stash@{<revision>}
。
apply --index <stash>
像pop
,但不要從存儲(chǔ)列表中刪除狀態(tài)。不像pop
,<stash>
可能是任何看起來(lái)像由stash save
or 創(chuàng)建的提交stash create
。
branch <branchname> <stash>
創(chuàng)建并檢出<branchname>
從<stash>
最初創(chuàng)建的提交開(kāi)始的新分支,將記錄的更改應(yīng)用<stash>
到新的工作樹(shù)和索引。如果成功了,并且<stash>
是表單的參考stash@{<revision>}
,則會(huì)丟棄該表單<stash>
。如果沒(méi)有<stash>
給出,則應(yīng)用最新的一個(gè)。
如果您運(yùn)行的分支由于沖突而git stash save
發(fā)生了足夠多的分支git stash apply
失敗,這很有用。由于存儲(chǔ)條目應(yīng)用于git stash
運(yùn)行時(shí)HEAD提交的頂部,因此它將恢復(fù)原始存儲(chǔ)狀態(tài)而不產(chǎn)生沖突。
clear
刪除所有的存儲(chǔ)條目。請(qǐng)注意,這些條目將會(huì)被修剪,并且可能無(wú)法恢復(fù)(請(qǐng)參閱Examples
下面的可能策略)。
drop -q|--quiet
從存儲(chǔ)條目列表中刪除單個(gè)存儲(chǔ)條目。如果沒(méi)有<stash>
給出,它將刪除最新的一個(gè)。即stash@{0}
,否則<stash>
必須是表單的有效存儲(chǔ)日志引用stash@{<revision>}
。
create
創(chuàng)建一個(gè)存儲(chǔ)條目(這是一個(gè)常規(guī)的提交對(duì)象)并返回它的對(duì)象名稱,而不將它存儲(chǔ)在ref命名空間的任何位置。這旨在用于腳本。這可能不是你想要使用的命令; 見(jiàn)上面的“保存”。
store
將通過(guò)git stash create
(這是一個(gè)懸掛的合并提交)創(chuàng)建的給定的存儲(chǔ)存儲(chǔ)在存儲(chǔ)引用中,更新存儲(chǔ)引用日志。這旨在用于腳本。這可能不是你想要使用的命令; 見(jiàn)上面的“保存”。
存儲(chǔ)條目表示為其記錄工作目錄狀態(tài)的提交,其第一個(gè)父HEAD
項(xiàng)是創(chuàng)建條目時(shí)的提交。第二個(gè)父節(jié)點(diǎn)的樹(shù)在創(chuàng)建條目時(shí)記錄索引的狀態(tài),并將其作為提交的子節(jié)點(diǎn)HEAD
。血統(tǒng)圖看起來(lái)像這樣:
.----W / /-----H----I
提交的地方H
在于HEAD
提交,I
它記錄了索引的狀態(tài),并且W
是一個(gè)提交,用于記錄工作樹(shù)的狀態(tài)。
拉進(jìn)一棵臟的樹(shù)
當(dāng)你處于某種事情的中間時(shí),你會(huì)發(fā)現(xiàn)上游的變化可能與你正在做的事情有關(guān)。當(dāng)您的本地更改與上游的更改不沖突時(shí),一個(gè)簡(jiǎn)單的git pull
將讓您前進(jìn)。
但是,在某些情況下,您的本地更改與上游更改發(fā)生沖突,并git pull
拒絕覆蓋更改。在這種情況下,您可以隱藏您的更改,執(zhí)行拉動(dòng)操作,然后取消擺放,如下所示:
$ git pull ...file foobar not up to date, cannot merge.$ git stash $ git pull $ git stash pop
中斷的工作流程
當(dāng)你處于某種事情的中間時(shí),你的老板進(jìn)來(lái)并要求你立即解決問(wèn)題。傳統(tǒng)上,您會(huì)提交一個(gè)臨時(shí)分支來(lái)存儲(chǔ)您的更改,然后返回到原始分支以進(jìn)行緊急修復(fù),如下所示:
# ... hack hack hack ...$ git checkout -b my_wip $ git commit -a -m "WIP"$ git checkout master $ edit emergency fix $ git commit -a -m "Fix in a hurry"$ git checkout my_wip $ git reset --soft HEAD^# ... continue hacking ...
您可以使用git stash
以簡(jiǎn)化上述內(nèi)容,如下所示:
# ... hack hack hack ...$ git stash $ edit emergency fix $ git commit -a -m "Fix in a hurry"$ git stash pop # ... continue hacking ...
測(cè)試部分提交
您可以git stash save --keep-index
在您想要在工作樹(shù)中進(jìn)行兩項(xiàng)或更多項(xiàng)提交時(shí)使用,并且您希望在提交前測(cè)試每項(xiàng)更改:
# ... hack hack hack ...$ git add --patch foo # add just first part to the index $ git stash save --keep-index # save all other changes to the stash $ edit/build/test first part $ git commit -m 'First part' # commit fully tested change $ git stash pop # prepare to work on all other changes # ... repeat above five steps until one commit remains ...$ edit/build/test remaining parts $ git commit foo -m 'Remaining parts'
恢復(fù)被錯(cuò)誤清除/丟棄的存儲(chǔ)條目
如果您錯(cuò)誤地放下或清除存儲(chǔ)條目,則無(wú)法通過(guò)正常安全機(jī)制恢復(fù)。但是,您可以嘗試使用以下咒語(yǔ)來(lái)獲取仍在您的存儲(chǔ)庫(kù)中但不能再訪問(wèn)的存儲(chǔ)條目列表:
git fsck --unreachable |grep commit | cut -d\ -f3 |xargs git log --merges --no-walk --grep=WIP