如何将多个提交合并到另一个分支作为一个压扁提交?

我有一个远程Git服务器,这是我想要执行的场景:

  • 对于每个bug /feature我创建一个不同的Git分支

  • 我一直在使用非官方Git消息在那个Git分支中提交我的代码

  • 在顶级存储库中,我们必须使用官方Git消息为bug执行一次提交

那么,如何将我的分支合并到远程分支,以便它们只为我的所有签入获得一次提交(我甚至想为此提供提交消息)?

949725 次浏览

你想合并与壁球选项。这是如果你想这样做一次一个分支。

git merge --squash feature1

如果您想同时合并所有分支作为单个提交,那么首先交互式地rebase并压扁每个功能,然后octopus合并:

git checkout feature1git rebase -i master

压缩到一个提交中,然后重复其他功能。

git checkout mastergit merge feature1 feature2 feature3 ...

最后一次合并是“章鱼合并”,因为它同时合并了很多分支。

希望这有帮助

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

git checkout mastergit merge --squash bugfixgit commit

这将从bugfix分支获取所有提交,将它们压缩为1个提交,并将其与master分支合并。


补充说明

git checkout master

切换到您的master分支。

git merge --squash bugfix

bugfix分支获取所有提交,并将其与当前分支分组为1次提交。
(没有出现合并提交;您可以在提交之前手动解决冲突)

git commit

从合并的更改创建单个提交。

省略-m参数可让您在完成提交之前修改包含压扁提交中的每条消息的草案提交消息。

最终为我澄清的是一个评论显示:

git checkout maingit merge --squash feature

相当于做:

git checkout featuregit diff main > feature.patchgit checkout mainpatch -p1 < feature.patchgit add .

当我想合并一个包含105个(!!)提交的功能分支并将它们全部压缩成一个时,我不想git rebase -i origin/master,因为我需要单独解决每个个中间提交的合并冲突(或者至少是git无法自行解决的提交)。使用git merge --squash可以得到我想要的结果,即合并整个功能分支的单个提交。而且,我最多只需要做一次手动冲突解决。

如果你已经在main上有了git merge bugfix,你可以用以下方式将合并提交压缩为一个:

git reset --soft HEAD^1git commit

使用自定义提交将newFeature分支合并到master

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

如果相反,你做

git merge --squash newFeature && git commit

您将收到一条提交消息,其中包含您可以自定义的所有newFeature分支提交。

我在这里详细解释:https://youtu.be/FQNAIacelT4

对于git

创建新功能

通过终端/外壳:

git checkout origin/feature/<featurename>git merge --squash origin/feature/<featurename>

这不会提交它,允许您先查看它。

然后提交,并完成这个新分支的功能,并删除/忽略旧分支(你开发的那个)。

假设您在功能/task1中使用多个提交。

  1. 转到您的项目分支(项目/my_project)

     git checkout project/my_project
  2. 创建一个新分支(功能/task1_bugfix)

     git checkout -b feature/task1_bugfix
  3. --squash选项合并

     git merge --squash feature/task1
  4. 创建一个单一的提交

     git commit -am "add single comments"
  5. 推你的分支

     git push --set-upstream origin feature/task1_bugfix

我知道这个问题不是专门针对Github的,但由于Github的使用如此广泛,这就是我一直在寻找的答案,我将在这里分享它。

Github能够执行壁球合并,具体取决于为存储库启用的合并选项。

如果启用了壁球合并,“壁球合并”选项应该出现在“合并”按钮下的下拉列表中。

GitHub功能的截图

如果您收到错误:无法提交,因为您有未合并的文件。

git checkout mastergit merge --squash bugfixgit add .git commit -m "Message"

修复了所有冲突文件

git add .

您也可以使用

git add [filename]

在推动你的本地分支之前压扁它:

  1. 签出有问题的分支,如果它还没有签出。

  2. 找到你想保留的最古老的承诺的沙。

  3. 从该提交创建/签出一个新分支(tmp1)。

    git checkout -b tmp1 <sha1-of-commit>

  4. 合并原来的分支到一个新的压扁。

    git merge --squash <original branch>

  5. 使用摘要提交消息提交合并创建的更改。

    git commit -m <msg>

  6. 签出要压扁的原始分支。

    git checkout <branch>

  7. 重置为您希望保留的原始提交沙。

    git reset --soft <sha1>

  8. 基于新的tmp1分支重设此分支。

    git rebase tmp1

  9. 就是这样-一旦确定一切正常,现在删除临时tmp1分支。

你可以使用我创建的工具来简化这个过程:git-squash。例如,要压缩从主分支分支的功能分支上的所有提交,请编写:

git squash mastergit push --force

使用

git status

来检查发生了什么。

然后

git checkout mastergit merge --squash bugfixgit add (add which files you want or use wildcard command like ".")

然后

git commit -m "message"

最后但并非最不重要的

git push -u origin master

这里origin可以是您喜欢的其他遥控器。

git checkout YOUR_RELEASE_BRANCHgit pullgit checkout -b A_NEW_BRANCHgit merge --squash YOUR_BRANCH_WITH_MULTIPLE_COMMITSgit commit -am "squashing all commits into one"git push --set-upstream origin A_NEW_BRANCH

您的功能分支已完成并准备好仅通过一次提交提交到master,开发或其他目标分支

  • 转到合并分支:git检出主&&git拉
  • 从干净的本地主服务器创建一个工作分支:git check out-b work
  • 在工作中合并压扁您的功能分支:git合并--squashyour_feature_branch。
  • 使用默认或新消息提交:git提交(使用特定或默认消息)
  • 回到你的特性分支:git check outyour_feature_branch
  • 将您的功能分支指向工作目录:git重置--hard work
  • 验证但您已准备好推送:git ush-f
  • 如果需要,清理工作分支

用你的目标分支替换master:开发等等

  • 无需指定从您的主服务器到您的功能分支的提交次数。Git照顾*

假设您进行多次提交的分支的名称称为bug补丁/123,并且您想压缩这些提交。
首先,从开发创建一个新分支(或者不管你的存储库叫什么名字)。假设新分支的名称叫做bug/123_up。在git bash中签出这个分支-

  • 获取文件
  • git检出错误修复/123_up
  • git合并错误修复/123--squash
  • git提交-m"你的消息"
  • 修复git推送源123_up

现在这个分支将只有一个提交,其中包含您的所有更改。