在主分支的基础分支重新建立基础后,如何重新建立分支的基础

kaj*_*acx 8 git branch rebase branching-and-merging

我有一个分支A,我在其中做了一些更改a,然后我创建了一个新分支BA继续进行一些更改b,因此总更改Ba, 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)

问题

我如何变基BA,以便仅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被注册为冲突。为了说明这一点,我们假设我:

  1. l1在 中添加了新行a
  2. 将该行更改为l2in b
  3. 此行在其他提交中未受影响c
  4. 现在它是一个冲突,因为l1被添加到 中a',但是l2被添加到取消的提交中a'&b

Elp*_*Kay 5

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