如何使用git merge –squash?

How to use git merge --squash?

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

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

  • 我一直在用联合国正式的git消息在git分支提交我的代码。

  • 在顶级存储库中,我们必须使用正式的git消息对一个bug进行一次提交。

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


假设您的bug修复分支称为bugfix,您希望将其合并到master中:

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

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

说明:

1
git checkout master

切换到您的master分支。

1
git merge --squash bugfix

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

1
git commit

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

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


最后我澄清了这一点的是一条评论,显示:

1
2
git checkout main
git merge --squash feature

等同于做:

1
2
3
4
5
git checkout feature
git diff main > feature.patch
git checkout main
patch -p1 < feature.patch
git add .

当我想将一个功能分支与105(!!)提交并将它们全部压缩成一个,我不希望执行cx1(7),因为我需要分别解决每个中间提交的合并冲突(或者至少是Git自己无法解决的冲突)。使用git merge --squash可以得到我想要的结果,一次提交合并一个完整的特性分支。而且,我最多只需要手动解决一个冲突。


要与"挤压"选项合并。如果你想一次只做一个分支的话。

1
git merge --squash feature1

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

1
2
git checkout feature1
git rebase -i master

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

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

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

希望这有帮助


如果您已经在main上使用了git merge bugfix,则可以将合并承诺压缩为一个:

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


newFeature分支合并到master中,并进行自定义提交:

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

如果相反,你会的

埃多克斯1〔13〕

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


我知道这个问题不是关于GitHub的,但是由于GitHub被广泛使用,这是我一直在寻找的答案,我将在这里分享。

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

如果启用了挤压合并,则"挤压和合并"选项应显示在下拉列表中的"合并"按钮下。

Screenshot of


假设您在Feature/Task1中进行了多次提交。

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

    1
    git checkout project/my_project

  • 创建一个新分支(feature/task1_bugfix)

    1
    git checkout -b feature/task1_bugfix

  • --squash选项的Marge

    1
    git merge --squash feature/task1

  • 创建一个提交

    1
    git commit -am"add single comments"

  • 推你的树枝

    1
    git push --set-upstream origin feature/task1_bugfix


  • 对于Git

    创建新功能

    通过终端/外壳:

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

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

    然后提交,完成这个新分支的特性,删除/忽略旧分支(开发人员所在的分支)。