我需要存储 git 存储库的当前状态。稍后我需要返回状态。
保存的状态应包含当前分支及其更改。
示例:
master
并修改了foo.py。AFAIK
stash
或临时分支在这里不起作用,因为分支名称未保存。
我可以接受管道命令,因为保存和恢复将在脚本中完成。
使用
git stash
will 保存状态:它会进行两个不在任何分支“上”的 1 提交(它们是通过特殊的 refs/stash
名称找到的),其中包含索引的状态以及你的工作树的状态。 然后,它使用 git reset --hard
删除任何工作树和索引更改,从而可以安全地更改分支。
stash
不保存的一项状态是保存存储时您所在的分支(如果有)的名称。
要保存它,您需要运行
git symbolic-ref HEAD
(使用 --short
获取分支名称,并注意,如果 HEAD
不是符号引用,即当前“分离”,则它退出非零;在这种情况下)您可能需要将当前提交 ID 保存在某处,可能是在引用中以保护它)。
请注意,如果没有要保存的状态,
git stash save
将不会执行任何操作,因此明智的做法是在 refs/stash
步骤之后验证 git stash save
是否存在并指向新的不同的提交 ID。 (这在脚本中实现起来并不太困难:使用 git rev-parse -q --verify refs/stash
获取新的提交 ID,并在 save
之前使用它来获取旧的提交 ID。与 git symbolic-ref
一样,如果引用不存在,它将以非零值退出不存在。)
1或者,如果您使用
git stash save -u
或 git stash save -a
,则进行三次提交。 第三次提交包含 git 通常不处理的文件:未跟踪和忽略的文件。 有关详细信息,请参阅 git stash
文档。
我最近开始开发一个名为
git chord
的 git 扩展,用于在底层使用惯用的 git 管理存储库的整体状态。该扩展是完全可配置的且易于使用。该脚本完全可移植且符合 POSIX 标准。
我必须说目前处于测试阶段。欢迎提出想法和贡献。这是项目源码库:
https://github.com/davidsusu/git-chord
当我试图计划版本控制课程的学生如何提交完整的存储库时,我第一次想到了对这样一个工具的需求。后来我看到了多分支环境管理、灾难恢复、时间旅行、CI/CD 的用例,甚至简单地与其他人共享存储库的状态。
要保存当前状态,需要调用
snapshot
子命令:
git chord snapshot
要恢复上次保存的状态,请使用
apply
子命令:
git chord apply