如何合并到只有两个提交并压缩一个提交的另一个分支?

How to merge to another branch with only two commits and with one commit squashed?

我创建了一个开发分支,但它有一些无用的提交。现在我想将提交合并到主线分支。 origin/master 分支中我想要的唯一提交是最新提交和另一个将第一个提交压缩到第二个最新提交的提交。

编辑: 抱歉,如果不清楚,让我试着说得更清楚。假设我在 dev 分支中有 5 个提交。我想将 dev 分支中所做的所有更改合并到 origin/master 分支。问题是我想将提交 #1-4 压缩为一个提交并将该提交和提交 #5 合并到 origin/master 分支。

如果您不想将临时分支中的所有更改合并到 master 中,您可以使用 git cherry-pick:

git checkout master
# Create a new commit in branch master which is equal to the latest
# commit in my_dev_branch
git cherry-pick my_dev_branch

如果您想从 my_dev_branch 中挑选两个提交并将它们压缩为 master 中的单个提交,那么 --no-commit 就是您所需要的:

git checkout master
git cherry-pick --no-commit <some-commit>
git cherry-pick --no-commit <another-commit>
# Now that all changes are in index, create a new commit
git commit

根据该分支上的提交数量,尤其是那些你想摆脱的“无用”的,你可以做一个交互式的 rebase 来摆脱那些你不想要的,或者你可以简单地 cherry - 选择你真正想要保留的两个:

# check out master and update it first
git checkout master
git merge origin/master

# cherry-pick the latest commit from the development branch
git cherry-pick dev-branch

# cherry-pick the other commit (use the hash from the log)
git cherry-pick theothercommitshash

之后,您将这两个提交完全放在 master 之上,您可以使用软重置或交互式 rebase 压缩它们。

The problem is that I want to squash commits #1-4 into one commit and merge that commit and commit #5 to the origin/master branch.

这实际上是交互式变基的完美用例。

从 dev 分支开始,运行 git rebase -i dev~5 启动编辑器,其中包含最后 5 次提交的交互式变基计划。它应该是这样的:

pick <hash1> Commit 1
pick <hash2> Commit 2
pick <hash3> Commit 3
pick <hash4> Commit 4
pick <hash5> Commit 5

把里面的三个pick改成squash,这样就变成了这样:

pick <hash1> Commit 1
squash <hash2> Commit 2
squash <hash3> Commit 3
squash <hash4> Commit 4
pick <hash5> Commit 5

squash 基本上意味着“接受提交,但将其融合到前一个”。所以在这种情况下,commit 1 被原样 picked,然后 commit 2、3、4 都被一个接一个地压入其中。所以你最终得到一个包含所有 4 个提交的更改的提交。

保存计划并退出编辑器以开始交互式变基,并在 Git 提示您这样做时调整压缩提交的提交消息。最终,您将在分支上得到两个提交:压扁的提交,以及在此基础上重新提交的 5 次提交。

最后,您只需将分支合并到 master 即可。