Mercurial:任何"合并和放弃变更"的方法?

Geo*_*uer 21 mercurial

我有一个图形日志,看起来像这样:

(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
Run Code Online (Sandbox Code Playgroud)

在(8),除了(4)处悬空的额外头部之外,一切都是应该的.为了摆脱它,我必须合并(4)-.->(8)但是,由于(4)中没有我需要的东西,我可以安全地丢弃它的所有变化.我可以手动逐个文件地进行合并(通常这不是什么大不了的事)但是对于我自己的启发 - 有一个简单的单行方式来说"merge(4)with(8)and always拿(8)"?

Ida*_*n K 35

是.该internal:local内置合并工具.

$ hg merge 4 --tool internal:local
Run Code Online (Sandbox Code Playgroud)

类似地internal:other,选择其他版本的文件作为合并版本.

这是一个澄清正在发生的事情的例子,从一个带有单个文件的仓库开始:

$ echo a >> a
$ hg ci -Am.
adding a
$ echo a >> a
$ hg ci -Am.
Run Code Online (Sandbox Code Playgroud)

分支并发生冲突a:

$ hg up 0
1 files updated, 0 files merged, 0 files removed, 0 files unresolved
$ echo b >> a
Run Code Online (Sandbox Code Playgroud)

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

$ echo b >> b
$ hg ci -Am.
adding b
created new head
Run Code Online (Sandbox Code Playgroud)

回去合并匿名负责人:

$ 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)
Run Code Online (Sandbox Code Playgroud)

当然,在没有合并工具的情况下,我们会发生冲突a.但是使用合并工具,我们告诉Mercurial在与cset合并的每个文件上都采用第一个父版本的版本.

$ hg st
M a
M b
$ cat a
a
a
$ cat b
b
Run Code Online (Sandbox Code Playgroud)

  • 此方法将丢弃不需要的分支的更改,但不会从中丢弃新文件.我认为正确的答案是这里接受的答案:http://stackoverflow.com/questions/4197744/how-to-merge-to-get-rid-of-head-with-mercurial-command-line-like-i - 可以-DO-与 (10认同)
  • +1为一个非常详细的答案.我意识到这是一个老问题,但这导致只有合并冲突被解析为"本地"...来自"b"的任何新文件仍然在合并的变更集中创建.有没有办法没有那些?或者他们应该手动删除(`hg忘记...`)? (2认同)
  • 使用`--tool internal:local`对我来说不起作用,它保留了所有不好的变化.TortoiseHg使用`debugsetparents`确实有效. (2认同)