9

我有一个开发了很长时间的分支。在开发过程中,默认分支多次合并到该分支中。我现在想查看在忽略合并的情况下对该分支所做的所有更改,以确定将其合并为默认值是否安全。

我试过了

hg diff -r "branch('myBranch') - merge()"

但它仍然显示合并带来的变化。还尝试遵循此如何在 mercurial 中显示特定于命名分支的差异,

hg diff -r "branch('myBranch') - branch('default')"

仍然带来合并带来的变化。

4

6 回答 6

7

您的命令的问题在于,当您执行 ahg diff并将其传递几个变更集时,您实际上在这些变更集之间执行了差异,因此您将看到合并结果。

如果您只想查看变更集所做的更改,则可以使用export

$ hg export -r "branch('mybranch') and not merge()"
// lists the changes made by each changeset

为了便于查看,您可以将这些输出到名称基于修订/变更集 id 的文件中:

$ hg export -r "branch('mybranch') and not merge()" -o "%H.patch"

... 为 中的每个非合并变更集创建一个文件mybranch,并将其输出到名为“40 位变更集 id.patch”的文件。如果您更喜欢修订号(仅对您的本地存储库有用,因为修订 id 是本地的),请使用"%R.patch".

于 2013-01-02T10:58:39.383 回答
7

必须阅读有关revsets语法

你的情况

hg log -r "branch('myBranch') and ! merge()"

于 2012-12-21T15:09:38.663 回答
3

以下使用该log命令,但使用--patch参数它也可以显示修改后的行:

hg log --branch my-branch --no-merges --patch

简写:

hg log -Mpb my-branch
于 2015-11-26T12:21:06.353 回答
1

这是一个非常好的问题,我试图找到一个好的答案很长一段时间,但没有找到一个好的答案。好的,100% 有效的一件事是:

hg status     # make sure that you don't have local changes
hg up <target_branch>
hg merge <your branch>
hg diff > merge.diff
hg up -C  # this one cleans the merge

我一直使用这个工作流程,但它并不能完全满足我,因为它需要切换分支(当我实际上可能不想在这个确切的时刻进行实际合并时,我只是在检查那里有什么)

我一直在这里寻找一个好的解决方案,但到目前为止还没有找到。试过那些:

hg diff -r "branch('.') and ! merge()"  # this page
hg diff -r "default:branch('.') and not merge()"
hg diff -r "parents(branch(.)):branch('.') and not merge()"

这个问题也讨论过:

于 2018-02-01T17:21:22.897 回答
1

尝试:

    hg diff -r"ancestor(default,my_branch)" -rmy_branch

如果您没有对分支进行任何合并,那么“祖先”将选择原始分支点。如果您已完成合并,则“祖先”将选择最新的合并点。

例如,在下图中,您将获得 520 和 519 之间的差异:

@  521 (default)
|
| o  520 (my_branch)
|/|
o |  519
| |
o |  518
| |
o |  517
| |
| o  516
| |
| o  515
| |
| o  514
|/
o  513

在下面更简单的图表中,您将获得 516 和 513 之间的差异:

@  517 (default)
|
| o  516 (my_branch)
| |
| o  515
| |
| o  514
|/
o  513
于 2019-03-27T20:09:39.587 回答
0

Per Matt Mackall你可能想要的是:

hg diff -r mainbranchrev -r mywork

他写:

您可能会有“变更集是 delta”或类似的印象,这意味着 Mercurial 可以神奇地将一堆不连续的 delta 链接在一起,以构建一个更大的 delta,这就是您的更改。

事实上,Mercurial 比这简单得多。变更集实际上是一个快照:一组完整的完整文件,表示提交时项目的状态。差异只是这两个快照之间的差异。所以当你这样做时:

hg stat --rev '3408::3575 and user(mdiamond) 而不是 merge()'

..status 只是使用结果集的第一个和最后一个变更集来进行计算。

当您在开发分支上进行增量合并时,您的工作与主线开发密不可分,而 Mercurial 还不够聪明,无法按照您的要求解开它。最好的办法是将工作的负责人与主分支的负责人进行比较:

hg diff -r mainbranchrev -r mywork

..这将显示您所有的工作以及您必须做的任何合并修复。

于 2019-07-24T19:16:00.750 回答