压缩包含与主提交合并的多个提交

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

假设我们有以下场景:

  • 总支
  • 新改进的功能分支

在特性分支中,提交历史看起来像这样(在特性分支的开发过程中主分支更新,我们希望特性分支与主分支保持同步):

  • E<- (HEAD, feature branch)
  • 将主要内容合并到功能中
  • D
  • C
  • 将主要内容合并到功能中
  • 一个<- first commit on feature branch

现在我们想将所有这些提交压缩成一个提交。 当我尝试使用 git rebase -i HEAD~7 => 一个 9 行的列表,其中包含来自功能分支(A、B、C、D、E)的新提交以及从 main(不是合并提交实际提交)。

  • 选A
  • 选B
  • pick New_commit_from_main_1
  • 选C
  • 选D
  • pick New_commit_from_main_2
  • pick New_commit_from_main_3
  • 选择E

当我尝试使用 git rebase -i main => 一个包含 5 个提交的列表,其中不包含合并提交或从 main 获取的提交,如上例所示

  • 选A
  • 选B
  • 选C
  • 选D
  • 选择E

我不明白为什么会这样。我希望有以下提交列表:

  • 选A
  • 选B
  • 选择将主要内容合并到功能中
  • 选C
  • 选D
  • 选择将主要内容合并到功能中
  • 选择E

git rebase -i 主要 git rebase -i HEAD~7

git git-rebase squash git-interactive-rebase
1个回答
0
投票

git rebase
的默认行为是忽略合并(如:将它们从变基提交列表中完全删除,无论是否使用
--interactive
标志)。

当您第一次遇到这种行为时,您会感到非常惊讶 :)


如果你想处理变基历史中的合并,你可以使用明确的

-r|--rebase-merges
选项:

-r, --rebase-merges[=(rebase-cousins|no-rebase-cousins)]

默认情况下,rebase 将简单地从待办事项列表中删除合并提交,并将 rebased 提交放入单个线性分支中。使用 --rebase-merges,变基将尝试通过重新创建合并提交来保留要变基的提交中的分支结构。这些合并提交中任何已解决的合并冲突或手动修改都必须手动解决/重新应用。

[...]


另一种选择是尝试将所有功能提交压缩为 1,然后在其上添加合并结果。

如果来自 master 的合并没有导致很多冲突,那么这应该是可行的:

  1. 写下你的
    E
    提交的当前哈希值,
  2. run
    git rebase -i HEAD~7
    ,从该列表中删除来自 master 的提交,将提交
    B .. E
    标记为
    squash
    ,
  3. 保存并退出,让
    git rebase
    完成它的工作

-> 如果你没有太多冲突,你应该将“功能内容”浓缩在一次提交中

  1. 使用
    E
    的原始内容创建一个合并提交(您在步骤 1 中写下的内容。)
git merge -n master
git reset .
git restore --staged -s <original hash of commit E>
git commit
© www.soinside.com 2019 - 2024. All rights reserved.