Mercurial:如何识别部分重叠的历史(细粒)?

时间:2012-06-21 20:19:53

标签: mercurial dvcs

Mercurial(或任何其他DVCS)如何识别部分重叠的历史记录?例如。细粒/粗粒。

Mercurial中是否有任何方法可以合并两个存储库 历史路线相似但不相同的地方?

E.g。其中一个代表有粗粒修改0,1,2 另一个有细粒修正0,0.1,0.2,1,1.1,1.2,2, 并提出一个单一的历史?

当我尝试使用我所知道的Mercurial时,这是我得到的分支和头部的混乱?

或者甚至是鸽友 回收1:0,1,1.1,1.2,2 回收2:0,0.1,0.2,1,2,3 合并:0,0.1,0.2,1,1.1,1.2 2,3

更详细

我想要的是一个可以识别文件内容相同的合并, 或者可以认识到两行历史相似,尽管并非所有版本都在一行中 在另一个, 并给出类似的东西:

o=o changesets with same file contents on different historical lines
o |  (line1) 
| |  changeset:   2:2a02e67e7b5d
| |  user:        Andy Glew <glew@mips.com>
| |  date:        Thu Jun 21 12:40:15 2012 -0700
| |  summary:     2
| o  (line2)
| |  changeset:   8:089179dde80a
| |  user:        Andy Glew <glew@mips.com>
| |  date:        Thu Jun 21 12:40:15 2012 -0700
| |  summary:     2
| |
| o  changeset:   7:615416921e33
| |  user:        Andy Glew <glew@mips.com>
| |  date:        Thu Jun 21 12:40:14 2012 -0700
| |  summary:     1.2
| |
| o  changeset:   6:a43a88065141
| |  user:        Andy Glew <glew@mips.com>
| |  date:        Thu Jun 21 12:40:14 2012 -0700
| |  summary:     1.1
| |
| |
o=o changesets with same file contents on different historical lines
o |  (line1) 
| |  changeset:   1:93cbae111269
| |  user:        Andy Glew <glew@mips.com>
| |  date:        Thu Jun 21 12:40:13 2012 -0700
| |  summary:     1
| o  (line2) 
| |  changeset:   5:fef4050e0162
| |  user:        Andy Glew <glew@mips.com>
| |  date:        Thu Jun 21 12:40:12 2012 -0700
| |  summary:     1
| |
| o  changeset:   4:b51fbedc72e5
| |  user:        Andy Glew <glew@mips.com>
| |  date:        Thu Jun 21 12:40:12 2012 -0700
| |  summary:     0.2
| |
| o  changeset:   3:45b7f64b2a23
| |  parent:      0:c80bc10826be
| |  user:        Andy Glew <glew@mips.com>
| |  date:        Thu Jun 21 12:40:12 2012 -0700
| |  summary:     0.1
| |
| |
|/
|
o  changeset:   0:c80bc10826be
   user:        Andy Glew <glew@mips.com>
   date:        Thu Jun 21 12:40:11 2012 -0700
   summary:     0

我可以想象在o = o点可能需要合并变更集。

但我希望自动识别它。

以下是如何创建此类历史记录的示例。 在这个例子中得到了解决,但在现实生活中发生了一些小事, 当一个项目想要粗粮提交,但我想保留细粒ciommits (以及向项目发放的粗粮)。

[glew@mipscs587 ~/hack/hg-granularity] 900$ bash 12:39:54>. ./eg

% set verbose

% mkdir hg-repo
% cd hg-repo
% ./hg-repo
% hg init
% echo 0 > a
% hg add a
% hg ci -m0 a

% cd ..
% hg clone hg-repo fine
updating to branch default
1 files updated, 0 files merged, 0 files removed, 0 files unresolved
% hg clone hg-repo coarse
updating to branch default
1 files updated, 0 files merged, 0 files removed, 0 files unresolved

% cd fine
./fine
% echo 0.1 > a; hg ci -m0.1
% echo 0.2 > a; hg ci -m0.2
% echo 1 > a; hg ci -m1
% cat a
1
% hg push default
pushing to /home/glew/hack/hg-granularity/hg-repo
searching for changes
adding changesets
adding manifests
adding file changes
added 3 changesets with 3 changes to 1 files
% hg glog
@  changeset:   3:fef4050e0162
|  tag:         tip
|  user:        Andy Glew <glew@mips.com>
|  date:        Thu Jun 21 12:40:12 2012 -0700
|  summary:     1
|
o  changeset:   2:b51fbedc72e5
|  user:        Andy Glew <glew@mips.com>
|  date:        Thu Jun 21 12:40:12 2012 -0700
|  summary:     0.2
|
o  changeset:   1:45b7f64b2a23
|  user:        Andy Glew <glew@mips.com>
|  date:        Thu Jun 21 12:40:12 2012 -0700
|  summary:     0.1
|
o  changeset:   0:c80bc10826be
   user:        Andy Glew <glew@mips.com>
   date:        Thu Jun 21 12:40:11 2012 -0700
   summary:     0


% cd ../coarse
% cp ../fine/a .
% cat a
1
% hg ci -m1
% hg glog
@  changeset:   1:93cbae111269
|  tag:         tip
|  user:        Andy Glew <glew@mips.com>
|  date:        Thu Jun 21 12:40:13 2012 -0700
|  summary:     1
|
o  changeset:   0:c80bc10826be
   user:        Andy Glew <glew@mips.com>
   date:        Thu Jun 21 12:40:11 2012 -0700
   summary:     0


% cd ../fine
% echo 1.1 > a; hg ci -m1.1
% echo 1.2 > a; hg ci -m1.2
% echo 2 > a; hg ci -m2
% cat a
2
% hg push default
pushing to /home/glew/hack/hg-granularity/hg-repo
searching for changes
adding changesets
adding manifests
adding file changes
added 3 changesets with 3 changes to 1 files
% hg glog
@  changeset:   6:089179dde80a
|  tag:         tip
|  user:        Andy Glew <glew@mips.com>
|  date:        Thu Jun 21 12:40:15 2012 -0700
|  summary:     2
|
o  changeset:   5:615416921e33
|  user:        Andy Glew <glew@mips.com>
|  date:        Thu Jun 21 12:40:14 2012 -0700
|  summary:     1.2
|
o  changeset:   4:a43a88065141
|  user:        Andy Glew <glew@mips.com>
|  date:        Thu Jun 21 12:40:14 2012 -0700
|  summary:     1.1
|
o  changeset:   3:fef4050e0162
|  user:        Andy Glew <glew@mips.com>
|  date:        Thu Jun 21 12:40:12 2012 -0700
|  summary:     1
|
o  changeset:   2:b51fbedc72e5
|  user:        Andy Glew <glew@mips.com>
|  date:        Thu Jun 21 12:40:12 2012 -0700
|  summary:     0.2
|
o  changeset:   1:45b7f64b2a23
|  user:        Andy Glew <glew@mips.com>
|  date:        Thu Jun 21 12:40:12 2012 -0700
|  summary:     0.1
|
o  changeset:   0:c80bc10826be
   user:        Andy Glew <glew@mips.com>
   date:        Thu Jun 21 12:40:11 2012 -0700
   summary:     0


% cd ../coarse
% cp ../fine/a .
% cat a
2
% hg ci -m2
% hg glog
@  changeset:   2:2a02e67e7b5d
|  tag:         tip
|  user:        Andy Glew <glew@mips.com>
|  date:        Thu Jun 21 12:40:15 2012 -0700
|  summary:     2
|
o  changeset:   1:93cbae111269
|  user:        Andy Glew <glew@mips.com>
|  date:        Thu Jun 21 12:40:13 2012 -0700
|  summary:     1
|
o  changeset:   0:c80bc10826be
   user:        Andy Glew <glew@mips.com>
   date:        Thu Jun 21 12:40:11 2012 -0700
   summary:     0
好的,所以现在我在精美的回购中有一个很好的粮食历史, 和粗回收中的粗粒历史。我想合并它们。 (Firget认为粗糙是罚款的一个子集:我可以很容易地设计它们不在的地方)。

简单地推动粗粮历史会发出警告。 我稍后会加油, 但首先我会尝试合并一个单独的克隆。

% hg push default
pushing to /home/glew/hack/hg-granularity/hg-repo
searching for changes
abort: push creates new remote head 2a02e67e7b5d!
(you should pull and merge or use push -f to force)

% cd ..

% hg clone coarse merge-fine-and-coarse
updating to branch default
1 files updated, 0 files merged, 0 files removed, 0 files unresolved
% cd merge-fine-and-coarse/
./merge-fine-and-coarse/


% hg glog
@  changeset:   2:2a02e67e7b5d
|  tag:         tip
|  user:        Andy Glew <glew@mips.com>
|  date:        Thu Jun 21 12:40:15 2012 -0700
|  summary:     2
|
o  changeset:   1:93cbae111269
|  user:        Andy Glew <glew@mips.com>
|  date:        Thu Jun 21 12:40:13 2012 -0700
|  summary:     1
|
o  changeset:   0:c80bc10826be
   user:        Andy Glew <glew@mips.com>
   date:        Thu Jun 21 12:40:11 2012 -0700
   summary:     0



% hg pull ../hg-repo
pulling from ../hg-repo
searching for changes
adding changesets
adding manifests
adding file changes
added 6 changesets with 6 changes to 1 files (+1 heads)
(run 'hg heads' to see heads, 'hg merge' to merge)


% hg heads
changeset:   8:089179dde80a
tag:         tip
user:        Andy Glew <glew@mips.com>
date:        Thu Jun 21 12:40:15 2012 -0700
summary:     2

changeset:   2:2a02e67e7b5d
user:        Andy Glew <glew@mips.com>
date:        Thu Jun 21 12:40:15 2012 -0700
summary:     2

这是合并。

注意对     o变更集:8:089179dde80a     | @ changeset:2:2a02e67e7b5d 和     o变更集:5:fef4050e0162     | o变更集:1:93cbae111269 具有相同的文件内容, 一个来自coartse,另一个来自精美的回购。 但Mercurial历史图表并未反映出这一点。

% hg glog
o  changeset:   8:089179dde80a
|  tag:         tip
|  user:        Andy Glew <glew@mips.com>
|  date:        Thu Jun 21 12:40:15 2012 -0700
|  summary:     2
|
o  changeset:   7:615416921e33
|  user:        Andy Glew <glew@mips.com>
|  date:        Thu Jun 21 12:40:14 2012 -0700
|  summary:     1.2
|
o  changeset:   6:a43a88065141
|  user:        Andy Glew <glew@mips.com>
|  date:        Thu Jun 21 12:40:14 2012 -0700
|  summary:     1.1
|
o  changeset:   5:fef4050e0162
|  user:        Andy Glew <glew@mips.com>
|  date:        Thu Jun 21 12:40:12 2012 -0700
|  summary:     1
|
o  changeset:   4:b51fbedc72e5
|  user:        Andy Glew <glew@mips.com>
|  date:        Thu Jun 21 12:40:12 2012 -0700
|  summary:     0.2
|
o  changeset:   3:45b7f64b2a23
|  parent:      0:c80bc10826be
|  user:        Andy Glew <glew@mips.com>
|  date:        Thu Jun 21 12:40:12 2012 -0700
|  summary:     0.1
|
| @  changeset:   2:2a02e67e7b5d
| |  user:        Andy Glew <glew@mips.com>
| |  date:        Thu Jun 21 12:40:15 2012 -0700
| |  summary:     2
| |
| o  changeset:   1:93cbae111269
|/   user:        Andy Glew <glew@mips.com>
|    date:        Thu Jun 21 12:40:13 2012 -0700
|    summary:     1
|
o  changeset:   0:c80bc10826be
   user:        Andy Glew <glew@mips.com>
   date:        Thu Jun 21 12:40:11 2012 -0700
   summary:     0


% hg diff -r 2a02e67e7b5d -r 089179dde80a

所以我会尝试合并

% hg merge -r 8
1 files updated, 0 files merged, 0 files removed, 0 files unresolved
(branch merge, don't forget to commit)


% hg ci -m'merge of fine and coarse at 2'

更好 - 这说明了     o变更集:8:089179dde80a     | @ changeset:2:2a02e67e7b5d 是一个汇合点, 虽然需要额外的虚拟改变。

但它并没有显示出它们之间的共性     o变更集:5:fef4050e0162     | o变更集:1:93cbae111269

这是合并图

% hg glog
@    changeset:   9:328db8187d31
|\   tag:         tip
| |  parent:      2:2a02e67e7b5d
| |  parent:      8:089179dde80a
| |  user:        Andy Glew <glew@mips.com>
| |  date:        Thu Jun 21 12:43:51 2012 -0700
| |  summary:     merge of fine and coarse at 2
| |
| o  changeset:   8:089179dde80a
| |  user:        Andy Glew <glew@mips.com>
| |  date:        Thu Jun 21 12:40:15 2012 -0700
| |  summary:     2
| |
| o  changeset:   7:615416921e33
| |  user:        Andy Glew <glew@mips.com>
| |  date:        Thu Jun 21 12:40:14 2012 -0700
| |  summary:     1.2
| |
| o  changeset:   6:a43a88065141
| |  user:        Andy Glew <glew@mips.com>
| |  date:        Thu Jun 21 12:40:14 2012 -0700
| |  summary:     1.1
| |
| o  changeset:   5:fef4050e0162
| |  user:        Andy Glew <glew@mips.com>
| |  date:        Thu Jun 21 12:40:12 2012 -0700
| |  summary:     1
| |
| o  changeset:   4:b51fbedc72e5
| |  user:        Andy Glew <glew@mips.com>
| |  date:        Thu Jun 21 12:40:12 2012 -0700
| |  summary:     0.2
| |
| o  changeset:   3:45b7f64b2a23
| |  parent:      0:c80bc10826be
| |  user:        Andy Glew <glew@mips.com>
| |  date:        Thu Jun 21 12:40:12 2012 -0700
| |  summary:     0.1
| |
o |  changeset:   2:2a02e67e7b5d
| |  user:        Andy Glew <glew@mips.com>
| |  date:        Thu Jun 21 12:40:15 2012 -0700
| |  summary:     2
| |
o |  changeset:   1:93cbae111269
|/   user:        Andy Glew <glew@mips.com>
|    date:        Thu Jun 21 12:40:13 2012 -0700
|    summary:     1
|
o  changeset:   0:c80bc10826be
   user:        Andy Glew <glew@mips.com>
   date:        Thu Jun 21 12:40:11 2012 -0700
   summary:     0

另一次合并怎么样?

% hg update -r 1
1 files updated, 0 files merged, 0 files removed, 0 files unresolved


% hg merge -r 5
1 files updated, 0 files merged, 0 files removed, 0 files unresolved
(branch merge, don't forget to commit)


% hg ci -m'merge of fine and coarse at 1'
created new head


% hg glog
@    changeset:   10:cca7fec90d3f
|\   tag:         tip
| |  parent:      1:93cbae111269
| |  parent:      5:fef4050e0162
| |  user:        Andy Glew <glew@mips.com>
| |  date:        Thu Jun 21 12:45:03 2012 -0700
| |  summary:     merge of fine and coarse at 1
| |
| | o    changeset:   9:328db8187d31
| | |\   parent:      2:2a02e67e7b5d
| | | |  parent:      8:089179dde80a
| | | |  user:        Andy Glew <glew@mips.com>
| | | |  date:        Thu Jun 21 12:43:51 2012 -0700
| | | |  summary:     merge of fine and coarse at 2
| | | |
| | | o  changeset:   8:089179dde80a
| | | |  user:        Andy Glew <glew@mips.com>
| | | |  date:        Thu Jun 21 12:40:15 2012 -0700
| | | |  summary:     2
| | | |
| | | o  changeset:   7:615416921e33
| | | |  user:        Andy Glew <glew@mips.com>
| | | |  date:        Thu Jun 21 12:40:14 2012 -0700
| | | |  summary:     1.2
| | | |
| +---o  changeset:   6:a43a88065141
| | |    user:        Andy Glew <glew@mips.com>
| | |    date:        Thu Jun 21 12:40:14 2012 -0700
| | |    summary:     1.1
| | |
| o |  changeset:   5:fef4050e0162
| | |  user:        Andy Glew <glew@mips.com>
| | |  date:        Thu Jun 21 12:40:12 2012 -0700
| | |  summary:     1
| | |
| o |  changeset:   4:b51fbedc72e5
| | |  user:        Andy Glew <glew@mips.com>
| | |  date:        Thu Jun 21 12:40:12 2012 -0700
| | |  summary:     0.2
| | |
| o |  changeset:   3:45b7f64b2a23
| | |  parent:      0:c80bc10826be
| | |  user:        Andy Glew <glew@mips.com>
| | |  date:        Thu Jun 21 12:40:12 2012 -0700
| | |  summary:     0.1
| | |
+---o  changeset:   2:2a02e67e7b5d
| |    user:        Andy Glew <glew@mips.com>
| |    date:        Thu Jun 21 12:40:15 2012 -0700
| |    summary:     2
| |
o |  changeset:   1:93cbae111269
|/   user:        Andy Glew <glew@mips.com>
|    date:        Thu Jun 21 12:40:13 2012 -0700
|    summary:     1
|
o  changeset:   0:c80bc10826be
   user:        Andy Glew <glew@mips.com>
   date:        Thu Jun 21 12:40:11 2012 -0700
   summary:     0

这是不对的。它建立了一个新的头,而 我们想要的是一些表明这一点的方式     o变更集:5:fef4050e0162     | o变更集:1:93cbae111269 是一样的。

好的,切换回原来的粗糙

% cd ../coarse


% hg push default
pushing to /home/glew/hack/hg-granularity/hg-repo
searching for changes
abort: push creates new remote head 2a02e67e7b5d!
(you should pull and merge or use push -f to force)


% hg push -f default
pushing to /home/glew/hack/hg-granularity/hg-repo
searching for changes
adding changesets
adding manifests
adding file changes
added 2 changesets with 2 changes to 1 files (+1 heads)


% hg glog
@  changeset:   2:2a02e67e7b5d
|  tag:         tip
|  user:        Andy Glew <glew@mips.com>
|  date:        Thu Jun 21 12:40:15 2012 -0700
|  summary:     2
|
o  changeset:   1:93cbae111269
|  user:        Andy Glew <glew@mips.com>
|  date:        Thu Jun 21 12:40:13 2012 -0700
|  summary:     1
|
o  changeset:   0:c80bc10826be
   user:        Andy Glew <glew@mips.com>
   date:        Thu Jun 21 12:40:11 2012 -0700
   summary:     0



% cd ../hg-repo/


% hg glog
o  changeset:   8:2a02e67e7b5d
|  tag:         tip
|  user:        Andy Glew <glew@mips.com>
|  date:        Thu Jun 21 12:40:15 2012 -0700
|  summary:     2
|
o  changeset:   7:93cbae111269
|  parent:      0:c80bc10826be
|  user:        Andy Glew <glew@mips.com>
|  date:        Thu Jun 21 12:40:13 2012 -0700
|  summary:     1
|
| o  changeset:   6:089179dde80a
| |  user:        Andy Glew <glew@mips.com>
| |  date:        Thu Jun 21 12:40:15 2012 -0700
| |  summary:     2
| |
| o  changeset:   5:615416921e33
| |  user:        Andy Glew <glew@mips.com>
| |  date:        Thu Jun 21 12:40:14 2012 -0700
| |  summary:     1.2
| |
| o  changeset:   4:a43a88065141
| |  user:        Andy Glew <glew@mips.com>
| |  date:        Thu Jun 21 12:40:14 2012 -0700
| |  summary:     1.1
| |
| o  changeset:   3:fef4050e0162
| |  user:        Andy Glew <glew@mips.com>
| |  date:        Thu Jun 21 12:40:12 2012 -0700
| |  summary:     1
| |
| o  changeset:   2:b51fbedc72e5
| |  user:        Andy Glew <glew@mips.com>
| |  date:        Thu Jun 21 12:40:12 2012 -0700
| |  summary:     0.2
| |
| o  changeset:   1:45b7f64b2a23
|/   user:        Andy Glew <glew@mips.com>
|    date:        Thu Jun 21 12:40:12 2012 -0700
|    summary:     0.1
|
@  changeset:   0:c80bc10826be
   user:        Andy Glew <glew@mips.com>
   date:        Thu Jun 21 12:40:11 2012 -0700
   summary:     0



% echo This is not right
This is not right

我想要的是一个可以识别文件内容相同的合并, 或者可以认识到两行历史相似,尽管并非所有版本都在一行中 在另一个, 并给出类似的东西:

o=o changesets with same file contents on different historical lines
o |  (line1) 
| |  changeset:   2:2a02e67e7b5d
| |  user:        Andy Glew <glew@mips.com>
| |  date:        Thu Jun 21 12:40:15 2012 -0700
| |  summary:     2
| o  (line2)
| |  changeset:   8:089179dde80a
| |  user:        Andy Glew <glew@mips.com>
| |  date:        Thu Jun 21 12:40:15 2012 -0700
| |  summary:     2
| |
| o  changeset:   7:615416921e33
| |  user:        Andy Glew <glew@mips.com>
| |  date:        Thu Jun 21 12:40:14 2012 -0700
| |  summary:     1.2
| |
| o  changeset:   6:a43a88065141
| |  user:        Andy Glew <glew@mips.com>
| |  date:        Thu Jun 21 12:40:14 2012 -0700
| |  summary:     1.1
| |
| |
o=o changesets with same file contents on different historical lines
o |  (line1) 
| |  changeset:   1:93cbae111269
| |  user:        Andy Glew <glew@mips.com>
| |  date:        Thu Jun 21 12:40:13 2012 -0700
| |  summary:     1
| o  (line2) 
| |  changeset:   5:fef4050e0162
| |  user:        Andy Glew <glew@mips.com>
| |  date:        Thu Jun 21 12:40:12 2012 -0700
| |  summary:     1
| |
| o  changeset:   4:b51fbedc72e5
| |  user:        Andy Glew <glew@mips.com>
| |  date:        Thu Jun 21 12:40:12 2012 -0700
| |  summary:     0.2
| |
| o  changeset:   3:45b7f64b2a23
| |  parent:      0:c80bc10826be
| |  user:        Andy Glew <glew@mips.com>
| |  date:        Thu Jun 21 12:40:12 2012 -0700
| |  summary:     0.1
| |
| |
|/
|
o  changeset:   0:c80bc10826be
   user:        Andy Glew <glew@mips.com>
   date:        Thu Jun 21 12:40:11 2012 -0700
   summary:     0

我可以想象在o = o点可能需要合并变更集。

但我希望自动识别它。

哎呀,忘了“认出来”。我希望有一种方法可以手动识别它,但是它用Mercurial表示。

1 个答案:

答案 0 :(得分:1)

我不认为Mercurial可以获得您正在寻找的设计模式。 Mercurial跟踪从父变更集到子变更集的差异,因此它并不真正关心整个文件的内容。即使您在树A上的修订版2中的文件和在树B上的修订版5中的文件具有相同的内容,它们也来自不同的父项,因此具有不同的方式来存储它们的更改方式。我没有太多关注mq扩展,但这是我能想到的唯一可以编辑树的历史足以做你想做的事情。编辑树的历史总是一件危险的事情,很少推荐。

编辑: 我对这一点也不太确定,但rebase扩展也可能适合你。