当使用书签作为轻量级分支时,Hg相当于“git log master..HEAD”?

时间:2013-08-22 00:48:57

标签: git version-control mercurial branch

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

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

git log <master>..HEAD

其中<master>是父分支的名称。

我想知道,Mercurial中这个带书签的命令相当于什么?

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

  • 它与上面的git命令具有相同的语义,就其列出的修订版本以及显示的顺序而言(显然)。
  • 与git命令一样,它不涉及键入当前&#34;分支&#34;的名称。 (书签)。
  • 它不需要在当前&#34;分支&#34;的位置存在书签。与父母&#34;分支&#34;分开。它可能需要存在指向父母的头部的书签&#34; branch&#34; - 我们可以将此书签称为master
  • 很短。我真的不想输入一个长的revset表达式,每次我想这样做时都必须用引号括起来。 (那就是说,我还没弄明白任何 revset表达式给了我我想要的东西,所以即使很长的也会有进步。)

1 个答案:

答案 0 :(得分:6)

Git log man-page(带有Git revisions man-page的链接)定义了如下范围规范:

<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>))

应该足够了。

仔细看看,这个revset实际上遵循了规范。它以相反的顺序显示从当前工作副本的父级可以访问的提交,但不包括从给定书签可访问的提交(在您的情况下为“master”)。我认为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>, .)

如果单词“range”太多而无法为您输入,您也可以使用一些特殊字符:

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

结果简写

hg log -r_(<bookmark>)

甚至比

更短
git log <bookmark>..HEAD

但当然,这只是挑剔,无论如何。

相关问题