我有一个包含两个分支的存储库,A
和B
。
它们应该是相同的代码,但针对它们所依赖的库的不同版本。
因此,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()
”的行?
基本上,由于它们所依赖的库的版本,分支A
和B
之间存在一些不同的代码块,但是我编写的代码使得除了这些代码之外,其余的代码是相同的。
我只是不想每次合并时都要处理这些代码块,因为否则我更容易捏造合并并切换其中的一些块。
我唯一可以设想的是以某种方式为每个调用diff --ignore-matching-lines [impressively_long_argument]
的文件为每个文件制作不同的差异预设 - 这似乎是错误的方法!
(我可以在git中执行此操作吗?这是我要切换版本系统的功能,虽然我不知道如何实现它。或者解决方案可能是找到一个复杂的diff
工具)
答案 0 :(得分:2)
Git和Mercurial都可以更容易地处理这个问题(比起svn或CVS更容易)。这是因为git和Mercurial合并更改而非差异。
如果您有两个分支A和B,并且当您执行此操作时,您已在分支A中将bar
更改为foo
:
hg update B
hg merge A
它将合并到目前尚未合并到B中的所有更改集中。这将包括您bar
到foo
的更改,以及您和#39;我必须手动排除特定的更改,但只有那一次。
下次你这样做:
hg update B
hg merge A
它会再次合并到当前A中尚未合并到A的所有变更集,但由于bar
到foo
的变更集已合并到根本不重要 A有foo
个而且B有bars
s因为现在正在合并的变更集中没有创建差异,不会应用到B,你不必再次手动拒绝它。
这是具有完整图表历史记录的CVS带来的关键优势之一。你没有合并两个快照,你将分支A中的新差异应用到分支B,所以如果差异不是新的,你就不必重新拒绝它 - 系统记得,"哦,我记得,你并不想要那个" 。