你能备份 git reflog 吗?关于防止代码丢失的最佳实践的建议

can you back up git reflog? Advice on best practice to guard against code loss

git reflog 显示所有 activity,甚至压缩提交等(如果我错了请纠正我)。

是否有 git CLI 命令来备份 git reflog?

显然,如果我删除了本地版本的 repo,我就会丢失我的 reflog(如果我错了请纠正我)。

我想知道我是否可以 git push 为了安全或类似的原因?

如果不是,我应该采取什么方法来防止丢失 reflog?

更新:作为对 Jiri Kremser 的回应,如果我备份 .git/logs 我可以 git reset --hard 恢复到 reflog 中的任何提交吗?

是也不是。没有针对它的命令,但您可以在存储 reflog 的地方备份 .git/logs

但是,只有对提交的引用存储在那里,所以这就像备份符号链接(或 Windows 中的快捷方式)。它可能会起作用,具体取决于您想要做什么。

一般来说,制作 reflog public 不是一个好主意,因为它只用于本地回购。

您可以将 reflog 看作是您对 Git 存储库所做的所有事情的审计跟踪。如果您需要返回并恢复通过某个过程丢失的内容,它会立即派上用场,但长时间备份 运行 不会完成所有事情。

要备份的更有价值的东西是实际的存储库。丢失对 Git 存储库的那些实际、具体的更改绝对会导致数据丢失,而丢失 reflog 通常意味着您无法查看命令列表并弄清楚变基从哪里开始。虽然这在您拥有稳定的环境时非常有用,但如果您出于任何原因需要恢复它,您真的应该关心 更多 整个存储库。

git reflog shows all activity (even squashed commits, etc). (correct me if i am wrong)

如您所见,git reflog 存储 几乎 git 中的所有活动。
几乎任何东西都意味着它实际上并不存储所有的活动它存储所有修改你的 locally.[=20 的活动=]

重要的是仅存储 本地 数据,因此备份和恢复数据将毫无用处。

Why cant i backup reflog?

由于 reflog 仅存储您本地存储库的相关信息,因此如果您将其恢复到不同的存储库,它将不起作用。

例如考虑这个(非常简单的)本地流程:

# checkout master branch
git checkout master

# do some changes and commit 
- At this point there will be a new entry in the reflog

# now you decide to discard your changes
git reset HEAD~1 --hard
- At this point a new entry is added to your reflog
- The commit which you made is a dangling commit which can be 
  recovered on your local machine but does not exist on any other
  repository beside yours.

这是一个非常简单的流程,但是你可以从这个流程中了解到,即使你可以备份reflog(而且你可以简单地备份.git/logs),它也没有用。

还有许多其他类似的情况会使您的 reflog 变得无用。

这就是为什么它在您的机器本地而不是任何其他机器的原因。

假设现在你有我的 reflog 备份,如果我执行了 rebasefilter-branch 等,它对你没用

由于 reflog 只是指向提交的指针,而不是实际的提交数据,一旦您的提交足够旧并且 git 运行 git gc(在大多数事情的幕后默默运行) ,实际的提交仍然没有。与其备份 reflog,不如在代码中散布分支标签。这些不仅会保留历史,还会保留实际提交。一旦你对你的 squash / rebase / 其他破坏性的东西感到满意,删除这些旧分支,然后 git gc 会很高兴地再次收集旧数据。