我目前正在进行一个开发过程,我有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- ...
谢谢你的帮助!
答案 0 :(得分:2)
更新 - 重新阅读您的帖子,我意识到我完全错过了merge --squash
问题...实际上我所描述的rebase
方法基本上与执行{merge --squash
方法相同{1}},区别在于它更容易重复。 (嗯,我和--squash
并不知道,因为我是一个n00b。)
无论如何,你对做merge --squash
的关注是分支"基本上分歧了#34;。那是半真的;如果你这样做,那么D
和d
提交之间就没有git祖先链接(或者通过下面的概述进行重新定位)。但是,只要您跟踪 wip
已被压缩到dev
的程度,它就不会使任何一个分支无用 - 他们的内容< / em>没有分歧,只有拓扑。 (这就是为什么移动代码来代表您的上一个--squash
或rebase
可以让您免于麻烦。)
但是如果你想保持拓扑关系,那么--no-ff
合并就是要走的路。问题似乎是你喜欢一些让D
知道它来自d
的事情,以及一些关于它不知道的事情;因此,您必须决定您应该选择哪种方式。
如果它知道,那么例如默认情况下log
将显示更细粒度的历史记录(但是使用正确的选项可以覆盖它)。如果它不知道,那么未来对简单merge
的尝试将使git交叉,你必须跟踪&#34;真实&#34;上游(内容方面)您自己,例如下面示例中的rebaseUpstream
标记。
嗯,你的文字和你的照片并没有完全相同。
图片就是通过与--no-ff
选项合并而获得的图片。因此,当dev
位于A
且wip
位于d
时,您将合并到dev
创建D
- 一个提交,其中{ {1}}代表您在dev
上b
,c
和d
所做的一切。
现在您可能认为我错了,因为如果您从wip
执行git log
,您仍然可以看到dev
,b
和{{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
现在您已进入待办事项列表编辑器,因此请将wip
和d
的说明从git checkout -b rebaseTip
git rebase --interactive --onto master rebaseUpstream
更改为c
,然后让&#39;呃。当然,您可以编辑压缩的提交消息。
现在,您有两条开发线,指向d
- 一条只有pick
,一条有squash
,dev
和D
。接下来,我们需要更新b
。
c
现在麻烦的是,git并不知道d
和dev
有任何关系。如果在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
git commname d-hash h-hash