Mercurial 或 Bitbucket - 将一组提交推送到一个单独的 fork

Mercurial or Bitbucket - push set of commits to a separate fork

假设存储库 A 有一些历史

 commit4
    ^
 commit3
    ^
 commit2
    ^
 commit1
    ^
 commit0

如果我现在想 "split" commit2 的存储库 A,即我希望存储库 B 是 A 的一个分支,其中

A 的历史:

 commit2
    ^
 commit1
    ^
 commit0

B的历史:

 commit4
    ^
 commit3
    ^
 commit2
    ^
 commit1
    ^
 commit0

我如何最好地使用 bitbucket 或 Mercurial Workbench?

使用 TortoiseHg Workbench 您可以执行以下操作:

  1. Repository Registry 中右键单击 Workbench 中的 A,然后单击 Clone
  2. 将目标设置为 B 并单击 克隆
  3. 双击 Repository Registry 中的 A 以查看它的提交。
  4. 右键单击 commit3,select 修改历史记录 然后 select 删除。这将删除 commit3 之后的每个提交,包括 commit3.
  5. 您现在拥有具有所需结构的存储库 A 和 B。

使用 BitBucket 您可以执行以下操作:

  1. 转到 A 的 Overview 页面,然后单击左侧菜单中的 Fork 创建一个名为 B 的 A 分支。
    A 和 B 现在都将拥有与 A 相同的完整提交集。
  2. 再次返回 A 的概览,然后单击左侧菜单底部的设置
  3. 设置菜单中点击剥离变更集
  4. 在框中输入 commit3 然后点击 Preview Strip.
  5. 这将向您显示将被删除的提交,仔细检查它是否显示预期的提交,在本例中为 commit3commit4.
  6. 单击确认删除 删除提交。

这些策略需要注意的问题是:

  1. 确保您在某处对 A 进行了完整备份,因为剥离操作具有破坏性。
  2. 如果存在 A 的现有克隆,并且其中一个被推送到 BitBucket 上的 A,那么剥离的更改将被再次推送。您需要确保所有克隆也都进行了剥离,或者制作了新的克隆。
  3. 如果您从 B 推送到 A,那么剥离的更改可能会被推回,因为它们都来自同一个根。