1

我有一个带有两个分支的存储库,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工具)。

4

1 回答 1

2

Git 和 Mercurial 都比您想象的更容易处理这个问题(并且比 svn 或 CVS 更容易)。那是因为 git 和 Mercurial 合并更改而不是差异

如果您有两个分支 A 和 B,并且在执行此操作时已更改barfoo在分支 A 中:

hg update B
hg merge A

它将合并当前 A 中尚未合并到 B中的所有变更集bar。这将包括您要foo更改的内容,您必须手动排除该特定更改,但只有一次

下次你这样做:

hg update B
hg merge A

它将再次合并到 A 中当前尚未合并到 A 的所有变更集中,但是由于执行barto的变更集foo已经被合并,所以A 有s 并且 B 有s并不重要,因为那现在正在合并的变更集中没有创建差异,该更改不会应用于B 并且您不必再次手动拒绝它。foobars

这是具有完整图历史的 CVS 带来的主要优势之一。您没有合并两个快照,而是将分支 A 中的新差异应用到分支 B,因此如果差异不是新的,您不必重新拒绝它——系统会记住,“哦,我记得,你不想要那个”

于 2012-06-04T15:28:49.650 回答