我有一个远程 Git 服务器,这是我想要执行的场景:
对于每个错误/功能,我创建一个不同的 Git 分支
我继续使用非官方 Git 消息在该 Git 分支中提交我的代码
在顶级存储库中,我们必须使用官方 Git 消息对一个错误进行一次提交
那么如何将我的分支合并到远程分支,以便他们只为我的所有签入获得一次提交(我什至想为此提供提交消息)?
git merge --squash
在命令行上一次性完成所有操作,您只希望它能正常工作。 git rebase -i
调出一个编辑器,让您微调变基。它速度较慢,但您可以看到自己在做什么。此外,rebase 和 merge 之间存在一些差异,这些差异有点过于复杂,无法在评论中解决。
merge --squash
,然后将新分支合并到 master。旧分支已过时。
假设您的错误修复分支名为 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
参数可让您在完成提交之前修改包含来自已压缩提交的每条消息的草稿提交消息。
最终为我解决这个问题的是 comment 表明:
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
中执行合并,然后才在主分支中执行 git merge --squash feature
。
git merge --squash feature
之前在功能分支中合并有什么好处?
您想与壁球选项合并。那就是如果你想一次只做一个分支。
git merge --squash feature1
如果您想在单个提交的同时合并所有分支,则首先以交互方式重新设置基础并压缩每个功能,然后进行章鱼合并:
git checkout feature1
git rebase -i master
压缩成一个提交,然后重复其他功能。
git checkout master
git merge feature1 feature2 feature3 ...
最后一次合并是“章鱼合并”,因为它一次合并了许多分支。
希望这可以帮助
使用自定义提交将 newFeature
分支合并到 master
:
git merge --squash newFeature && git commit -m 'Your custom commit message';
相反,如果你这样做
git merge --squash newFeature && git commit
您将收到一条提交消息,其中包含您可以自定义的所有 newFeature
分支提交。
我在这里彻底解释:https://youtu.be/FQNAIacelT4
假设您在 feature/task1 中进行了多次提交。
转到您的项目分支 (project/my_project) git checkout project/my_project 创建一个新分支 (feature/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
如果您在 main
上已经有 git merge bugfix
,则可以将合并提交压缩为一个:
git reset --soft HEAD^1
git commit
git reset --soft HEAD^1
似乎撤消了在合并之前执行的最后一次提交,至少在合并是快进的情况下。
git reset --soft HEAD^<number-of-commits-to-squash>
。
我知道这个问题不是专门针对 Github 的,但是由于 Github 的使用如此广泛,这就是我一直在寻找的答案,所以我会在这里分享。
Github 能够执行 squash 合并,具体取决于为存储库启用的合并选项。
如果启用了 squash 合并,则“Squash and merge”选项应出现在“Merge”按钮下的下拉列表中。
https://i.stack.imgur.com/gxz2l.png
在推送之前压缩本地分支:
如果尚未签出,请签出相关分支以进行处理。找到您希望保留的最旧提交的 sha。从该提交创建/签出一个新分支 (tmp1)。 git checkout -b tmp1
对于 Git
创建新功能
通过终端/外壳:
git checkout origin/feature/<featurename>
git merge --squash origin/feature/<featurename>
这不会提交,允许您先查看它。
然后提交,并从这个新分支完成功能,并删除/忽略旧分支(你在上面进行开发的那个)。
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
pull
。所有其他响应似乎都假设自从您上次在远程发布分支上闲逛以来没有任何变化......
如果您收到错误:由于您有未合并的文件,因此无法提交。
git checkout master
git merge --squash bugfix
git add .
git commit -m "Message"
修复了所有冲突文件
git add .
你也可以使用
git add [filename]
您的功能分支已完成并准备提交到 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 到您的功能分支的提交次数。吉特照顾*
假设您进行多次提交的分支的名称称为 bugfix/123,并且您想要压缩这些提交。首先,从开发中创建一个新分支(或任何您的存储库的名称)。假设新分支的名称为 bugfix/123_up。在 git bash 中签出这个分支 -
获取
git checkout bugfix/123_up
git 合并错误修复/123 --squash
git commit -m "你的信息"
git push origin bugfix/123_up
现在这个分支将只有一个提交,其中包含您的所有更改。
利用
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
可以是您喜欢的其他遥控器。
不定期副业成功案例分享
git commit
(不带-m
参数),您将可以修改包含您压缩的所有提交消息的草稿提交消息。git commit --amend -m '...'
来实现相同的目的。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
允许您在当前分支之上创建单个提交,其效果与合并另一个分支相同。但它不会产生合并记录,这意味着您的拉取请求结果不会有任何变化,但不会被标记为已合并!因此,您只需要删除该分支即可完成。