假设我在我的存储库中有一个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
分支。
答案 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 ...再次重新绑定到新的父级,如上所述
答案 2 :(得分:0)
您应该可以按照以下步骤操作:
parent
分支机构
git checkout parent
parent
分支创建并签出新分支
git checkout -b derived-modified
git cherry-pick
签出的derived-modified
将新提交从derived
移至derived-modified
(这将使用修改后的父分支以及您已修改/添加的提交)
git cherry-pick 000aaaa
git cherry-pick 000bbbb
git cherry-pick 000cccc
例如,您需要对derived
进行3次提交,然后将其移至derived-modified
,其中包含已修改的parent
分支。在您确认提交已在derived-modified
后,您可以删除derived
并重命名derived-modified
。
有关git cherry-pick
的更多信息,请here。