git:使用父分支重置以前的提交

时间:2017-06-19 17:07:11

标签: git

假设我在我的存储库中有一个parent分支,我从中创建另一个名为derived的分支。

git checkout -b derived

现在derived分支包含parent分支的所有提交。我向我的derived分支添加了两个提交(提交D1和D2)。我的derived分支是parent分支之前的两个提交。

现在我修改父分支中的一些先前提交并添加新提交" Pn"。在此之后,由于某种原因,我希望我的派生分支看起来像这样

Amended commits from parent branch ---> Pn ---> D1 ----> D2

我在我的git rebase parent分支中尝试了derived,但它产生了很多合并冲突。有没有更简单的方法可以将D1和D2之前的所有提交重置为parent分支。

3 个答案:

答案 0 :(得分:1)

想要使用git rebase,你只希望它停止在你曾经与其他分支共享提交的位置。

也就是说,你有:

...--Pl--Pm--Pn   <-- parent
               \
                D1--D2  <-- derived

由于修改和git rebase通过复制工作提交,您现在拥有的是:

          Pn'--Po--Pp   <-- parent
         /
---Pl--Pm--Pn   <-- parent@{some-number}
             \
              D1--D2   <-- derived

parent 用于的内存包含原始提交Pn的内容位于parent的reflog中(可能在{{1}的reflog中) })。

您可以手动使用以下内容指定HEAD应停在git rebase

Pn

(即,将git rebase --onto parent <hash-of-Pn> 的停止点指定为提交哈希,并使用<upstream>使副本在--onto的新提示之后。您还可以使用jpaugh's answer中的提交相对语法(parent)来标识derived~number。有关详细信息,请参阅the gitrevisions documentation

Git现在也有Pn。使用--fork-point,您可以通过--fork-point的reflog自动使用Git root来尝试找到parent。在这里你将运行:

Pn

告诉Git执行此操作,并将其重新绑定到git rebase --fork-point parent drop 提交parent

由于reflog条目到期(默认情况下为30或90天后),Pn何时以及是否正常工作有点棘手。

答案 1 :(得分:1)

不是这样的。提交D1和D2依赖于它们之前的每个提交,包括你不想要的提交。但是,您可以尝试以下方法:

  • git rebase --onto parent derived~3 derived

    Rebase派生到新父级。这会将合并基础显式设置为derived~3,即在创建派生分支时作为父级HEAD的提交。这将减少冲突,并将避免重新引入旧的更改。

    通常,git会自动计算出来,但是由于你修改了这些提交,git无法判断它们之间是否存在任何关系 - 它无法告诉提交A'是一个修改后的提交变体A

  • 樱桃挑选D1和D2到新的分支

    git branch derived-new parent
    git checkout derived-new
    git cherry-pick D1 D2
    git branch -m derived derived-old   # Save the old branch until you're ready to delete it
    git branch -m derived-new derived
    
  • 执行派生分支的交互式rebase,删除您不想要的早期提交,然后查看发生的情况。这也可能会产生很多额外的冲突,并迫使你git rebase --abort,但如果没有,你就是scott free ...再次重新绑定到新的父级,如上所述

    < / LI>

答案 2 :(得分:0)

您应该可以按照以下步骤操作:

  1. 查看您的parent分支机构
    • git checkout parent
  2. 根据parent分支创建并签出新分支
    • git checkout -b derived-modified
  3. 使用已git cherry-pick签出的derived-modified将新提交从derived移至derived-modified(这将使用修改后的父分支以及您已修改/添加的提交)
    • git cherry-pick 000aaaa
    • git cherry-pick 000bbbb
    • git cherry-pick 000cccc
  4. 例如,您需要对derived进行3次提交,然后将其移至derived-modified,其中包含已修改的parent分支。在您确认提交已在derived-modified后,您可以删除derived并重命名derived-modified

    有关git cherry-pick的更多信息,请here