如何使用 git merge --squash?

我有一个远程 Git 服务器,这是我要执行的方案:

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

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

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

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

答案

假设您的错误修复分支称为bugfix并且您希望将其合并到master

git checkout master
git merge --squash bugfix
git commit

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


说明

git checkout master

切换到您的master分支。

git merge --squash bugfix

bugfix分支中获取所有提交,并将其与当前分支合并。

git commit

根据合并的更改创建一个提交。

省略-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 .

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

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

git merge --squash feature1

如果要在一次提交的同时合并所有分支,请首先以交互方式进行变基并压缩每个功能,然后再使用章鱼合并:

git checkout feature1
git rebase -i master

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

git checkout master
git merge feature1 feature2 feature3 ...

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

希望这可以帮助

如果您已经在main上进行了git merge bugfix ,则可以使用以下方法将合并提交压缩为一个:

git reset --soft HEAD^1
git 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

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

Github 可以执行南瓜合并,具体取决于为存储库启用的合并选项。

如果启用了南瓜合并,则 “压缩并合并” 选项应出现在 “合并” 按钮下的下拉列表中。

Github功能“ Squash and merge”的屏幕截图

假设您在功能 / 任务 1 中进行了多次提交。

  1. 转到您的项目分支(project / 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

对于 Git

创建一个新功能

通过终端 / 外壳:

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

这不会提交,允许您首先对其进行检查。

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

如果出现错误:由于未合并文件,因此无法提交。

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

修复了所有冲突文件

git add .

您也可以使用

git add [filename]