6

寻求在 Mercurial 中实现涉及轻量级分支的工作流的 Git 用户通常会指向Mercurial书签。简而言之,建议是维护多个与 git 分支相对应的头,并用书签命名它们。

在这样的工作流程中,一个共同的愿望是查看当前分支中自其从父分支(通常master或另一个长期存在的分支)分支以来所做的所有提交的列表。在 git 中,这可以通过以下方式完成:

git log <master>..HEAD

<master>父分支的名称在哪里。

我想知道,在 Mercurial 中这个命令与书签的等价物是什么?

我正在寻找具有以下属性的命令:

  • 它与上面的 git 命令具有相同的语义,它列出了哪些修订版本以及以什么顺序(显然)。
  • 与 git 命令一样,它不涉及键入当前“分支”(书签)的名称。
  • 它不需要在当前“分支”与父“分支”分歧的点存在书签。它可能需要存在指向父“分支”头部的书签——我们可以称之为书签master
  • 它很短。我真的不想输入一个长的 revset 表达式,每次我想这样做时都必须用引号括起来。(也就是说,我还没有想出任何可以给我想要的 revset 表达式,所以即使是一个很长的表达式也是进步的。)
4

1 回答 1

6

Git 日志手册页(带有指向 Git 修订手册页的链接)定义了范围规范,如下所示:

<rev1>..<rev2>

   Include commits that are reachable from <rev2> but exclude those that are reachable from <rev1>.

它还说关于订单:

By default, the commits are shown in reverse chronological order.

鉴于此规范,Mercurial revset

reverse(ancestors(.)-ancestors(<bookmark>))

应该足够了。

仔细一看,这个修订集实际上完全遵循规范。它以相反的顺序显示可从当前工作副本的父级访问的提交,不包括可从给定书签(在您的情况下为“主”)访问的提交。我认为 Git 的语法是本规范的简写。您可以使用所谓的 revset 别名在 Mercurial 中执行相同的操作(创建快捷方式)。

将以下行放入您的 .hgrc 中:

[revsetalias] 
range($1)=reverse(ancestors(.)-ancestors($1))

将使您能够使用它:

hg log -r range(<bookmark>)

如果你想让它更灵活,你可以在 .hgrc 中这样定义它:

[revsetalias] 
range($1,$2)=reverse(ancestors($2)-ancestors($1))

并使用以下内容获取 HEAD 示例:

hg log -r range(<bookmark>, .)

如果“范围”这个词对您来说太多,您也可以使用一些特殊字符:

[revsetalias] 
_($1)=reverse(ancestors(.)-ancestors($1))

由此产生的速记

hg log -r_(<bookmark>)

然后甚至比

git log <bookmark>..HEAD

但是,无论如何,这当然只是吹毛求疵。

于 2013-08-22T08:41:55.787 回答