如何创建一个镜像另一个(发散)分支状态的提交?

Mar*_*ois 2 git branch commit

我想进行提交并将其复制到我的存储库中的其他位置.

现在的情况:

A--B--C--D (branch1)
    \
     E--F (branch2)
Run Code Online (Sandbox Code Playgroud)

期望的情况:

A--B--C--D--F'(branch1)
    \
     E--F (branch2)
Run Code Online (Sandbox Code Playgroud)

F保留在存储库中非常重要.我不想重写历史,因为F可能是公开的.

表示F和F'的存储库(源代码)的状态应该完全相同.是的,引入的C和D可能会丢失.

希望重播E和F在D的顶部我已经调查cherry-pickrebase,但似乎他们删除原提交或干脆重播目标的顶部的变化.

tor*_*rek 5

这一点是一个关键项目,我在第一次评论时错过了:

由[F]和F'表示的存储库(源代码)的状态应该完全相同.是的,引入的C和D可能会丢失.

在这种情况下,从git checkout branch2你开始,你可以使用斯蒂芬纽厄尔的答案,但有一个更简单,而且更简单:

$ git rm -r .
$ git checkout <hash-of-F> -- .
$ git commit
Run Code Online (Sandbox Code Playgroud)

它的工作原理是从索引中删除所有内容(并从工作树中删除),以确保没有保留早期提交的杂散文件,然后从提交F到索引和工作树中提取所有内容,准备提交.

您可以使用以下步骤缩短这一步:

$ git read-tree -m -u <hash-of-F>
$ git commit
Run Code Online (Sandbox Code Playgroud)

因为这git read-tree相当于删除和替换.

您可以使用名称branch1而不是提交的哈希,F直到branch1它自己移动并且不再指向提交F.