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 ,将更改从a
toa'
更改并强制将它们推送到分支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'
和b
on B
,但这更糟糕,因为现在所有的更改都b
被注册为冲突。为了说明这一点,我们假设我:
l1
在 中添加了新行a
。l2
in 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
或者干脆删除整行。保存并退出。drop
a
如果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
。