繁体   English   中英

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

[英]Is `hg pull --rebase` analogous to `svn update`?

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

  1. 克隆自
  2. 当他们有他们希望其他团队成员看到的贡献时,推动他们
  3. 当他们想要看到其他人的贡献时拉出来。
  4. 等等

如果是这样,我会认为hg updatesvn update不相似(为什么会有两个命令完全相同?)。 从我可以收集到的, hg update更像svn revert 那是对的吗?

更新:

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

正如其他人所指出的,差不多但并不完全。 为了减少与svn update相似性(并且增加对一般DVCS的遵从性,特别是Mercurial,最佳实践[1]):

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

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

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

也就是说,以自己的方式思考Mercurial(以及其他DVCS)并没有尝试从Subversion / CVS风格的思维转换。

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

不完全是。

hg pull从其他存储库中获取修订版并将它们添加到存储库克隆中的本地可用修订版,但不更新您的工作副本 - 仅更新您存储库 (对于DCVS,如hg / git / etc不同)作为工作副本的事情)。

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

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

相当于Mercurial的svn update将是hg pull --update ,这相当于做hg pull然后hg update一个接一个地hg update

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

  1. A会对某些更改进行hg commit
  2. A hg push将它们推向中央存储库。
  3. B则hg pull从中央存储库将他们拉进自己的克隆。
  4. B执行hg update以更新其工作副本以反映拉入其克隆的更改。

在没有中央存储库的系统中,它看起来像这样:

  1. A会对某些更改进行hg commit
  2. 已经克隆了A的回购的B,想要那些改变,因此直接从A的回购中获取hg pull
  3. B使用hg update将其工作副本hg update为更改。

此外,相当于svn reverthg revert :)

hg pull --update

将等同于svn update

如本SO问题所述

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

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

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

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

命令hg pull --rebase并不完全类似于 svn update ,但结果可能是相同的。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM