3

git log --first-parent省略合并提交的第一个父级以外的所有内容。

例子:

$ git log --oneline --graph

* 087f5ed Master C
*   36c50a2 Merge branch 'feature'
|\  
| * 98c89df Feature B
| * 89b3a7b Feature A
* | 9a95133 Master B
|/  
* 766c9b0 Master A

$ git log --oneline --graph --first-parent

* 087f5ed Master C
* 36c50a2 Merge branch 'feature'
* 9a95133 Master B
* 766c9b0 Master A

有水银等价物吗?

4

4 回答 4

4

直接等效:hg log -r '_firstancestors(...)'

有一个直接的等价物:隐藏的修订集_firstancestors遵循每个合并的第一父 (p1) 侧。hg merge [second parent]在 Mercurial 中,就像在 Git 中一样,第一个父级是在调用时签出的提交。

hg log -r '_firstancestors(myfeature)'

'hidden' 表示它以下划线开头,并且没有在帮助等中列出,但如果您知道它存在,仍然可以使用它。我不知道为什么它被隐藏了。

例子

这个 revset 别名列出了功能分支上的所有提交,同时忽略所有祖先,只要master将其合并到分支中以使其保持最新。(我工作的商店更喜欢合并而不是变基)。

[revsetalias]
feature($1) = _firstancestors($1) and not _firstancestors(master)

[alias]
f = log -r "feature($(echo $HG_ARGS| sed 's/^f //'))"

示例用法(使用我自己的日志记录模板):

$ hg f myfeature
o  423 myfeature default/myfeature -- Esteis -- 2016-07-12 -- 123abc
|  this
o    422 -- Esteis -- 2016-07-12 -- 123def
|\   merge master into myfeature
o ~  421 -- Esteis -- 2016-07-12 -- 456abc
|    that
o  420 -- Esteis -- 2016-07-12 -- 789def
|  and the other
于 2016-10-03T11:44:53.283 回答
1

您可以为此使用修订集:

hg log -r "p1(merge())"

merge()获取所有合并提交并p1()获取这些提交的第一个父级。

用于hg help revsets获取有关修订集的更多信息。

于 2013-03-13T08:31:28.503 回答
1
>hg glog -r 410:426 --template "{rev} - {desc|firstline|fill68}\n"
o    426 - Merge test fixes for dulwich changes and output changes.
|\
| o    425 - Merge incoming fix.
| |\
| | o  424 - getremotechanges: fix incoming support
| | |
o | |  423 - overlay: stop using deprecated tree.entries() method
| | |
| o |  422 - Fix all-version-tests.
| | |
o | |  421 - Test output format tweaks for test-outgoing.
| | |
o | |  420 - test-incoming: fixes for hg 1.7
| | |
| o |    419 - Merge fix for `hg out` failing on empty repo.
| |\ \
| | o |  418 - In some situations where a reference is being used but does not
| | | |  exist in _map_git or _map_hg, silently skip the reference rather
| | | |  than throwing an error. This allows hg outgoing to work on
| | | |  repositories which do not contain any revisions at all.
| o | |  417 - only want heads and tags
| |/ /
| o |  416 - test-url-parsing: update expecations missed by edaadbd99074
| | |
| o |  415 - to be recognized port number in path to repository
| | |
| o |  414 - Unbreak outgoing to non-git repos with hg pre-1.9
| | |
| o |  413 - test fixes for progress cleanup
| |/
| o  412 - Fix mercurial issue2855
| |
| o  411 - Convert dulwich progress into mercurial ui.progress
|/
o  410 - test-incoming: only run on hg 1.7.x and newer

我没有使用 gist 中极度退化的案例,而是使用了真实存储库 DAG(hg-git 存储库)的一部分。我希望,选择足以说明正在解决的问题。

需要的 revset(用简单的英语)将是

“范围 A:B 没有第二个父级,它是合并集的祖先”

在修订功能语言(TBT!)

-r "410::426 - (p2(merge()) or ancestors(p2(merge())))"

如果将全部变更集作为源代码,则更具可读性的形式将类似于

hg log -r "!(p2(merge()) or ancestors(p2(merge())))"

编辑 1

我测试了 revset,重新考虑了方法(而不是排除我只想将需要添加到空集),目前我的用例的最近迭代(有错误,找不到解决方案)是

(p1(ancestors(p1(426))) or p1(426) or 426) and 410::426

其中(仍然)包括一些不需要的修订

在此处输入图像描述

于 2013-03-18T10:24:17.517 回答
0

hg log --follow-first似乎做了大致相同的事情,但有一些规定:

  1. 它已被弃用(我找不到任何解释)。

  2. 我不知道如何让它显示除了来自当前变更集的直线历史之外的任何内容(例如,显示来自两个不同头的第一个父级之后的历史(相当于git log --first-parent branch-a branch-b),尽管这可能只是因为我对 Mercurial 缺乏了解。

  3. 它显示了空的支线hg log -G

    $ hg log -G --template '{node|short} {desc|firstline}'
    
    @  51b90923fc9d Master C
    |
    o    bb51d979fd68 Merge branch 'feature'
    |\
    | o  a9ca2597ebbc Feature B
    | |
    | o  d0a54af09272 Feature A
    | |
    o |  77ceb31100be Master B
    |/
    o  b5a0b2c7468f Master A
    
    $ hg log -G --template '{node|short} {desc|firstline}' --follow-first
    
    @  51b90923fc9d Master C
    |
    o    bb51d979fd68 Merge branch 'feature'
    |\
    o |  77ceb31100be Master B
    |/
    o  b5a0b2c7468f Master A
    

    上面的示例可能看起来还不错,但请参阅https://gist.github.com/MaxNanasy/5184202以获取此行为呈现笨拙输出的示例。

    如果问题 #2 是不可克服的,这个问题可能并不重要,因为hg log没有-G将是使用--follow-firstAFAICT 的唯一有用方法。

于 2013-03-18T00:40:55.177 回答