0

我有一个带有提交 a1、a2、a3、a4 的测试分支。我想对主分支进行更改,但只在一次提交而不是四次提交。所以我做了:

git checkout master
git merge -Xtheirs test
git rebase -i a1

squash a4
squash a3
squash a2
pick a1

所以在主分支上,我得到了一个提交 b1,其中包括来自 a1、a2、a3、a4 的更改。第一次完成时,这很好用。然后我继续我的测试分支,添加提交 a5、a6、a7、a8。我签出 master 并再次合并 - 我必须解决奇怪的冲突,因为 a5 是 a4 的延续,因此也是 b1 的延续。请注意,git diff在 a4 和 b1 上没有输出任何差异。然后我试图从 a5 变基,并且发生了更多的冲突。

所以看起来这git rebase不是我需要的。加入提交后,git 将 a4 和 b1 视为具有不同历史的不同提交对象,更糟糕的是甚至在图中的不同位置。

我想要类似的东西:

b0 --- b0
| |
a1 |
| |
a2 |
| |
a3 |
| |
a4 ---- b1
| |
a5 |
| |
a6 |
| |
a7 |
| |
a8 ---- b2
| |   
a9 |
| |
... --- b3

这甚至可能吗?

请注意,我可以为每组提交创建一个分支,即一个用于 a1、a2、a3、a4 的分支,然后与 master 进行合并和变基,并从 b1 为提交 a5、a6、a7、a8 创建另一个分支,然后执行与 master 合并和 rebase 以获得 b2 等等。但这不是我想要的——每天有一个分支是不可取的。我只想有两个分支——一个包含所有提交的测试分支和一个粒度更粗的主分支。这样当我推动主人时,他们就不会看到我所做的每一个小改动。

4

2 回答 2

4

也许您想将--no-ff选项与git merge? 这样,您将始终获得合并提交,而不是 git 对提交进行快进合并。在您的情况下b0b1, ... 将是合并提交。

编辑:不可能在没有合并冲突的情况下在主分支上只提交 b0、b1 提交。但是如果不需要隐藏中间提交,上面是一个很好的选择。一般来说,你要么做rebase和/或cherry-pick并处理冲突,要么推送所有提交对象而不必处理冲突。

于 2012-08-03T20:12:30.937 回答
1

开启时master,您可以git cherry-pick a1..a4将这些新提交压缩到master. 这将使测试分支中的提交保持不变,并让您推送,master这样其他人就不会看到您所做的每一个更改(根据您的要求)

当然,在这种情况下 b1 和 a4 将是两个不同的提交。事实上, b1 和 a4 永远不会是同一个提交。如果您希望图形工具从 a4 指向 b1,则必须使用--no-ffMattias 上面提到的合并。

于 2012-08-04T05:20:36.877 回答