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


对于每个错误/功能,我创建一个不同的Git分支
我继续提交我的代码在该Git分支中包含非官方的Git消息
在顶层存储库中,我们必须使用官方Git消息对一个bug进行一次提交

所以我该如何将我的分支合并到远程分支他们对我所有的签到都只提交一次(我什至想为此提供提交消息)?

评论

我不确定我是否完全了解您,但您可能需要“章鱼合并”。

我通常使用git rebase -i将所有提交折叠为一个提交,然后重新写入提交消息。然后我将其发送给上游。

git merge --squash一口气在命令行上完成所有操作,您只是希望它能起作用。 git rebase -i打开一个编辑器,让您微调rebase。速度较慢,但​​是您可以看到自己在做什么。此外,rebase和merge之间也存在差异,在注释中涉及得太少了。

所有这些答案的问题是您必须在本地master分支上并运行merge --squash命令...我想从功能分支而不是master分支上运行merge --squash。完成后,可以将功能分支推送到远程并提交PR,这可能吗?

@AlexanderMills,我想您只需要第二个功能分支(从master分支克隆)。从旧的合并到新的--squash,然后将新的分支合并到master。旧的分支变得过时了。

#1 楼

假设您的错误修复分支称为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参数可让您修改草稿提交消息,其中包含来自压缩提交的所有消息,然后再完成提交。

评论


如果要保留对旧提交消息的引用,则可以编写git commit(不带-m参数),然后将修改包含所有压缩的提交消息的草稿提交消息。

– Alex
13年8月8日在15:16

您可以稍后执行git commit --amend -m'...'来实现相同目的。

– Janusz Lenar
14年2月13日在13:21

如果发生合并冲突并且您解决了这些冲突,则git commit将不再显示有用的提交消息,其中包含您压缩的所有提交消息。在这种情况下,请尝试git commit --file .git / SQUASH_MSG(通过stackoverflow.com/a/11230783/923560)。

–阿卜杜勒(Abdull)
16年6月3日,16:02

请记住,默认情况下,壁球会将提交归于壁球。要保留原始作者,您需要像这样明确指定它:git commit -a --author =“ Author” --message =“问题标题#id”

–很棒
16年8月17日在17:16

git merge --squash允许您在当前分支之上创建一个提交,其作用与合并另一个分支相同。但这不会产生合并记录,这意味着您的拉取请求结果将保持不变,但不会被标记为已合并!因此,您只需要删除该分支即可。

–am0wa
17年8月2日在13:34

#2 楼

最终为我解决的是一条评论,它显示:

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 master,然后再在master分支中执行git merge --squash功能。

– dotancohen
2014年9月10日上午8:50

@dotancohen抱歉,疏通了一条旧评论:)从master分支执行git merge --squash功能之前,合并到feature分支中会得到什么?

–bitsmack
2015年6月1日22:04

您想先将master合并到Feature分支中,然后在Feature分支中处理所有手动修复。这也使您可以运行测试并确保功能分支正常运行。然后,可以确保可以将功能分支自动合并到master。

–丹·科恩(Dan Kohn)
15年6月2日在1:44

@dankohn我建议您将以上评论中的解释添加到您的答案中。

–冈伯特
15年12月17日在15:29

@bitsmack:您将首先将master合并为功能。这使您有机会在将功能部件合并到母版中之前解决功能部件上的冲突

–迈克
16年6月3日,12:41

#3 楼

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

git merge --squash feature1


如果要在一次提交的同时合并所有分支,则首先需要交互地进行变基并压缩每个功能,然后将章鱼合并:

git checkout feature1
git rebase -i master


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

git checkout master
git merge feature1 feature2 feature3 ...


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

希望对您有所帮助

评论


你为什么要下基地?

– Umair A.
13-10-11在10:38

@UmairAshraf这是一个交互式的基础,可让您选择在分支机构内进行壁球。

– andho
13-10-25在2:19

变基是个坏主意。不要对已经发布的提交进行重新设置

–Sebi2020
18年11月16日在14:21

@ Sebi2020 git merge --squash将以比交互式重新基准更糟糕的方式对已经发布的提交重新设定基准。交互式基础库(在功能分支上)几乎没有不良影响。

– xiix
19 Mar 5 '19 at 10:38

@xiix仅当您使用功能分支时才适用。这不是您可以做的假设。我建议阅读与在Git-SCM上重新基础相关的页面。它指出“不要对存储库外部存在的提交进行重新基准设置,否则人们可能会基于它们进行工作。”而且,如果您不确定别人是否已经基于已发布的提交进行工作(由于git的分散性,您就无法知道),那么您就不应该这样做。

–Sebi2020
19 Mar 5 '19 at 14:19



#4 楼

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

git reset --soft HEAD^1
git commit


评论


git reset --soft HEAD ^ 1似乎撤消了合并之前执行的最后一次提交,至少在合并是快进的情况下如此。

–贾斯珀·马蒂森(Jesper Matthiesen)
18年5月15日在14:21

@JesperMatthiesen在快速转发的情况下,您不会获得合并提交,因此您将执行git reset --soft HEAD ^

– qwertzguy
18年5月15日在20:17

这有助于我在下游合并之后将所有内容压缩为单个提交。

– Killjoy
18年8月19日在21:52

#5 楼

通过自定义提交将newFeature分支合并到master中:

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


如果相反,则执行

git merge --squash newFeature && git commit

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

我在这里进行了详细说明:https://youtu.be/FQNAIacelT4

#6 楼

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

Github具有执行壁球的能力合并,具体取决于为存储库启用的合并选项。

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



评论


GitHub使用与您的帐户关联的默认电子邮件。如果您有多个电子邮件地址,并且需要使用辅助电子邮件地址,则不能使用GH UI。

–卢卡·吉迪(Luca Guidi)
19年11月12日在9:20

#7 楼

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



转到项目分支(project / my_project)

git checkout project/my_project



创建一个新分支(功能/ task1_bugfix)

git checkout -b feature/task1_bugfix



使用--squash选项进行合并

git merge --squash feature/task1



创建单个提交

git commit -am "add single comments"



推送分支

git push --set-upstream origin feature/task1_bugfix




#8 楼

对于Git

通过Terminal / Shell创建新功能



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


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

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

评论


@Melebius如果您使用的是标记或先前的问题,则在您的句子中仅提及“ SourceTree”:它不再存在。

–乔丹·斯特凡内利
19年2月13日在14:47

此答案的原始版本中使用了@JordanStefanelli SourceTree。感谢您通知它已修复!

–梅勒比乌斯
19年2月13日在15:05

#9 楼

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

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


修复了所有冲突文件

git add . 


您也可以使用

git add [filename]


#10 楼

要在推送本地分支之前先对其进行压缩:


如果尚未将其检出,请检出有问题的分支以进行处理。
找到您希望的最旧提交的阴影保留。

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

git checkout -b tmp1 <sha1-of-commit>


将原始分支合并到新的压缩。

git merge --squash <original branch>


提交由合并创建的更改,并带有摘要提交消息。

git commit -m <msg>


签出要压缩的原始分支。

git checkout <branch>


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

git reset --soft <sha1>


根据新的tmp1分支对该分支重新设置基础。

git rebase tmp1
<就是这样-现在,只要确定一切正常,就删除临时的tmp1分支。


#11 楼

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


#12 楼

您的功能分支已完成,可以仅通过一次提交就提交到master,develop或其他目标分支。

转到合并分支:git checkout master && git pull
从您的分支创建工作分支清理本地主节点:git checkout -b work
在工作中合并压缩您的功能分支:git merge --squash your_feature_branch。
使用默认值或新消息进行提交:git commit(使用特定或默认消息)
回到您的功能分支:git checkout your_feature_branch
将您的功能分支指向工作目录:git reset --hardwork
验证但您准备好进行推送:git push -f
然后清理工作分支(如果需要)

用您的目标分支替换主分支:开发等

无需指定从主分支到功能分支的提交数量。 Git会保重*


#13 楼

您可以使用我创建的工具来简化此过程:git-squash。例如,要压缩已从master分支分支的Feature分支上的所有提交,请输入:

git squash master
git push --force


#14 楼

使用
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可以是您喜欢的其他遥控器。