Mercurial:“撤消”两次或多次提交

时间:2012-04-14 19:57:52

标签: mercurial rollback

How do I do a pristine checkout with mercurial? Martin Geisler讨论如何使用以下方法删除已经存在的Mercurial提交文件:

hg strip "outgoing()"

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

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

用户a:

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的添加/提交/推送?< / p>

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

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

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

其他方法吗?

2 个答案:

答案 0 :(得分:2)

你可以通过这样做,你正在努力反对像mercurial这样的DVCS的一个最大特性,就是在你的情况下轻松可靠地处理多行开发的合并。如果用户b的目标是在应用所有三个更改的情况下进行开发,那么在hg中执行该操作的标准方法就是继续执行hg pull -u,这将创建一个新头包含来自用户a的更改(以及推送到用于提取的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会告诉你是否是这种情况。

答案 1 :(得分:1)

另一个选项是rebase扩展名。根据您的方案:

  1. A和B以相同的历史开头。
  2. 提交并推动更改。
  3. B提交两个更改,但由于A的提交而无法推送。
  4. B拉A的变化。
  5. B运行hg rebase并推送。
  6. 在rebase之前:

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

    后:

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