如何在Mercurial中获取文件的特定版本?


114

我是Mercurial的新手。只是找不到正确的命令。尝试更新/签出没有运气。我正在使用本地存储库。谢谢


@Omnifarious:我提交了文件的稳定版本。然后继续处理该文件,但很快意识到我需要最后一个“好的”版本。可以通过svn中的update来完成,但是当我尝试hg update时,它说“ 0个文件……”
Codism 2010年

Answers:


153

我认为您想要hg revert -r<rev> <file>(这会将文件更改为给定版本的文件)。


是的,那正是他想要的。:-)
全方位2010年

9
或只是hg revert <文件名>,如果您想放弃当前更改,并获取已
提交

@BlackTigerX没有修订的文件,即使不是最新提交的版本,未修改的文件也不会还原为任何文件。有时,我会用它来“修订”各版本之间的文件,因此这一点很重要。
user2864740

83

正如djc所说,revert更改文件的位置以匹配先前的版本。如果您不希望将其放置在适当的位置,则可以使用hg cat -r revisionid filename(当然,用revificationid和filename代替),它将文件输出到stdout,适用于重定向您想要的任何位置。


4
完美,正是我所希望的。
yota

太棒了,听到这样的声音总是很高兴。
Ry4an Brase

24

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,而不是严格的线性级数。


13

要提取特定文件的特定修订,可以在Windows上执行以下操作:

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

这里,9是修订号。

甚至更好:

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

1

来到这里试图获得以前的版本,所以这里是确切的命令:

hg revert -r .~1 <file>
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.