2017-06-19 106 views
0

假设我在我的存储库中有一个parent分支,并且我从中创建了另一个名为derived的分支。git:重置之前提交的父分支

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分支一样。

回答

1

不一样。提交D1和D2依赖于他们面前的每一次提交,包括你不想要的提交。但是,这里有事情,你可以尝试:导出到新的父

  • git rebase --onto parent derived~3 derived

    再次基于。这会将合并基数显式设置为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 
    
  • 做衍生分支的互动底垫中,删除您不想早提交,然后看看会发生什么。这也可能会产生很多额外的冲突,并迫使你git rebase --abort,但如果它不,你是斯科特免费...只是重新基础上新的父母,如上

0

你应该能够遵循以下步骤:

  1. 查看您所在parent分支
    • git checkout parent
  2. 创建并检查了新的分支基于关闭parent分支
    • git checkout -b derived-modified
  3. 使用git cherry-pickderived-modified签出从derived移动新提交到derived-modified(这将使用你修改了提交修改后的父分支/加)
    • git cherry-pick 000aaaa
    • git cherry-pick 000bbbb
    • git cherry-pick 000cccc

这需要,例如,您对derived进行的3次提交并将它们移动到derived-modified,其中包含修改的parent分支。验证完提交后,您可以删除derived并将其重命名为derived-modified

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

1

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

也就是说,你有:

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

因为这两个修订,并通过复制git rebase工作承诺,你现在所拥有的是:

  Pn'--Po--Pp <-- parent 
     /
---Pl--Pm--Pn <-- [email protected]{some-number} 
      \ 
       D1--D2 <-- derived 

在内存parent用于包含原始提交Pnparent的reflog中(可能在的reflog中)。

可以手动指定git rebase应使用在Pn停止:

git rebase --onto parent <hash-of-Pn> 

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

Git现在也有--fork-point。使用--fork-point,你可以让Git 自动根遍历parent的reflog来试图找到Pn。在这里,你可以运行:

git rebase --fork-point parent 

告诉Git的做到这一点生根-左右,而重订到parent下降提交Pn

由于reflog条目过期(默认情况下为30天或90天),究竟何时和是否--fork-point的工作有点棘手。