1573

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

  • 对于每个错误/功能,我创建一个不同的 Git 分支

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

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

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

4

15 回答 15

2548

假设您的错误修复分支被调用bugfix,并且您希望将其合并到master

git checkout master
git merge --squash bugfix
git commit

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


说明

git checkout master

切换到您的master分支。

git merge --squash bugfix

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

git commit

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

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

于 2011-03-15T08:16:45.477 回答
168

最终为我澄清的是一条评论,表明:

git checkout main
git merge --squash feature

相当于做:

git checkout feature
git diff main > feature.patch
git checkout main
patch -p1 < feature.patch
git add .

当我想将功能分支与 105(!!) 提交合并并将它们全部压缩为一个时,我不想这样做,git rebase -i origin/master因为我需要分别解决每个中间提交的合并冲突(或者至少是那些git无法弄清楚自己)。Usinggit merge --squash得到了我想要的结果,即合并整个功能分支的单个提交。而且,我最多只需要做一次手动冲突解决。

于 2014-08-19T15:59:21.243 回答
109

您想与壁球选项合并。那就是如果你想一次只做一个分支。

git merge --squash feature1

如果您想在单个提交的同时合并所有分支,则首先以交互方式重新设置基础并压缩每个功能,然后进行章鱼合并:

git checkout feature1
git rebase -i master

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

git checkout master
git merge feature1 feature2 feature3 ...

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

希望这可以帮助

于 2011-03-15T08:08:50.217 回答
29

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

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

相反,如果你这样做

git merge --squash newFeature && git commit

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

我在这里彻底解释:https ://youtu.be/FQNAIacelT4

于 2017-03-17T11:10:32.003 回答
24

如果你已经git merge bugfixon main,你可以将你的合并提交压缩成一个:

git reset --soft HEAD^1
git commit
于 2015-03-13T17:50:29.510 回答
17

假设您在 feature/task1 中进行了多次提交。

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

     git checkout project/my_project
    
  2. 创建一个新分支(feature/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
    
于 2018-12-27T00:24:58.317 回答
17

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

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

如果启用了 squash 合并,则“Squash and merge”选项应出现在“Merge”按钮下的下拉列表中。

截图

于 2019-02-22T23:14:10.387 回答
2

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

  1. 如果尚未签出,请签出相关分支以进行处理。

  2. 找到您希望保留的最旧提交的 sha。

  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. 重置为您希望保留的原始提交 sha。

    git reset --soft <sha1>

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

    git rebase tmp1

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

于 2020-03-30T13:07:28.857 回答
1
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
于 2020-08-27T03:23:13.583 回答
1

对于 Git

创建新功能

通过终端/外壳:

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

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

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

于 2017-10-05T14:33:27.247 回答
0

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

git checkout master
git merge --squash bugfix
git add .
git commit -m "Message"

修复了所有冲突文件

git add . 

你也可以使用

git add [filename]
于 2019-12-18T07:37:15.430 回答
0

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

  • 转到合并分支:git checkout master && git pull
  • 从干净的本地 master 创建一个工作分支: git checkout -b work
  • 在工作中合并压缩您的功能分支:git merge --squash your_feature_branch。
  • 使用默认或新消息提交:git commit(使用特定或默认消息)
  • 返回您的功能分支: git checkout your_feature_branch
  • 将您的功能分支指向工作目录: git reset --hard work
  • 验证但您已准备好推送: git push -f
  • 然后根据需要清理工作分支

将 master 替换为您的目标分支:develop 等等

  • 无需指定从您的 master 到您的功能分支的提交次数。吉特照顾*
于 2020-12-16T21:02:42.247 回答
0

假设您进行多次提交的分支的名称称为 bugfix/123,并且您想要压缩这些提交。
首先,从开发中创建一个新分支(或任何您的存储库的名称)。假设新分支的名称为 bugfix/123_up。在 git bash 中签出这个分支 -

  • 获取
  • git checkout bugfix/123_up
  • git 合并错误修复/123 --squash
  • git commit -m "你的信息"
  • git push origin bugfix/123_up

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

于 2021-02-09T14:23:50.700 回答
-1

利用

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

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

于 2020-08-19T10:28:50.413 回答
-1

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

git squash master
git push --force
于 2020-06-01T19:37:50.157 回答