Mercurial:有什么办法可以"merge and discard changes"吗?



我有一个看起来像这样的graphlog:

(snip)
  | |
  | o    1) Other Dev: Commit
  | | 
  o | |  2) Me: Commit
/ | | |
| | o |  3) Other Dev: Commits with an error
| |/| |
| o |/   4) Me: Merge and commit
|  /|    
|/  |
o   |    5) Me: Realize there were bugs in the commit and take earlier version to merge with
|   o    6) Other Dev: Fixes error
o /      7) Me: committing some changes
|/
o        8) Me: Merge fixed tip

在(8)处,除了(4)处悬挂的额外头部外,一切都是应该的。为了摆脱它,我必须合并(4)-。->(8)但是,由于(4)中没有我需要的东西,我可以安全地丢弃它的所有更改。我可以逐个文件手动合并(通常这不是什么大问题),但对于我自己的启发-是否有一个简单的一行方式来说"合并(4)与(8)并且总是取(8)"?

是。internal:local内置合并工具。

$ hg merge 4 --tool internal:local

同样,internal:other会选择其他版本的文件作为合并版本。

这里有一个例子来说明发生了什么,从一个文件的repo开始:

$ echo a >> a
$ hg ci -Am.
adding a
$ echo a >> a
$ hg ci -Am.

分支它并在a中放置冲突:

$ hg up 0
1 files updated, 0 files merged, 0 files removed, 0 files unresolved
$ echo b >> a

还在合并的in分支中添加另一个文件:

$ echo b >> b
$ hg ci -Am.
adding b
created new head

返回并合并匿名头:

$ hg up 1
1 files updated, 0 files merged, 1 files removed, 0 files unresolved
$ hg merge 2 --tool internal:local
1 files updated, 1 files merged, 0 files removed, 0 files unresolved
(branch merge, don't forget to commit)
在这一点上,如果没有合并工具,我们自然会在a上遇到冲突。但是使用合并工具,我们告诉Mercurial在与cset合并的每个文件上都取第一个父文件的版本。
$ hg st
M a
M b
$ cat a
a
a
$ cat b
b

最新更新