Mercurial中Revert和Update之间的区别

Eda*_*aor 53 version-control mercurial

我刚刚开始使用Mercurial,而且我遇到了一些我不理解的东西.

我对几个文件进行了更改,现在我想撤消对其中一个文件所做的所有更改(即返回上一次提交一个特定文件).

据我所见,我想要的命令是还原的.

在我链接的页面中,有以下声明:

但是,此操作不会更改工作目录的父修订版(或未提交合并时的修订版).要撤消未注册的合并,可以使用"hg update -C -r".这将把父母重置为第一个父母.

我不明白两者之间的区别(hg revertvs. hg update -C -r).任何人都可以告诉我这个区别吗?在我的情况下,我真的希望还原或更新摆脱我对文件所做的更改吗?

jk.*_*jk. 65

第一个区别是revert可以在工作副本的子集上工作,而更新在整个工作副本上工作.另一个区别是当你想要回到最后一个提交的版本以外的版本时会发生什么.

如果我们有修订(提交上限,小写是工作副本中的更改,父修订是C)

A-B-C-d
Run Code Online (Sandbox Code Playgroud)

update -C -r B 会给你

A-B-C
Run Code Online (Sandbox Code Playgroud)

将您的工作副本设置为B,任何更改都将导致从B分支(父级修订设置为B)

A-B-C
  \e
Run Code Online (Sandbox Code Playgroud)

revert -r B 会给你

A-B-C-b'
Run Code Online (Sandbox Code Playgroud)

其中b'是一组更改,它们撤消中间提交的更改中的所有内容,在这种情况下,它会撤消所有C中的任何更改.现在只需加入b'集合(父级修订在C处保持不变)

  • 您对如何恢复/更新除最新版本之外的版本的解释非常好.我只想补充一点,提到这种区别的帮助中的句子是"不会改变工作目录的父修订版".在jk的例子中,"工作目录的父修订版"以C开头.随着更新,它最终为B,并且在恢复时它仍然是C("不会改变").在任何一种情况下,都可以用"hg父母"查看.此外,"还原可以在工作副本的子集上工作"来自此 - 只有一个工作目录父,并且所有文件共享它. (6认同)
  • 谢谢,很好的答案.只有一个澄清:你写的(最后一行)"会给你ABC-b',其中b'是一组更改,它们撤消了中间提交的更改中的所有内容,在这种情况下它会撤消所有的C.现在只需加入任何更改b'集合(父级修订在C处保持不变)".如果我理解正确,你只剩下一个包含B版本的工作目录,但是你的父级是C,所以如果你现在提交,你基本上会有一个"ABC-B"树(其中B')与B)完全相同.换句话说,直到B'的历史保持不变? (4认同)