Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/mercurial/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mercurial 使用hg pull/push/merge/graft将更改标记为已合并或故意忽略?_Mercurial_Merge_Dvcs_Cherry Pick - Fatal编程技术网

Mercurial 使用hg pull/push/merge/graft将更改标记为已合并或故意忽略?

Mercurial 使用hg pull/push/merge/graft将更改标记为已合并或故意忽略?,mercurial,merge,dvcs,cherry-pick,Mercurial,Merge,Dvcs,Cherry Pick,我正在从Subversion过渡到Mercurial,在那里我习惯于使用svnmerge.py来跟踪已经合并或被阻止合并的更改: # Mark change 123 as having already been merged; it will not be merged again, even if a range # that contains it is subsequently specified. svnmerge.py merge -M -r123 # # Block change 3

我正在从Subversion过渡到Mercurial,在那里我习惯于使用svnmerge.py来跟踪已经合并或被阻止合并的更改:

# Mark change 123 as having already been merged; it will not be merged again, even if a range
# that contains it is subsequently specified.
svnmerge.py merge -M -r123
#
# Block change 326 from being considered for merges.
svnmerge.py merge -X -r326
#
# Show changes that are available for merging from the source branch.
svnmerge.py avail
#
# Do a catchall merge of the remaining changes.  Neither change 123 nor change 326 will be
# considered for merging.
svnmerge.py merge
我希望能够为hg pull/push/merge/graft做一些类似的事情,这样,如果我知道我永远不想合并给定的更改,我就可以阻止它的考虑,使后续的樱桃采摘、合并等变成一件更火更忘的事情。我做了很多谷歌搜索,但还没有找到一种方法来做到这一点

似乎也无法查看尚未起草的更改列表


当我经常整理其他开发人员并帮助他们进行合并时,能够做这些事情是非常有帮助的,这可能会被认为是“逆樱花拣选”,也就是说,标记你不想合并的更改。然后对其余部分进行大容量合并。

基于DAG的系统,如Mercurial ans Git,要么全有,要么全无:当合并两个分支时,对公共祖先和两个分支进行三向合并

三方合并只与每个分支的最后阶段有关。例如,如果您在10到1000个步骤中进行更改,这并不重要——合并结果将是相同的

这意味着忽略变更集的唯一方法是在合并之前将其退出:

$ hg backout BAD
这将取消分支上的变更集,使其看起来似乎从未从三方合并的角度进行过

如果要合并但忽略整个分支,则可以执行虚拟合并:

这会经过合并,但会恢复到提交前的旧状态


我能给你的最好建议是组织你的工作流程,这样就不需要上面的退避了。这意味着在最早的应用程序分支上提交错误修复。如果在创建feature X时发现了一个bug,那么使用
hg bisect
来确定该bug是何时引入的。现在更新回最旧的分支,您仍然希望修复该错误:

$ hg update 2.0
# fix bug
$ hg commit -m "Fixed issue-123"
然后将错误修复合并到所有后续分支中:

$ hg update 2.1
$ hg merge 2.0
$ hg commit -m "Merge with 2.0 to get bugfix for issue-123"

$ hg update 2.2
$ hg merge 2.1
$ hg commit -m "Merge with 2.1 to get bugfix for issue-123"
如果错误修复不再适用,则仍应合并,但应丢弃不相关的更改:

$ hg update 3.0
$ hg merge 2.2 --tool internal:local --non-interactive
$ hg revert --all --rev .
$ hg commit -m "Dummy merge with 2.2"
这确保您可以始终使用

$ hg log -r "::2.2 - ::3.0"

查看2.2分支上尚未合并到3.0的变更集。

MG在下面给出了答案,他说;DR版本是:基于DAG的系统(Mercurial、Git等)在跟踪合并内容方面做得很好,只要你避免cherrypicking(Git和Mercurial在设计上都不能很好地处理),那么已经合并的和需要合并的内容就会自行解决。唉,在$REALWORLD中,您最终得到了一个用于当前开发的分支,以及一个或多个代表稳定的分支,用于待发布和已发布以及在现场,这些分支中很可能存在有意的分歧。您希望普通的bug修复能够在分支之间轻松地流动,但您没有这样做;e、 例如,希望新功能流向稳定或支持分支,并且您不希望(比如)围绕当前开发分支中修复的bug进行的配置更改从支持分支返回。如果我生活在$REALWORLD之外的世界中,我需要更好的幻想。您描述的情况在非移植模式下非常有效。请观看2011年fogbugz世界巡演的视频,@bmp引导您将修复前向合并为多个发布版本,而无需使用命名分支或移植。只要你将一个补丁作为添加它的修订版的子版本(它
hg bisect
易于查找),你就可以使用
hg merge
将它向前拉到任何版本或待发布版本中,而不带任何其他变更集。我在已经很长的回答中添加了一点@Ry4an说得对,如果你知道三方合并的规则,那么你可以实现一个伟大的工作流程,从而向前合并,而不是向后合并。我毫不怀疑你是正确的,而且对于一个认真、专业的hg用户来说,你的方法会起作用。我有一点希望,因为SCM人员可能是唯一在多条开发线之间进行批发(即非嫁接)合并的人员。我曾希望有一些东西可以帮助“天真”的hg用户简化流程,但似乎没有。还有“皮塔·弗雷德”的例子,他设法把一切都搞砸了。每个组织都有一个这样的程序,开发限制他可能造成的损害的程序是很重要的。
$ hg log -r "::2.2 - ::3.0"