How to use git merge --squash?
我有一个远程Git服务器,下面是我要执行的场景:
那么,如何将我的分支合并到远程分支,以便它们只为我的所有签入获取一个提交(我甚至想为此提供提交消息)?
- 我不确定我是否完全理解你,但你可能想要一个"章鱼合并"。
- 您想保留其他分支上的个人提交吗?
- 我通常使用git-rebase-i将所有提交折叠为一个提交,并重新编写提交消息。然后我把它送到上游。
- 另请参见:合并后如何处理分支
- @爱德华德法尔克,git rebase -i和abyx的(公认的)答案有什么区别?
- git merge --squash一次就在命令行上完成了所有的工作,你只是希望它能工作。git rebase -i会弹出一个编辑器,让您可以对rebase进行微调。速度比较慢,但你可以看到你在做什么。另外,REBASE和MERGE之间也存在差异,因为它们太过复杂,无法在注释中进行处理。
- 所有这些答案的问题是,您必须在本地的主分支上运行merge--squash命令…我想运行合并——从功能分支而不是主分支挤压……这样当我完成后,我可以将功能分支推到远程并提交一个pr,这是可能的吗?
- @AlexanderMills,我认为您只需要第二个功能分支(从主分支克隆)。从旧的到新的做一个merge --squash,然后把新的分支合并到master。旧的分支已经过时了。
假设您的bug修复分支称为bugfix,您希望将其合并到master中:
1 2 3
| git checkout master
git merge --squash bugfix
git commit |
。
这将从bugfix分支中获取所有提交,将它们压缩为1个提交,并将其与您的master分支合并。
说明:
切换到您的master分支。
1
| git merge --squash bugfix |
。
从bugfix分支获取所有提交,并将其与当前分支合并。
。
从合并的更改创建单个提交。
省略-m参数可以在完成提交之前修改一个包含压扁提交中的每个消息的提交消息草稿。
- 如果要保留对旧提交消息的引用,可以编写git commit(不带-m参数),并且可以修改一个起草的提交消息,其中包含您压扁的所有提交消息。
- 您可以稍后通过执行git commit --amend -m '...'来实现相同的目标。
- @abyx我一直在使用您的解决方案将错误修复和特性从我们的开发中作为一个单独的提交转移到主控中,但是看起来Revert提交并没有包含在合并挤压中。我选择了revert提交作为解决方法,但必须有一个更好的解决方案来解决这个角落的问题。思想?
- 另请参见:本地和远程删除Git分支
- 如果配置中有merge.ff=false,请确保设置--ff 选项。
- 如果发生合并冲突并且您解决了这些冲突,git commit将不再显示包含您压扁的所有提交消息的有用提交消息。在这种情况下,尝试git commit --file .git/SQUASH_MSG(通过stackoverflow.com/a/11230783/923560)。
- 请记住,默认情况下,挤压将属性提交给挤压器。要保留原作者,您需要像这样明确地指定:git commit -a --author="Author" --message="Issue title #id"。
- git merge --squash允许您在当前分支的顶部创建一个提交,其效果与合并另一个分支相同。但它不会生成合并记录,这意味着作为结果的拉请求将没有更改,但不会标记为合并!所以,您只需删除要完成的分支即可。
最后我澄清了这一点的是一条评论,显示:
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可以得到我想要的结果,一次提交合并一个完整的特性分支。而且,我最多只需要手动解决一个冲突。
- 我强烈建议先在特性分支中执行合并,然后在主分支中执行合并。
- 是的,merge --squash策略最重要的一点是,您可以不断地将源站/主服务器合并到您的分支中,从而使最终的合并更加容易。
- @Dotanchohen很抱歉地提了一个旧的意见:)在执行来自主分支的git merge --squash feature之前,在功能分支中合并会得到什么好处?
- 您希望首先将master合并到功能分支中,并处理功能分支中的任何手动修复。这还允许您运行测试并确保您的功能分支正常工作。然后,您就可以保证将特性分支自动合并到master中。
- @我建议你在你的回答中加上上述的解释。
- @Bitsmack:您将首先将主控形状合并到功能中。这使您有机会在将功能合并到主控形状之前解决功能上的冲突。
要与"挤压"选项合并。如果你想一次只做一个分支的话。
1
| git merge --squash feature1 |
如果要在单个提交的同时合并所有分支,则首先以交互方式重新设置基片并挤压每个功能,然后章鱼合并:
1 2
| git checkout feature1
git rebase -i master |
号
挤压到一个提交中,然后对其他功能重复。
1 2
| git checkout master
git merge feature1 feature2 feature3 ... |
最后一次合并是"章鱼合并",因为它同时合并了许多分支。
希望这有帮助
- 为什么要重新平衡?
- @Umarashraf是一个交互式的钢筋网,可以选择在你的分支内进行挤压。
- 重新平衡是个坏主意。不重新设置已发布的提交
- @sebi2020-git合并——squash将以比交互式重新平衡更糟糕的方式重新平衡已经发布的提交。交互钢筋(在功能分支上)几乎没有负面影响。
- @xiix只有当您是唯一使用功能分支的人时,这一点才成立。这不是你能做的假设。我建议阅读与Git SCM上重新平衡相关的页面。它指出,"不要重新平衡存储库之外的提交,人们可能已经基于它们进行了工作。"如果您不确定人们是否已经基于已发布的提交进行了工作(由于git的分散性,您不知道这一点),则不应这样做。
- @SEBI2020——这绝对是我能做的一个假设。不是每个人都能做的一个假设,但至少在我们公司,我们没有大量的人对特性分支进行不协调的更改。
如果您已经在main上使用了git merge bugfix,则可以将合并承诺压缩为一个:
1 2
| git reset --soft HEAD^1
git commit |
- git reset --soft HEAD^1似乎撤销了合并前执行的最后一次提交,至少在合并是快速前进的情况下是这样。
- @案例几乎在一jespermatthiesen前锋你don’t get a合并提交,那么你会做git reset --soft HEAD^。
- 这是我到一个南瓜和单提交合并后的下游。
将newFeature分支合并到master中,并进行自定义提交:
1
| git merge --squash newFeature && git commit -m 'Your custom commit message'; |
。
如果相反,你会的
埃多克斯1〔13〕
您将收到一条提交消息,其中包含所有可以定制的newFeature分支提交。
我知道这个问题不是关于GitHub的,但是由于GitHub被广泛使用,这是我一直在寻找的答案,我将在这里分享。
Github能够执行挤压合并,具体取决于为存储库启用的合并选项。
如果启用了挤压合并,则"挤压和合并"选项应显示在下拉列表中的"合并"按钮下。
。
假设您在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> |
号
这不会提交它,允许您首先检查它。
然后提交,完成这个新分支的特性,删除/忽略旧分支(开发人员所在的分支)。
- melebius唯一的"参考"sourcetree"在你的年龄,如果它有一天或以前的问题:它不存在了。
- "jordanstefanelli sourcetree)是用在原版本的这个回答。谢谢50是固定的!