我有以下存储库:
A--B--C--D--E--F--G--H--I--J
\
K--L--M
main -> J
DEV -> M
我想压缩 B 和 E 之间的提交,所以仓库看起来像这样:
A--N--F--G--H--I--J
\
K--L--M
main -> J
DEV -> M
我尝试做一些互动壁球,但我得到的最好的结果是这样的:
N--F'-G'-H'-I'-J'
/
A--B--C--D--E--F--G--H--I--J
\
K--L--M
remote/main -> J
main -> J'
DEV -> M
所以 DEV 分支没有连接到它应该在的地方。
有什么方法可以做到这一点?
在顶部进行一次性合并提交后,您可以使用交互式
--rebase-merges
:
我们构建这段历史:
A--B--C--D--E--F--G--H--I--J--X <-- main
\ /
K--L----M <-- DEV
使用
git checkout main
git merge --strategy ours DEV # constructs X
合并结果(
X
)是无关紧要的,因为我们无论如何都会扔掉它。使用合并策略ours
保证合并命令成功。
现在您可以进行交互式变基:
git rebase -i --rebase-merges --update-refs -- A
在生成的“待办事项”列表中,指定
B
和 E
的压缩,并删除最后一行中的合并命令,如下所示:
label onto
# Branch DEV
reset onto
pick b844192 B
squash b844195 E
pick b844193 C
pick b844194 D
pick b844196 F
pick b844197 G
label branch-point
pick bb393a5 K
pick c213a54 L
pick b844198 M
update-ref refs/heads/DEV
label DEV
reset branch-point # G
pick b918c51 H
pick b918c52 I
pick b918c53 J
# merge -C 9e9d655 DEV # Merge branch 'DEV' into main
--updated-refs
确保分支 DEV
重新放置在重写的侧分支之上。为此,您需要 Git 版本 2.38。如果您的版本较旧,请保留该选项并手动重新安装分支标签。
顺便说一句,脚本在“侧”分支
A
上重建提交 G
到 DEV
。这一定不会让您感到惊讶:提交是在该分支上。