合并文件时忽略某些*行*

时间:2012-06-04 07:05:37

标签: version-control mercurial diff

我有一个包含两个分支的存储库,AB

它们应该是相同的代码,但针对它们所依赖的库的不同版本。

因此,A/file1.js可能会包含一个片段:

this.actor.bar();

虽然B/file1.js可能有:

// `bar` had its name changed to `foo` in version X.Y of library Z
this.actor.foo();

然后我继续A说出并进行了一系列与两个版本的库Z兼容的更改,并希望将它们合并到B

我有什么方法可以告诉mercurial,“进行合并但忽略*.bar()成为*.foo()”的行?

基本上,由于它们所依赖的库的版本,分支AB之间存在一些不同的代码块,但是我编写的代码使得除了这些代码之外,其余的代码是相同的。

我只是不想每次合并时都要处理这些代码块,因为否则我更容易捏造合并并切换其中的一些块。

我唯一可以设想的是以某种方式为每个调用diff --ignore-matching-lines [impressively_long_argument]的文件为每个文件制作不同的差异预设 - 这似乎是错误的方法!

(我可以在git中执行此操作吗?这是我要切换版本系统的功能,虽然我不知道如何实现它。或者解决方案可能是找到一个复杂的diff工具)

1 个答案:

答案 0 :(得分:2)

Git和Mercurial都可以更容易地处理这个问题(比起svn或CVS更容易)。这是因为git和Mercurial合并更改而非差异

如果您有两个分支A和B,并且当您执行此操作时,您已在分支A中将bar更改为foo

hg update B
hg merge A

它将合并到目前尚未合并到B中的所有更改集中。这将包括您barfoo的更改,以及您和#39;我必须手动排除特定的更改,但只有那一次

下次你这样做:

hg update B
hg merge A

它会再次合并到当前A中尚未合并到A的所有变更集,但由于barfoo的变更集已合并到根本不重要 A有foo个而且B有bars s因为现在正在合并的变更集中没有创建差异,不会应用到B,你不必再次手动拒绝它。

这是具有完整图表历史记录的CVS带来的关键优势之一。你没有合并两个快照,你将分支A中的新差异应用到分支B,所以如果差异不是新的,你就不必重新拒绝它 - 系统记得,"哦,我记得,你并不想要那个"