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