`hg pull --rebase`类似于`svn update`吗?

时间:2010-03-01 08:15:33

标签: svn version-control mercurial

这个问题假设团队成员有一个“有福的”中央存储库

  1. 克隆
  2. 当他们有他们希望其他团队成员看到的贡献时推送到
  3. 从他们想要看到其他人的贡献时拉出来。
  4. 如果是这样,我会认为hg updatesvn update不相似(为什么会有两个命令完全相同?)。根据我的收集,hg update更像svn revert。这是对的吗?

    更新

    我对rebase的理解主要基于本页的“常见案例”部分:
    https://www.mercurial-scm.org/wiki/RebaseProject

5 个答案:

答案 0 :(得分:41)

正如其他人所说,差不多但并不完全。为了降低与svn update的相似性(并且越来越多地遵守一般DVCS,特别是Mercurial,最佳实践[1]):

  1. hg pull -u(或hg pull后跟hg update),您的更改未提交且自上次提取后未进行任何提交更改。这与你可以得到的svn update接近,但DVCS的做法非常糟糕。 DVCS的一个细节是你可以在尝试将它们与其他人合并之前提交你的更改,从而有一个备份版本来回滚并重试失败的合并,这种做法就是这样。不要这样做。

  2. 提交更改后,
  3. hg pull --rebase。这会拉动上游更改,在其上重新应用更改,并允许您将更改作为线性历史记录推回。最终结果看起来与Subversion修订历史非常相似,但您可以在合并之前获得DVCS提交的好处。我不知道这种操作模式的安全性如何在Mercurial和Git之间进行比较;在Git中,您的更改的pre-rebase版本仍然存在,直到您执行git gc,但Mercurial没有明确的gc安全网。

  4. hg pull后跟hg merge,您的更改已提交到您的本地副本。尽管下面的脚注1,这是执行svn update的功能类比的传统Mercurial实践。这会产生非线性版本历史记录,但会跟踪和检查所有更改。

  5. 也就是说,Mercurial(以及其他DVCS)在他们自己的条件下有很多智慧,而不是试图从Subversion / CVS风格的思维中进行翻译。

    1. 如果你不是重写 - 历史 - 保持线性的思想学派。如果是,则rebase可能优于update。 Mercurial社区倾向于支持update

答案 1 :(得分:11)

不完全是。

hg pull从其他存储库中获取修订版本并将其添加到存储库克隆中的本地可用修订版本,但不会更新您的工作副本 - 只有您的存储库(对于像hg / git / etc这样的DCVS与工作副本不同)。

hg update将您的实际工作副本更新为本地存储库中的最新版本。

这与Subversion不同,因为在svn中,没有“本地存储库”这样的东西 - 唯一的存储库是服务器上的存储库;你只在本地有一份工作副本。因此,为什么update只是一个命令,而不是Mercurial的pull然后update

Mercurial的svn update相当于hg pull --update,相当于一个接一个地执行hg pull然后hg update

具有“中央”回购的DCVS的端到端工作流程如下所示:

  1. A会对hg commit进行一些更改。
  2. A将hg push推送到中央存储库。
  3. B做hg pull将它们从中央存储库拉到自己的克隆中。
  4. B会hg update更新其工作副本,以反映其克隆中的更改。
  5. 在没有中央回购的系统中,它看起来像这样:

    1. A会对hg commit进行一些更改。
    2. B克隆了A的回购,希望进行这些修改,从而直接从A的回购中做hg pull
    3. B使用hg update将其工作副本更新为更改。
    4. 此外,相当于svn revert的是hg revert。 :)

答案 2 :(得分:2)

hg pull --update

相当于svn update

如本SO question

所述
  

hg命令pushpull在存储库之间移动更改,updatecommit在工作副本和本地存储库之间移动更改。

所以在DVCS中,你有2个概念而不是1个:

  • 本地回购(拉/推)
  • 工作目录(这是SVN回购“尖端”的唯一本地表示)

答案 3 :(得分:2)

这是mercurial http://hginit.com/的精彩初学者指南。应该清楚解释大部分事情。从“不要尝试将svn知识应用于分布式vcs”开始!

答案 4 :(得分:2)

命令hg pull --rebase与<{1}}的类似并不完全相同,但结果可能相同。

在Subversion中,如果您更新工作副本,则会获得与任何本地更改合并的存储库中的最新更改。因此,存储库中的文件是最新的,但您可能仍然有未提交的更改。

在Mercurial中,svn update将从“中央存储库”(或您正在提取的任何存储库)获取最新更改,以更新您的存储库,然后随机提交您的本地提交。您仍然需要hg pull --rebase才能使您的工作副本与本地存储库相同。