将合并提交重写为squash合并提交

时间:2013-10-04 10:12:31

标签: git merge git-svn squash

我合并了一个长期存在的分支,由于冲突的解决,我花了很多时间来完成合并。

我发现我无法使用git-svn发布我的工作:git svn rebase将重新绑定合并分支的所有提交,而不是提交一个单独的合并提交。我发现git merge --squash有点太晚了......

是否有可能将合并提交(rebase interractive?)更改为“squash merge”提交而不会丢失已经完成的所有冲突解决工作(即没有触发新的合并,因为我没有启用rerere工具)?

3 个答案:

答案 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