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

HC4*_*ica 6 git version-control mercurial branch

Git的用户寻求实现涉及水银轻量级分支的工作流程往往是指出于水银书签.简而言之,建议维护多个与git分支对应的头,并用书签命名.

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

git log <master>..HEAD
Run Code Online (Sandbox Code Playgroud)

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

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

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

  • 它具有与上面的git命令相同的语义,就其列出的修订版本以及以何种顺序(显然)而言.
  • 与git命令一样,它不涉及键入当前"分支"(书签)的名称.
  • 它不需要在当前"分支"偏离父"分支"的点处存在书签.它可能需要存在指向父"分支"头部的书签 - 我们可以调用此书签master.
  • 它很短.我真的不想输入一个长的revset表达式,每次我想这样做时都必须用引号括起来.(那就是说,我还没有弄清楚任何能让我得到我想要的表达方式,所以即使很长一段时间也会有进展.)

小智 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>.
Run Code Online (Sandbox Code Playgroud)

它还说关于订单:

By default, the commits are shown in reverse chronological order.
Run Code Online (Sandbox Code Playgroud)

鉴于此规范,Mercurial revset

reverse(ancestors(.)-ancestors(<bookmark>))
Run Code Online (Sandbox Code Playgroud)

应该足够了.

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

将以下行放入.hgrc:

[revsetalias] 
range($1)=reverse(ancestors(.)-ancestors($1))
Run Code Online (Sandbox Code Playgroud)

将使您能够使用此:

hg log -r range(<bookmark>)
Run Code Online (Sandbox Code Playgroud)

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

[revsetalias] 
range($1,$2)=reverse(ancestors($2)-ancestors($1))
Run Code Online (Sandbox Code Playgroud)

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

hg log -r range(<bookmark>, .)
Run Code Online (Sandbox Code Playgroud)

如果"范围"这个词太多而无法为您输入,您也可以使用一些特殊字符:

[revsetalias] 
_($1)=reverse(ancestors(.)-ancestors($1))
Run Code Online (Sandbox Code Playgroud)

由此产生的速记

hg log -r_(<bookmark>)
Run Code Online (Sandbox Code Playgroud)

然后甚至更短

git log <bookmark>..HEAD
Run Code Online (Sandbox Code Playgroud)

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