mercurial 和 git 是否存储您更新到哪些变更集的历史记录?

Do mercurial and git store history of which changesets you've updated to?

mercurial 和 git 是否存储了最近调用 update/checkout 之前您所在的变更集的记录?该历史记录是否存储在某处?

一个具体的用例是,如果您 pull/fetch 对项目进行了新的工作,并且 运行 遇到了一些新更改的问题。这样的历史记录可以让您更新回原来的位置,以便无需反复试验即可撤消更改。

作为分发版,Mercurial 不会存储有关您之前检出的修订版本的信息——但是从 Mercurial 3.9 开始有一个名为 Journal 的实验性扩展,如果启用,它会存储。还要注意 hg pull 不会更新到任何新的引用,除非你告诉它,也就是说,它更像 git fetch 而不是 git pull.1

Git 确实存储此信息,在 reflog 中用于特殊引用名称 HEAD.2这确实取决于 enabled 的 reflogs;你可以禁用它们。正常工作存储库的默认设置是启用它们。

git mergegit rebase 之后(即 git pull 的后半部分),HEAD@{1} 提取 reflog 中的第一个条目。假设您成功合并或变基(因此 HEAD 的前一个值是旧引用),这会让您获得前一个 HEAD。如果你做了一个 rebase,它失败了并且需要人工帮助,之前的 HEAD 会在 reflog 中更靠后,但是 ORIG_HEAD 将指向之前的提交。当前分支本身的 reflog 也很有用。


1幸运的是,世界上很少有像git pull这样的东西,因为git pull是一个设计糟糕的便利工具,通常比它更不方便方便。

2HEAD是否真的是一个参考名称是有争议的。出于重新记录的目的,它是。