9

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

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

是否可以在不丢失所有已经完成的冲突解决工作的情况下将合并提交更改(rebase interractive?)合并提交到“壁球合并”提交(即没有触发新的合并,因为我没有启用该rerere工具)?

4

3 回答 3

11

如果你已经合并了 and with git merge( --no-ff) 并且想把它变成等价的 a git merge --squash,你可以使用下面的过程(假设合并提交是分支上最近的提交):

  • 确保您已签出受影响的分支。
  • git reset --hard HEAD~1 (在合并之前将分支重置为提交。别担心,它不会丢失!)
  • git cherry-pick -m 1 HEAD@{1} (Cherry-选择您刚刚删除的合并提交作为正常提交,基于它与此分支之间的差异)

除了保留合并期间完成的任何冲突解决方案外,它还将保留原始合并提交信息(消息、作者、日期等),这对于修复来自生成一致提交消息的 BitBucket 等工具的不正确合并非常有用。

我们有一个仅限 squash-commit 的策略,所以每当有人不小心从 BitBucket PR 中选择了正常的合并选项时,我都会偶尔使用它。或者单击 Slack BitBucket 机器人上令人沮丧的诱人“合并”按钮,它不会让您选择合并策略......

于 2020-04-04T13:30:09.693 回答
7

也许git rebase --preserve-merges对你有用。

这里详细回答了这样做时发生的事情:

git 的“rebase --preserve-merges”到底做了什么(为什么?)

请原谅我不喜欢从那里复制和粘贴。

于 2013-10-14T09:58:56.683 回答
1

我遇到了类似的问题,并且能够通过简单地重置并重新提交更改来创建压缩提交。

起始布局:

*   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 add 。git commit -m "Squash commit" 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
于 2018-12-15T00:48:11.627 回答