对于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中的更改提交并推送?
答案 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
- 米奇的工作副本b
和c
已更改):
-- 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)。