【问题标题】:Mercurial: "undoing" two or more commitsMercurial:“撤消”两个或多个提交
【发布时间】:2012-04-14 19:57:52
【问题描述】:

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

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

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

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

还有其他方法吗?

【问题讨论】:

  • 用户 b 不能直接拉取和合并有什么原因吗?
  • @MartinGeisler - 传出文件的提交消息可以在被剥离之前保存吗?
  • 别介意 Martin,hg dedicated --stat 很好地概述了删除的内容

标签: mercurial rollback


【解决方案1】:

您可以,但是这样做,您正在处理像 mercurial 这样的 DVCS 的最大功能之一,即像您的情况一样轻松可靠地处理多条开发线的合并。如果用户 b 的目标是应用所有三个更改的开发线,那么在hg 中执行此操作的标准方法是继续执行hg pull -u,这将创建一个包含更改的新头部( s) 从用户 a(以及推送到用于拉取的仓库的任何其他更改),然后使用 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 会告诉你。

【讨论】:

  • 也是一个很好的评论。我在这个问题上看到的唯一问题是,如果问题是 B 很久以前提交了他的提交(但忘记推送),则合并图看起来非常难看。因为“hg rebase”是一个不错的选择
  • 在现实世界的大型项目中,尝试优化 repo 图并不是一个现实的目标。如果您确实想跟踪分支历史,请使用 Mercurial 的命名分支功能。与其他一些 DVCS(如 git)不同,每个 hg 提交都属于一个且仅一个命名分支,并且每次提交都会记录该分支。
【解决方案2】:

另一个选项是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)

【讨论】:

  • 这是一个很好的选择,至少如果你想保持 B1 和 B2 作为提交
  • 请注意,“hg rebase”要求所有本地更改的文件都需要通过“hg commit”发送。
猜你喜欢
  • 1970-01-01
  • 2015-05-11
  • 1970-01-01
  • 2021-08-14
  • 1970-01-01
  • 2012-12-14
  • 2013-01-26
  • 1970-01-01
  • 2017-09-03
相关资源
最近更新 更多