我一直想使用一个 git 命令来保存一个存储而不修改我的工作树,作为一个轻量级的备份,它可以安全地避免任何 git 重置或任何我可能做的事情来搞砸我的索引。基本上等同于“git stash save && git stash apply”的功能,只是永远不会触及工作副本,因为这会使某些文本编辑器/IDE 变得胡思乱想。
类似这样的事情正在接近我想要的,但不完全是:
git update-ref refs/stash `git stash create "Stash message"`
这在功能上有效,但我遇到的问题是“git stash list”中没有显示任何 stash 消息,即使实际的 stash 提交确实包含我的消息。考虑到存储量有多大,存储消息非常重要。
最佳答案
git stash store "$(git stash create)"
将创建类似于您使用 git stash
获得的存储条目,而无需实际接触和清除您的工作目录和索引。
如果您检查存储列表或查看所有提交图(包括存储),您会发现它与您通过正常调用 git stash
获得的结果相似。只是存储列表中的消息不同(通常类似于 "stash@{0}: WIP on master: 14e009e init commit",这里我们将得到 "stash@{0} : 通过“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 条目使用具有一些已定义结构的正常提交来表示。基本上它是一个常规提交对象,有 2 个父项(如果您使用 --include-untracked
选项则有 3 个)(更多信息 1 , 2 )。
git stash create
创建代表存储条目的提交并返回给你 object name (SHA-1) 的提交对象(有 2 或 3 个 parent 的对象)。这是一个dangling commit (您可以通过在 git stash create
之后调用 git fsck
来验证它)。你需要让 refs/stash
指向这个悬空提交,你可以通过 git stash store
(或者通过 git update-ref
像其他答案,因为 git stash store
uses git update-ref
来完成它的工作)。
最好查看 git stash push
的实际源代码,看看它基本上是在调用 git stash create
and git stash store
然后做 some logic清理文件(哪个取决于您在 git stash push
中使用的选项)。
关于Git命令在不修改工作树的情况下保存存储?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6315459/