53

什么是等效的 mercurial 命令(或工作流程)

git reset --mixed HEAD^

或者

git reset --soft  HEAD^

即我想保持工作树完好无损,但将存储库恢复到上次提交之前的状态。令人惊讶的是,我在 stackoverflow 或谷歌上没有发现任何有用的东西。

请注意,我不能使用

hg rollback

因为我在上次提交后使用 HistEdit 进行了一些历史重写。

添加以澄清: 经过一些变基和历史编辑后,我最终得到了 A<--B<--C。然后我使用 HistEdit 将 B 和 C 压缩在一起,得到 A<--C'。现在我想拆分提交 C'(我在 B 中提交了错误的文件)。我认为最简单的方法是将存储库恢复到状态 A(由于事先进行了所有变基和历史编辑,从技术上讲,它在存储库中从未存在过)并将工作树恢复到 C' 的状态,然后做两个提交。

4

2 回答 2

85

正确的复制方法git reset --soft HEAD^(撤消当前提交但保留工作副本中的更改)是:

hg strip --keep -r .

-1仅当您要剥离的提交是进入存储库的最后一次提交时才有效。.指当前签出的提交,这是 Mercurial 与 Git 的HEAD.

请注意,如果.有后代,它们也会被剥离。如果你想保留提交,那么一旦你有了提交 ID,你就可以:

hg update .^
hg revert --all -r <commit id>

这将更新到提交的父级,然后将工作副本中的文件替换为该提交时的版本。

于 2013-09-28T06:21:59.220 回答
1

我相信现在更现代、更简单的方法是hg uncommit. 请注意,这会留下一个空提交,如果您想稍后重用提交消息,这可能很有用。如果不这样做,请使用hg uncommit --no-keep不留下空提交。

hg 取消提交 [选项]... [文件]...

取消提交部分或全部本地变更集

This command undoes the effect of a local commit, returning the affected
files to their uncommitted state. This means that files modified or
deleted in the changeset will be left unchanged, and so will remain
modified in the working directory.

If no files are specified, the commit will be left empty, unless --no-keep
于 2020-10-12T17:14:16.927 回答