我合并了一个长期存在的分支,由于冲突的解决,我花了很多时间来完成合并。
我发现我无法使用git-svn
发布我的工作:git svn rebase
将重新绑定合并分支的所有提交,而不是提交一个单独的合并提交。我发现git merge --squash
有点太晚了......
是否有可能将合并提交(rebase interractive?)更改为“squash merge”提交而不会丢失已经完成的所有冲突解决工作(即没有触发新的合并,因为我没有启用rerere
工具)?
答案 0 :(得分:7)
也许git rebase --preserve-merges
适合你。
这里详细解答了这样做的原因:
What exactly does git's “rebase --preserve-merges” do (and why?)
请道歉,我不喜欢从那里复制和粘贴。
答案 1 :(得分:1)
如果您已经合并并与git merge
(--no-ff
)合并,并想将其转换为与git merge --squash
等效的文件,则可以使用以下过程(假设合并提交是分支上的最新提交):
git reset --hard HEAD~1
(将分支重置为合并前的提交。不用担心,它不会丢失!) git cherry-pick -m 1 HEAD@{1}
(根据您与该分支之间的差异,点选刚刚删除的合并提交作为普通提交) 除了保留在合并过程中完成的所有冲突解决方案外,它还将保留原始的合并提交信息(消息,作者,日期等),这对于从可生成一致提交的BitBucket等工具修复不正确的合并非常有用。消息。
我们有一个仅压区提交策略,因此每当有人不小心从BitBucket PR中选择正常的合并选项时,我都会偶尔使用它。或单击Slack BitBucket机器人上令人沮丧且诱人的“合并”按钮,该按钮无法选择合并策略...
答案 2 :(得分:0)
我遇到了类似的问题,并且能够通过简单地重置并重新提交更改来创建压缩提交。
开始布局:
* 06074985 (HEAD -> test1) Merge branch 'test2' into test1
|\
| * eb2aa088 (test2) test2 commit
* | c83180c8 test1 commit
|/
* b6628265 (master) base commit
git命令: git branch temp(所以我不会丢失合并提交) git reset HEAD〜1 git添加 git commit -m“压榨提交” git diff temp(只是为了确保没有任何变化)
最终版式:
* 5e229615 (HEAD -> test1) squash commit
| * 06074985 (temp) Merge branch 'test2' into test1
| |\
|/ /
| * eb2aa088 (test2) test2 commit
* | c83180c8 test1 commit
|/
* b6628265 (master) base commit