将多个提交合并到另一个分支作为单个压缩提交的方法

将多个提交合并到另一个分支作为单个压缩提交的方法

技术背景

在使用Git进行项目开发时,为了修复某个bug或开发新功能,我们通常会创建一个新的分支进行工作。在这个过程中,可能会产生多个提交。当我们想将这些提交合并到主分支时,为了保持主分支提交历史的简洁,我们希望将这些提交压缩成一个提交进行合并。

实现步骤

基本合并方法

假设修复bug的分支名为bugfix,要将其合并到master分支:

  1. 切换到master分支:
1
git checkout master
  1. 使用--squash选项合并bugfix分支:
1
git merge --squash bugfix
  1. 创建一个新的提交:
1
git commit

多分支同时合并

如果想同时将多个分支以单个提交的形式合并,可以先交互式变基并压缩每个功能分支,然后进行章鱼合并:

  1. 对每个功能分支进行交互式变基并压缩:
1
2
git checkout feature1
git rebase -i master

重复上述步骤处理其他功能分支。
2. 切换到master分支并进行章鱼合并:

1
2
git checkout master
git merge feature1 feature2 feature3 ...

处理已合并的情况

如果已经在main分支上执行了git merge bugfix,可以使用以下命令将合并提交压缩成一个:

1
2
git reset --soft HEAD^1
git commit

本地分支压缩

在推送本地分支之前进行压缩:

  1. 检查并切换到要处理的分支。
  2. 找到要保留的最旧提交的SHA值。
  3. 从该提交创建并切换到一个新分支tmp1
1
git checkout -b tmp1 <sha1-of-commit>
  1. 压缩合并原始分支:
1
git merge --squash <original branch>
  1. 提交合并后的更改:
1
git commit -m <msg>
  1. 切换回原始分支:
1
git checkout <branch>
  1. 重置到要保留的原始提交SHA值:
1
git reset --soft <sha1>
  1. 基于新的tmp1分支进行变基:
1
git rebase tmp1
  1. 确认无误后删除临时分支tmp1

自定义提交信息合并

newFeature分支合并到master分支并使用自定义提交信息:

1
git merge --squash newFeature && git commit -m 'Your custom commit message'

核心代码

基本合并代码

1
2
3
git checkout master
git merge --squash bugfix
git commit

自定义提交信息合并代码

1
git merge --squash newFeature && git commit -m 'Your custom commit message'

本地分支压缩代码

1
2
3
4
5
6
git checkout -b tmp1 <sha1-of-commit>
git merge --squash <original branch>
git commit -m <msg>
git checkout <branch>
git reset --soft <sha1>
git rebase tmp1

最佳实践

  • 在合并前先进行git status检查,确保工作区干净。
  • 对于复杂的合并,可以先在测试环境中进行尝试。
  • 使用自定义提交信息时,确保信息清晰明了,能准确描述合并的内容。

常见问题

提交时出现未合并文件错误

如果出现Committing is not possible because you have unmerged files.错误,可以按以下步骤解决:

1
2
3
4
git checkout master
git merge --squash bugfix
git add .
git commit -m "Message"

手动解决所有冲突文件后,使用git add .git add [filename]添加文件。


将多个提交合并到另一个分支作为单个压缩提交的方法
https://119291.xyz/posts/merge-multiple-commits-to-another-branch-as-a-single-squashed-commit/
作者
ww
发布于
2025年5月26日
许可协议