Git squash 在分支中间提交,之后还有子分支

问题描述 投票:0回答:1

我有以下存储库:

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 分支没有连接到它应该在的地方。

有什么方法可以做到这一点?

git rebase squash
1个回答
0
投票

在顶部进行一次性合并提交后,您可以使用交互式

--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
。这一定不会让您感到惊讶:提交在该分支上。

© www.soinside.com 2019 - 2024. All rights reserved.