我是一个gituri用户,对mercurial的分支感到困惑。我应该如何跟踪小变化?


32

我以前一直使用git,但是我想为python做贡献,所以现在我必须学习mercurial,我发现它非常令人沮丧。

因此,我做了几个小补丁,并希望将它们作为提交记录在本地Mercurial存储库中。显然,有四种方法可以处理水银的分支。1和4对我来说完全是荒谬的,命名分支似乎是重量级的,我觉得我不应该将它们用于快速1提交修复,所以我使用了书签。

现在,我的补丁程序被拒绝了,我想从存储库中删除我的一个书签分支。好的,在git中,我只是强行删除我的分支而忘了它,所以我删除了书签,现在出现以下问题:

  • TortoiseHG hg log仍然显示commit和defaultbranch有2个头。如果我理解正确,那么没有其他插件您将无法删除hg中的提交。

  • Mercurial不仅具有散列,而且具有修订号。当我添加了一些自己的提交时,所有之后提交的提交都具有与主要中央存储库不同的修订号。

  • hg update在拉动master书签后自动将其移动到最新提交,但是在TortoiseHG中找不到该方法。

我究竟做错了什么?这是正常现象吗?应该,我应该忽略这些问题吗?或者我应该如何与分支机构合作?

Answers:


22

就您的情况而言,就我个人而言,我什至不会创建分支,除非我正在进行多个更改,而每个更改都需要核心开发人员接受。

只需克隆他们的存储库并在其中工作,然后发出拉取请求即可。

如果要使用分支,则宁愿使用命名分支。它们是专门为此目的而设计的,而没有书签。我不明白为什么您会认为它很重。

Mercurial在其Wiki上有一整页,描述了“ 修剪死枝 ”的不同方式。“使用克隆”选项应满足您的要求。

为了回答您更具体的问题...

TortoiseHG和hg日志仍然显示commit和default分支有2个头。如果我理解正确的话,没有其他插件您将无法删除hg中的提交。

这是我刚接触Mercurial时犯的一个错误。不要害怕那些额外的插件。它们中的一些是非常强大的工具,以后常常会被带入核心产品。这就是Mercurial的运作方式。如果您需要执行一项特定任务,请获取并使用它。

修改历史记录在Mercurial世界中被认为是一件坏事,因此,香草产品并不总是具有Git用户认为应该拥有的所有东西,但是对于那些想要使用该应用程序但具有不同优先级的人来说,有很多插件。

Mercurial不仅具有散列,而且具有修订号。当我添加了一些自己的提交时,所有之后提交的提交都具有与主要中央存储库不同的修订号。

不用担心版本号。他们只是为了方便而已。哈希码是从回购传递到回购的重要标识符。版本号在存储库中不一致。查看Hg Init以获得良好的解释。

修订号只是使用单个存储库时的方便且更易记的快捷方式。

拉动将主书签自动移动到最新提交后,我会进行hg更新,但是在TortoiseHG中找不到解决方法。

使用TortoiseHG时,请使用工作台而不是其他工具。一切(几乎)都在那里。更新位于修订上下文菜单中。它并不总是很直观,但是上面的链接提供了一个很好的指南,随着您习惯它,您最终会充满信心地放弃。


我当然已经看到过这样的论点,即正确命名的分支意味着在hg
jk中

9

显然,有四种方法可以处理水银的分支。1和4看起来对我完全荒谬,命名的分支似乎很重量级

在Mercurial中,您不创建分支。每个提交实际上都是一个分支,任何提交都可以有多个父母和多个孩子。因此,这是组织同一实体的四种不同方式。

可以给他们使用不同的名称,而不必使用,但这是一个好主意。命名分支没有重量级的东西-只是一些额外的元数据。在任何情况下,我个人都更喜欢命名分支。

TortoiseHG和hg日志仍然显示commit和default分支有2个头。

这正是使用命名分支而不是将所有内容都转储到的原因default

如果我理解正确的话,没有其他插件您将无法删除hg中的提交。

你不能真正删除所有的水银任何东西,你不应该。您可以使用,hg strip但它不会被记录-您基本上只是切断了本地存储库的一部分。您不能推动该操作,并且如果从具有在本地剥离的分支的存储库中拉出,它将返回。

Mercurial不仅具有散列,而且具有修订号。当我添加了一些自己的提交时,所有之后提交的提交都具有与主要中央存储库不同的修订号。

数字没有任何意义。如果他们使您感到困惑,则可以忽略它们。

拉动将主书签自动移动到最新提交后,我会进行hg更新,但是在TortoiseHG中找不到解决方法。

我还没有使用过TortoiseHG,但hg pull -u会同时使用pullupdate

我以前一直使用git,但是我想为python做贡献,所以现在我必须学习mercurial,我发现它非常令人沮丧。

没关系,许多Mercurial用户对Git(包括我)也有相同的感觉。


6

即使Mercurial和Git相似,它们的设计也会有所不同,也许最重要的设计差异是在Mercurial中修改历史记录的灵活性不如git(因为这种做法不受欢迎)。

简短的回答:进行少量更改并不重要,您仍然可以使用分支。如果你想删除一个分支,然后使用书签以便以后可以将其删除,剥离后的变化。

首先,尝试对您提到的一些内容有所了解:

  • 之所以将1和4视为分支,是因为每次提交时,您实际上都在创建一个未命名的分支(如果在您的源/受祝福的存储库中同时存在另一个提交),则从技术上讲,这是一个分支。在方法4中,您正在创建一个新的“ head”,而在方法1中,您不是。头应该合并。我同意方法1有点愚蠢,但我想有些似乎喜欢它……对于小型项目。

  • 对于方法2,不是分支很重,而是分支是永久的。除非使用带状扩展名,否则无法删除分支。再次,Mercurial的设计哲学并没有去修改历史(但是在这一方面已经变得更好)。

  • 关于修订号,它们只是您使用与修订有关的所有命令的本地参考,更易于阅读。如果您喜欢使用哈希,仍然可以。修订号只是一个捷径,对于不同存储库之间的任何内部操作,Mercurial都不会理会。

现在,回答您的其他问题:

  • 您可以检查具有的头hg heads,如果在单个命名分支中看到2个以上的头,则最好将它们合并。那可能就是您的书签所在的位置
  • 要摆脱您刚刚进行的修订,可以这样做hg rollback,但我想事实并非如此。
  • 要删除书签,只需执行 hg bookmark --delete yourbookmark
  • 您会很高兴在历史上轻松地削减分支机构。查看Rebase扩展Strip操作
  • Mercurial已经捆绑了多个扩展,但默认情况下未激活它们。只需进入任何文件夹,然后右键单击任何位置以获取TortoiseHG上下文菜单,进入“全局设置”,然后进入“扩展”:激活MQ扩展和Rebase扩展。这不会破坏存储库之间的兼容性。
  • 现在您在这里,您可以:
    • 删除书签开始的位置(这可能会解决您的问题)
    • 为了使可视化更容易,也许您可​​以在前面重新设置您的更改,然后再删除它们。我刚刚提到了变基,因为它可能对您将来有用。

另外,在git中,您可以拥有“私有本地分支”,因为您必须显式推送它们,然后可以将其删除。在Mercurial中,您可以推送所有已拥有的内容,但是,如果要避免这种情况,可以使用“ 阶段”功能并将一组修订标记为secret。秘密修订不会被推送。

最后,您没有做错任何事情,请记住它们只是使用稍有不同的思维方式构建的不同工具,这些思维方式可以归结为:修改历史记录(git)或不修改历史记录(hg)。在Mercurial中,很难修改历史记录(尤其是使用Phases),这就是为什么有些人喜欢它比git更好的原因


无法保证执行后删除记录命名分支的变更集的所有分散副本hg strip。我猜人们可能会就Git分支名称的分散副本争论相同,除了命名分支具有全局命名空间而Git分支名称没有全局命名空间的区别。并且由于名称分支而存在多个头。对于分散式VCS,这是一种传染性设计错误。
谢尔比·摩尔三世

1

我发现,不用担心分支机构是最容易的。我只是找到了我想在历史中的哪个位置进行编辑并根据需要创建提交(又名匿名分支)。有时候,如果我不得不在不同的环境中在不同的主题之间跳转,那么书签可能会很有用,但是大多数时候我都不会为它们烦恼。命名分支对于寿命长的分支(bug修复分支,项目分支)是可以的,但是对于1或2提交的修复,它们不是完成任务的正确工具。

匿名分支的诀窍是,如果您不想推送它们,即要将它们保持在本地,则将其阶段设置为“秘密”。如果您确实要推送它们,但又不想基于它们进行任何提交,则只需在它们之上提交“ --close-branch”,这意味着它们不再出现在“头”列表中将不再抱怨该分支上的多个主管。


-1

我认为我们可以简单地使用书签而不是分支。无论如何,我们将继续支持该产品,而长期合并两个分支机构将是一件令人头疼的事情。

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.