2

使用 Mercurial,我经常看到需要逐步提交推送的情况,但如果另一个人在此过程中提交,那么我就会遇到问题。

示例:假设 HG 存储库有四个文件 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 准备好提交和推送,但必须合并:Mickey 会:$ hg pull -u

现在 Mickey 有两个变化 - 在 b.txt 和 c.txt 中。让我们假设他在 c.txt 中的更改很复杂,现在不能发布。米奇如何在不提交 c.txt 的情况下提交并推送他在 a.txt 和 b.txt 中的更改?

4

2 回答 2

2

只需发出您有兴趣提交的文件名:

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

然后像往常一样推。

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

hg diff > local.patch
hg revert
hg pull -u
patch -p1 < local.patch
于 2012-06-04T12:59:26.003 回答
1

您的问题对我来说并不完全清楚,如果我错了,请纠正我。

Mickey 在他的 repo 中是这样的(A- Mickey 的变更集已a更改,D- Goofy 的变更集已d更改, - Mickey的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 合并也可以是变基)。

于 2012-06-04T22:04:38.043 回答