将已提交的变更集转换为Mercurial中未提交的更改

时间:2012-01-18 09:58:59

标签: version-control mercurial dvcs

有没有办法将单个提交(例如我的本地存储库中的tip更改集)转换为工作目录中未提交的更改?
我知道hg strip删除了指定的变更集并将其备份,但它是否将这些变更集转换为工作目录中未经更改的变更?

编辑:

关于 hg rollback的使用。

如果我想要hg rollback之前有未提交的更改,该怎么办?我必须先付款吗?最后几次提交怎么样?顺序hg rollback是否会将这些提交的更改与现有的未提交更改进行叠加?

3 个答案:

答案 0 :(得分:7)

  

如果您正在尝试重做最后一次提交(可能有更好的提交消息,可能修复了错误),那么您现在应该使用

     

<强> $ hg commit --amend

     

更新上次提交。这比使用hg rollback更安全,如下所述。

如果提交是最后一次提交,并且未在任何地方更新,则可以使用hg rollback。请阅读hg help rollback - 这是一个潜在的破坏性命令。

它的作用:hg rollback将回滚存储库中的最后一个transaction。每次hg commithg pullhg unbundle等,您都会创建新的交易。当一切都安全存储后,Mercurial会关闭交易。如果在交易过程中出现问题,Mercurial可以恢复(参见hg recover)。您还可以使用hg rollback手动回滚上一个事务。请参阅hg rollback --dry-run以预览命令将执行的操作。

回滚命令不会触及您的工作副本。这意味着之前显示为已修改的文件将再次显示为已修改。所以很容易做到

$ hg commit -m "Fixed buug-123"

Ups,提交消息中的拼写错误!我们来解决这个问题:

$ hg rollback
$ hg commit -m "Fixed bug-123"

(使用hg commit --amend代替Mercurial 2.2及更高版本。)

最后一次提交消息也保存在.hg/last-message.txt中,因此如果您的shell历史记录中没有它,则可以从那里恢复。

  

如果我想要进行hg回滚之前有未完成的更改怎么办?我必须先付款吗?

回滚不会触及工作副本。这意味着工作副本中的任何其他更改将与变更集中的更改一起显示。就好像你根本没有输入hg commit一样。

  

最后几次提交怎么样?顺序hg回滚是否会将这些提交的更改堆叠到现有的未更改的更改中?

不,您只有one level of rollback,因为我们只跟踪最后一笔交易。

答案 1 :(得分:1)

使用Mercurial Queues(折叠|展开变更集)

可以更轻松地将任何变更集(或变更集集)转换为本地变更

TortoiseHG-centric manual(对于旧的GUI)逐步显示操作

答案 2 :(得分:0)

尽管你应该尽可能使用hg commit --ammend,但我现在更喜欢新的更强大的mecurial历史编辑功能:hg histedit,特别是如果你熟悉git。

您可以通过简单地执行hg out来查看要返回的修订版本(即您想要选择尚未推送的版本)。