2010-01-21 135 views
87

我是Mercurial的新手。只是找不到正确的命令。尝试更新/结帐没有运气。我正在使用本地存储库。谢谢如何在Mercurial中获取特定版本的文件?

+0

你说的 '特别版' 是什么意思?你有特别的版本吗?你想通过获得特殊版本来完成什么? – Omnifarious 2010-01-21 06:44:30

+0

@Omnifarious:我提交了一个稳定版本的文件。然后继续处理文件,但很快意识到我需要最后一个“好”版本。这可以通过更新svn来完成,但是当我尝试hg更新时,它会显示“0 files ...” – Codism 2010-01-21 13:27:49

回答

125

我想你想hg revert -r<rev> <file>(这将改变该文件,因为它是在给定的修订版)。

+0

是的,这正是他想要的。 :-) – Omnifarious 2010-01-21 17:10:54

+9

或者只是hg恢复如果你想放弃你当前的修改并获得最新的修改 – BlackTigerX 2013-09-15 07:03:03

+0

@BlackTigerX如果没有修改,修改后的文件将不会恢复到任何内容,即使它不是最最近承诺的版本。我有时使用它来修改版本之间的“樱桃选择”文件,所以这很重要。 – user2864740 2016-05-11 15:43:13

73

正如djc所说revert改变了一个文件,以配合以前的修订。如果你不想使用它,你可以使用hg cat -r revisionid filename(代替revisionid和当然的文件名)将文件输出到标准输出,适合重定向你喜欢的任何地方。

+3

purrrfect,正是我所希望的。 – yota 2015-03-19 07:06:40

+0

真棒,听到这样的事情总是很好。 – 2015-03-19 13:04:26

23

hg revert确实解决了这个问题。但我认为,你对更广泛的事情感到困惑,而不是简单地回答你的问题,并且想要更全面地回答。

hg update是一个完整的存储库命令,不适用于单个文件。这与以这种方式颠覆svn update不同。如果你这样做hg --help update你可以看到这种情况,因为该命令没有文件参数。它可以用来将整个存储库移动到特定的快照,但不能用于只将一个文件做到这一点。

如果输入hg --help,您会看到一系列命令。这是一个相当大的,有点令人生畏的名单,但如果你读通过它,你会发现这条线:

revert  restore individual files or directories to an earlier state 

现在,如果你只是想为了比较,最后的状态,有另一个命令你可能会感兴趣,那就是hg cat。这将允许您在任何特定版本中打印文件的内容。然后,您可以将其输出重定向到其他文件。然后,您可以将文件的旧版本和旧版本进行并排比较。

Mercurial有一个单独的命令update的原因是它有可能在Mercurial中做一些在Subversion中不可能的事情。你可以将update更早的版本,进行更改,然后提交。这将创建一个分支。 update命令的作用是还可以更改当前工作目录的父版本,并将该目录中所有文件的内容更改为该父版本的版本。

这意味着revert更改文件的内容(或者如果给出命令的正确参数,甚至整个存储库),但保留当前工作副本的父修订版本相同。

您可以通过使用hg parents命令找出当前工作副本的父版本(或合并时的修订版本)。

在Subversion修订版本中是严格的线性进展。 Mercurial在帽子下创建分支,而且它们几乎一样容易合并。修订形成DAG,而不是严格的线性进展。

9

要提取特定文件的特定版本,你可以做到这一点在Windows上:

hg cat "<FileToBeExtractedPath>" -r 9 > "<ExtractionPath>" 

这里,9是版本号。

甚至更​​好:

hg cat "<FileToBeExtractedPath>" -r 9 -o "<ExtractionPath>"