假设我们有以下场景:
在特性分支中,提交历史看起来像这样(在特性分支的开发过程中主分支更新,我们希望特性分支与主分支保持同步):
现在我们想将所有这些提交压缩成一个提交。 当我尝试使用 git rebase -i HEAD~7 => 一个 9 行的列表,其中包含来自功能分支(A、B、C、D、E)的新提交以及从 main(不是合并提交实际提交)。
当我尝试使用 git rebase -i main => 一个包含 5 个提交的列表,其中不包含合并提交或从 main 获取的提交,如上例所示
我不明白为什么会这样。我希望有以下提交列表:
git rebase -i 主要 git rebase -i HEAD~7
git rebase
的默认行为是忽略合并(如:将它们从变基提交列表中完全删除,无论是否使用 --interactive
标志)。
当您第一次遇到这种行为时,您会感到非常惊讶 :)
-r|--rebase-merges
选项:
-r, --rebase-merges[=(rebase-cousins|no-rebase-cousins)]
默认情况下,rebase 将简单地从待办事项列表中删除合并提交,并将 rebased 提交放入单个线性分支中。使用 --rebase-merges,变基将尝试通过重新创建合并提交来保留要变基的提交中的分支结构。这些合并提交中任何已解决的合并冲突或手动修改都必须手动解决/重新应用。
[...]
另一种选择是尝试将所有功能提交压缩为 1,然后在其上添加合并结果。
如果来自 master 的合并没有导致很多冲突,那么这应该是可行的:
E
提交的当前哈希值,git rebase -i HEAD~7
,从该列表中删除来自 master 的提交,将提交 B .. E
标记为 squash
,git rebase
完成它的工作-> 如果你没有太多冲突,你应该将“功能内容”浓缩在一次提交中
E
的原始内容创建一个合并提交(您在步骤 1 中写下的内容。)git merge -n master
git reset .
git restore --staged -s <original hash of commit E>
git commit