如何随着时间的推移重复合并分支?

时间:2016-11-04 19:33:51

标签: git

我目前正在进行一个开发过程,我有3个分支: dev wip

dev 分支基本上是 master 的功能分支。 wip 分支是 dev 的每日更新分支。我使用 wip 分支每天提交我的工作并与远程服务器同步,以便我可以在另一个位置的另一台计算机上继续工作。

wip 分支在我有足够的工作量之前可能会获得3或4次提交,我想要压缩并且只进行1次提交。由于 wip 分支每天被推送到远程,我不能只用rebase来压缩提交。相反,我想合并它们并将它们压缩到 dev 分支上的一个提交中。然后我想继续开发 wip 分支。然后重复这些无限期合并和挤压的步骤。

我该怎么做?

我尝试使用从 wip dev 的合并 - 但是我认为这使得我的 dev 分支无用,因为压缩了提交不与 wip 分支共享祖先,因此这两个分支基本上存在分歧。

合并是否更好--no-ff所以我可以继续开发 wip ?或者我应该进行快速合并然后交互式重新设置 dev 分支以压缩提交?

这是我想要的照片:

dev -A----------D----------H- ...
     |         /          /
wip -A--b--c--d--e--f--g--h- ...

谢谢你的帮助!

2 个答案:

答案 0 :(得分:2)

更新 - 重新阅读您的帖子,我意识到我完全错过了merge --squash问题...实际上我所描述的rebase方法基本上与执行{merge --squash方法相同{1}},区别在于它更容易重复。 (嗯,我和--squash并不知道,因为我是一个n00b。)

无论如何,你对做merge --squash的关注是分支&#34;基本上分歧了#34;。那是半真的;如果你这样做,那么Dd提交之间就没有git祖先链接(或者通过下面的概述进行重新定位)。但是,只要您跟踪 wip已被压缩到dev 的程度,它就不会使任何一个分支无用 - 他们的内容< / em>没有分歧,只有拓扑。 (这就是为什么移动代码来代表您的上一个--squashrebase可以让您免于麻烦。)

但是如果你想保持拓扑关系,那么--no-ff合并就是要走的路。问题似乎是你喜欢一些D知道它来自d的事情,以及一些关于它不知道的事情;因此,您必须决定您应该选择哪种方式。

如果它知道,那么例如默认情况下log将显示更细粒度的历史记录(但是使用正确的选项可以覆盖它)。如果它不知道,那么未来对简单merge的尝试将使git交叉,你必须跟踪&#34;真实&#34;上游(内容方面)您自己,例如下面示例中的rebaseUpstream标记。

嗯,你的文字和你的照片并没有完全相同。

图片就是通过与--no-ff选项合并而获得的图片。因此,当dev位于Awip位于d时,您将合并到dev创建D - 一个提交,其中{ {1}}代表您在devbcd所做的一切。

现在您可能认为我错了,因为如果您从wip执行git log,您仍然可以看到devb和{{1}作为单独的提交。这是因为git试图帮助您完全理解c的历史记录,为了防止它,您可以d D git log选项(这样它只会看起来&# 34; up&#34; --first-parent分支。在这种情况下,您需要确保您的合并提交具有良好的提交消息。

但是你所写的你想要的是不同的东西 - 也可行,但有点毛茸茸。如果你做了壁球和篮板,dev不会是D的孩子 - 那就是为什么我说你的照片显示合并。

使其与d一起使用的技巧是要了解rebase 不会销毁提交,即使在正常使用情况下它看起来好像也是如此。你可以看到它没有通过让两个分支指向同一个提交,并且对其中一个进行rebase。事实上,你可以做你所要求的事情。

但请注意:疯狂就是这样。

让我们回到你的图表。开始时,您在{A}和rebase处都有{标记',因为我们总是想知道dev已经有多少{{1} }}

wip

现在,根据您所需的工作流程完成一些工作,直到wip位于dev。然后

git tag rebaseUpstream

现在您已进入待办事项列表编辑器,因此请将wipd的说明从git checkout -b rebaseTip git rebase --interactive --onto master rebaseUpstream 更改为c,然后让&#39;呃。当然,您可以编辑压缩的提交消息。

现在,您有两条开发线,指向d - 一条只有pick,一条有squashdevD。接下来,我们需要更新b

c

现在麻烦的是,git并不知道ddev有任何关系。如果在git checkout dev git merge rebaseTip git branch --delete rebaseTip 上完成,则表示D或类似的正面将显示您希望的内容 - 无需额外选项。但坏消息是,如果你不小心,你会忘记d git log的{​​{1}}。为了降低这种风险

dev

现在,您可以在wip分支上恢复工作流程,并根据需要重复整个过程。

答案 1 :(得分:0)

解决此问题的一个可能方法是在d和h提交之间进行diff补丁,将其应用于本地主分支,将其提交为H并将H推送到master。

git diff d-hash..h-hash > newcommit.patch

git checkout master

git am -p < newcommit.patch

git commit -a -m "Implement H"

git push
  • 你可以把它写成shell / ruby​​ / phyton脚本并保存为接受两个参数的git-commname(在user / bin中)(例如d-hash,h-hash)并将其称为
      

    git commname d-hash h-hash