我有一个 Git 存储库,其中有一个主分支 A 和一个旧的维护分支 B:
A0 -> A1 -> A2 -> A3 -> ... -> An (main branch A)
\
\-> B1 -> B2 -> B3 -> ... -> Bm (branch B)
主分支与分支 B 有很大分歧,而分支 B 则从 A 中挑选了一些更改,并获得了分支 A 中缺少的功能。
我想变基到分支 A 之上的分支 B,但是 git rebase 只是将提交 B1..m 重新应用到分支 A 的头部,这导致了许多无法解决的冲突。
有没有办法在分支 A 上重新建立分支 B,但逐渐从 A1 提交到 An,并在每一步都解决冲突?这相当于执行:
git checkout B
git rebase A1
git rebase A2
...
git rebase An
是的,您可以通过多种选项来做到这一点。
只需使用
git rebase -i A B
变基状态以交互模式启动,您可以更改提交顺序(只需向上或向下移动行)。您还可以将 pick
更改为 edit
,并且您的变基将针对每个 edit
逐步进行。
当发生冲突时,变基将会中断。这个状态调用
interrupted rebase
,你可以通过git status
来查找哪里有冲突。
尝试解决冲突、保存文件并将更改附加到索引阶段 - git add <filename>
。
当冲突得到解决时,只需 git rebase --continue
即可在 A 的历史之上继续 B 的变基历史。
您可以使用
git cherry-pick [-n] <commit>
执行此操作,以通过变基达到与上面相同的结果。但这很慢,应该手动完成。
-n
选项允许您获取索引阶段的所有更改git status
,编辑这些更改并继续git commit + git add
我最近需要在主干之上重新调整我的功能分支,这有很大的分歧。由于差异如此之大,一次性重新调整整个分支的基础是不可行的,我不得不拆分工作。
首先,你想要
git log --graph <target-branch>
。具体来说,您只想使用图中最左边的主线提交。然后使用*
。可能会增加
git rebase --onto <commit> <target-branch>
。