1

如何使用 mercurial 进行原始结帐?Martin Geisler 讨论如何使用以下方法删除已提交的 Mercurial 文件:

hg strip "outgoing()"

但是,如果我想保留我添加到“ outgoing()”中的文件怎么办 - 例如:

两个用户 a 和 b——从同一个变更集开始

用户一:

echo "A" > A.txt; hg ci -M -m ""; hg push

用户 b(忘记运行hg pull -u):

echo "B" > B.txt; hg ci -M -m "" B.txt;
echo "C" > C.txt; hg ci -M -m "" C.txt;

如果用户 b 运行,hg strip "outgoing()"则 B.txt 和 C.txt 将丢失。hg rollback不是一个选项,因为有两个提交。

用户 b 可以将他的文件恢复为“本地添加 - 未跟踪”,然后执行hg pull -u获取 A.txt,然后处理 B.txt 和 C.txt 的添加/提交/推送吗?

Martin Geisler 在前面提到的线程中回答了这个问题(我删除并移到这里的评论:

hg update "p1(min(outgoing()))"
hg revert --all --rev tip 
hg strip "outgoing()"
hg pull -u

现在用户 c 可以在新文件 B.txt 和 C.txt 中完成他的工作并提交+推送这些文件。

其他方法可以做到这一点?

4

2 回答 2

2

您可以,但是这样做,您正在处理 DVCS 的最大功能之一,例如 mercurial,即像您的情况一样轻松可靠地处理多条开发线的合并。如果用户 b 的目标是应用所有三个更改的开发线,那么执行此操作的标准方法是hg继续执行并hg pull -u创建一个包含来自用户 a 的更改的新 head (以及推送到用于拉取的 repo 的任何其他更改),然后用于hg merge合并两个头,头包含用户 b 的两个变更集,另一个包含用户 a 的变更集(作为拉取的)。在这种没有重叠更改的简单情况下,默认情况下 hg 应该做所有正确的事情。

$ hg pull -u
[...]
added 1 changesets with 1 changes to 1 files (+1 heads)
not updating: crosses branches (merge branches or update --check to force update)
$ hg merge
1 files updated, 0 files merged, 0 files removed, 0 files unresolved
(branch merge, don't forget to commit)
$ hg ci -m "merge"

如果两个头之间存在冲突(即两个用户都提交了对相同文件的更改),则可能需要在合并过程中进行冲突解决编辑;hg 会告诉你是不是这样。

于 2012-04-14T20:26:09.463 回答
1

另一种选择是rebase扩展。根据您的情况:

  1. A 和 B 以相同的历史开始。
  2. A 提交并推送更改。
  3. B 提交了两个更改,但由于 A 的提交而无法推送。
  4. B 拉取 A 的零钱。
  5. B跑hg rebase和推。

变基之前:

Common ---------------------------- A (tip)
     \
      B1 - B2 (working parent)

后:

Common - A - B1 - B2 (tip, working parent)
于 2012-04-15T00:57:25.927 回答