kaj*_*acx 8 git branch rebase branching-and-merging
我有一个分支A,我在其中做了一些更改a,然后我创建了一个新分支B来A继续进行一些更改b,因此总更改B为a, b。最后,其他人将他们的更改合并c到 master 中,所以工作树现在看起来像这样:
- c (master)
\
- a (A) - b (B)
Run Code Online (Sandbox Code Playgroud)
然后我重新调整A为 master ,将更改从atoa'更改并强制将它们推送到分支A,因此工作树如下所示:
- c (master) - a' (A)
\
- a - b (B)
Run Code Online (Sandbox Code Playgroud)
问题
我如何变基B为A,以便仅b更改新的更改,工作树如下所示:
- c (master) - a' (A) - b' (B)
Run Code Online (Sandbox Code Playgroud)
如果我git rebase origin/A在 on 时尝试B,那么它会尝试解决a针对 的提交c, a',这是我不想要的,因为我担心它会创建一个新的提交a'',然后工作树将如下所示:
- c (master) - a' (A) - a'' - b' (B)
Run Code Online (Sandbox Code Playgroud)
现在有没有办法只进行 rebase 更改b?(我让 OFC 尝试用谷歌搜索这个,但我没有找到任何专门涉及这个案例的内容)
编辑:
我尝试挤压a'和bon B,但这更糟糕,因为现在所有的更改都b被注册为冲突。为了说明这一点,我们假设我:
l1在 中添加了新行a。l2in b。c。l1被添加到 中a',但是l2被添加到取消的提交中a'&b。git rebase --onto A a B
Run Code Online (Sandbox Code Playgroud)
--onto A用作A新的基地。a B获取类似于 的提交集git log a..B,在您的情况下仅包括b. 这组提交将应用到新的基础上。
您始终可以用来interactive rebase处理简单或复杂的情况。
git rebase -i A
Run Code Online (Sandbox Code Playgroud)
在编辑页面,修改 行的行距,pick或者干脆删除整行。保存并退出。dropa
如果git rebase不起作用,你也可以尝试git cherry-pick只应用你想要的提交,然后重置B到新的头。
git checkout -b tmp A
git cherry-pick b
git checkout B
git branch B_bak
git reset tmp --hard
git branch -D tmp
Run Code Online (Sandbox Code Playgroud)
如果出现任何问题,您可以运行git checkout B && git reset B_bak --hard来恢复B。