git stash store "$(git stash create)"
这将创建类似于使用git stash
命令创建的stash条目,但不会实际触及或清除您的工作目录和索引。
如果您检查stash列表或查看所有提交图形(包括stash),您将看到与正常调用git stash
相似的结果。只是stash列表中的消息不同(通常是类似于"stash@{0}: WIP on master: 14e009e init commit",这里我们将得到"stash@{0}: Created via "git stash store"")
$ git status --short
M file.txt
A file2.txt
$ git stash list
$ git stash store "$(git stash create)"
$ git stash list
stash@{0}: Created via "git stash store".
$ git stash show 'stash@{0}'
file.txt | 2 +-
file2.txt | 2 ++
2 files changed, 3 insertions(+), 1 deletion(-)
$ git log --oneline --graph --all
* 85f937b (refs/stash) WIP on master: 14e009e init commit
|\
| * 26295a3 index on master: 14e009e init commit
|/
* 14e009e (HEAD -> master) init commit
$ git status
M file.txt
A file2.txt
更详细的说明:
一个 git stash 条目由正常提交所表示,具有一些定义的结构。基本上它是一个普通的提交对象,有两个父对象(如果您使用 --include-untracked
选项,则有三个)(更多信息请参见 1,2)。
git stash create
创建这些代表 stash 条目的提交对象,并返回提交对象(具有 2 或 3 个父对象)的 对象名称(SHA-1)。这是一个悬空的提交(您可以在 git stash create
之后调用 git fsck
进行验证)。您需要使 refs/stash
指向此悬空提交,方法是通过 git stash store
(或通过其他答案中所述的 git update-ref
进行操作,因为 git stash store
使用 git update-ref
完成其工作)。
查看 git stash push
的实际源代码并了解它基本上是调用 git stash create
和 git stash store
,然后执行 一些逻辑 来清理文件(具体取决于您在 git stash push
中使用了哪些选项)。
sed -i 's/oldname/newname/'
时,它非常有效。无需担心备份后缀或任何其他问题。 - Nathan Chappellgit stash store "$(git stash create 'comment')"
。 - Matthew MacFarland提供的消息将出现在存储提交中。使用
git stash store -m "message"提供的消息将显示在存储 reflog 中。如果您想要两者,可以使用以下命令提供消息:
git stash store $(git stash create "message") -m "message",否则在
git stash store之后,存储 reflog 中的消息将变为
Created via "git stash store".`。 - webninja--include-untracked
传递给git stash create
,因此可以通过将新创建的存储应用回工作树来包含未跟踪的文件(虽然更具侵入性)进行存储(使用--include-untracked
和--keep-index
)。这里是我用于执行任何一种类型的存储而不破坏当前工作树的完整函数的 shell 代码。 - webninjagit stash store "$(git stash create)"
后继续处理工作,但意识到出现问题并想要返回到存储的WIP,请问该怎么做?我尝试了git stash pop
,但是出现了error: Your local changes to the following files would be overwritten by merge: Please commit your changes or stash them before you merge.
错误提示。 - LLaP