Git 如何将多个提交合并到另一个分支上作为单个压缩提交?

Git 如何将多个提交合并到另一个分支上作为单个压缩提交?,git,git-merge,git-squash,Git,Git Merge,Git Squash,我有一个远程Git服务器,下面是我想要执行的场景: 对于每个bug/特性,我创建了一个不同的Git分支 我继续在Git分支中使用非官方Git消息提交代码 在顶级存储库中,我们必须使用官方Git消息对一个bug进行一次提交 那么,如何将我的分支合并到远程分支,以便它们只为我的所有签入获取一个提交(我甚至想为此提供提交消息)?您想使用挤压选项合并。如果你想一次做一个分支的话 git merge --squash feature1 如果要在单个提交的同时合并所有分支,则首先以交互方式重新设置基础

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

  • 对于每个bug/特性,我创建了一个不同的Git分支

  • 我继续在Git分支中使用非官方Git消息提交代码

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


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

您想使用挤压选项合并。如果你想一次做一个分支的话

git merge --squash feature1
如果要在单个提交的同时合并所有分支,则首先以交互方式重新设置基础并挤压每个功能,然后八达通合并:

git checkout feature1
git rebase -i master
压缩为一个提交,然后重复其他功能

git checkout master
git merge feature1 feature2 feature3 ...
最后一次合并是“八达通合并”,因为它同时合并了很多分支


希望这有助于说您的bug fix分支名为
bug fix
,您希望将其合并到
master

git checkout master
git merge --squash bugfix
git commit
这将从
错误修复
分支获取所有提交,将它们压缩为一个提交,并将其与
分支合并

git merge --squash bugfix

说明

git checkout master
切换到您的
master
分支

git merge --squash bugfix
错误修复
分支获取所有提交,并将其分组,以便与当前分支进行1次提交。
(不显示合并提交;您可以在提交之前手动解决冲突)

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


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

最终为我清除的是显示:

git checkout main
git merge --squash feature
等同于做:

git checkout feature
git diff main > feature.patch
git checkout main
patch -p1 < feature.patch
git add .
git签出功能
git diff main>feature.patch
git签出主
patch-p1

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

如果您已经在
main
上安装了
git merge bug修复程序,您可以通过以下方式将合并提交压缩为一个:

git reset --soft HEAD^1
git commit

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

git merge --squash newFeature && git commit -m 'Your custom commit message';
如果相反,你会这样做

git合并--squash newFeature和&git commit

您将获得一条提交消息,该消息将包括您可以自定义的所有
newFeature
分支提交


我在这里详细解释了它:

对于Git

创建新功能

通过终端/外壳:

git checkout origin/feature/<featurename>
git merge --squash origin/feature/<featurename>
git签出原点/特征/
git合并--挤压原点/特征/
这不会提交它,允许您先查看它


然后提交并完成此新分支中的功能,并删除/忽略旧分支(您开发的分支)。

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

  • 转到您的项目分支(项目/my_项目)

  • 创建新分支(功能/任务1\u错误修复)

  • 使用
    --squash
    选项合并

     git merge --squash feature/task1
    
  • 创建单个提交

     git commit -am "add single comments"
    
  • 推你的树枝

     git push --set-upstream origin feature/task1_bugfix
    

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

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

    如果已启用挤压合并,则“挤压和合并”选项应出现在“合并”按钮下的下拉列表中


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

    git checkout master
    git merge --squash bugfix
    git add .
    git commit -m "Message"
    
    修复了所有冲突文件

    git add . 
    
    你也可以使用

    git add [filename]
    

    要在推压本地分支之前将其压扁,请执行以下操作:

  • 如果尚未签出要处理的分支,请签出该分支

  • 找到您希望保留的最早提交的sha

  • 从该提交创建/签出新分支(tmp1)

    git签出-b tmp1

  • 通过挤压将原始分支合并到新分支中

    git合并--squash

  • 使用摘要提交消息提交合并创建的更改

    git提交-m

  • 签出要挤压的原始分支

    git签出

  • 重置为您希望保留的原始提交sha

    git重置——软

  • 基于新的tmp1分支重新设置此分支的基础

    git-rebase-tmp1

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


  • 您可以使用我创建的工具简化此过程:。例如,要挤压已从主分支分支分支的要素分支上的所有提交,请写入:

    git squash master
    git push --force
    
    使用

    看看发生了什么

    然后

    然后

    现在是最后但并非最不重要的时刻

    git push -u origin master
    

    在这里,
    origin
    可以是您喜欢的其他远程分支。

    您的功能分支已经完成并准备好提交给master、development或其他目标分支,只需一次提交

    git checkout YOUR_RELEASE_BRANCH
    git pull
    git checkout -b A_NEW_BRANCH
    git merge --squash YOUR_BRANCH_WITH_MULTIPLE_COMMITS
    git commit -am "squashing all commits into one"
    git push --set-upstream origin A_NEW_BRANCH
    
    • 转到合并分支:git签出主机和git pull
    • 从干净的本地master创建一个工作分支:git checkout-b work
    • 合并在工作时挤压您的特征分支:git Merge——挤压您的特征分支
    • 使用默认值或新消息提交:git Commit
      git status 
      
      git checkout master 
      git merge --squash bugfix
      git add (add which files you want or use wildcard command like ".")
      
      git commit -m "message"
      
      git push -u origin master
      
      git checkout YOUR_RELEASE_BRANCH
      git pull
      git checkout -b A_NEW_BRANCH
      git merge --squash YOUR_BRANCH_WITH_MULTIPLE_COMMITS
      git commit -am "squashing all commits into one"
      git push --set-upstream origin A_NEW_BRANCH