Mercurial提交和合并

时间:2012-06-04 12:55:56

标签: mercurial mercurial-commit

对于Mercurial,我经常会看到一个场景,我需要逐步提交推送,但如果另一个人在这个中间提交,那么我就会遇到问题。

示例:假设HG repo有四个文件a.txt,b.txt,c.txt,d.txt,我们有两个用户Mickey和Goofy:

Mickey does:  $ echo "change1" >> a.txt
Mickey does:  $ echo "change2" >> b.txt
Mickey does:  $ echo "change3" >> c.txt
Mickey does:  $ hg commit -m "I am good" a.txt
Goofy does:   $ hg pull -u; echo "change4" >> d.txt; hg commit -m "The Donald change" 

Mickey准备提交并推送,但必须合并:     米奇做:$ hg pull -u

现在Mickey有两个变化 - 在b.txt和c.txt中。让我们假设他在c.txt中的变化很复杂,现在无法释放。如何才能在没有提交c.txt的情况下将my.txt和b.txt中的更改提交并推送?

2 个答案:

答案 0 :(得分:2)

只需发出您感兴趣的文件名:

hg commit a.txt b.txt -m'partial commit'

然后照常推。

编辑:我可以尝试将本地更改保存为补丁,还原并拉远程更改,然后应用补丁:

hg diff > local.patch
hg revert
hg pull -u
patch -p1 < local.patch

答案 1 :(得分:1)

我的问题并不完全清楚,如果我弄错了,请纠正我。

Mickey在他的回购中有什么(A - Mickey的变更集a已更改,D - Goofy的变更集d已更改,w - 米奇的工作副本bc已更改):

-- o --- A --- w
    \
     D

现在米奇有很多选择。 b已准备好发布,所以他立即提交:

$ hg ci b.txt -m "Finished working on b.txt"

-- o --- A --- B --- w
    \
     D

现在只有c更改留在工作副本中。米奇做了一个中间提交:

$ hg ci -m "working on c"

-- o --- A --- B --- C' --- w
    \
     D

工作副本很干净。为了确保合并中不包含C',Mickey会更新到上一个变更集,然后合并:

$ hg up B
$ hg merge D
$ hg ci -m "Merged with Goofy"

-- o --- A --- B --- C
    \           \
     D --------- M --- w

现在Mickey可以继续处理C,并在准备就绪时修改提交:

$ hg up C
$ echo "final change" >> c.txt
$ hg ci --amend -m "Finished working on c.txt"

从这里开始,Mickey可以合并,或者重组(顺便说一句,与Goofy合并也可以是一个rebase)。