我不喜欢Git的一件事就是提交的数量。不要误解我,这是一种非常方便的存储(安全)工作的方法,但从长远来看,搜索的粒度太大了。
让我在使用从开发分支的特征分支开发时描述以下场景。
有三个分支的原因是因为有一个团队正在处理存储库。 Feature3 假设 Feature1 已完成,等待合并到develop中。还有其他用例,但这是最简单的例子。
我的目标是在完成所有功能后对开发进行三次提交。
使用git merge / pull
上述情况很有效。因为实质上两个命令都将提交移动到开发分支中。合并 Feature1 后,开发会引用它的五次提交。当 Feature3 将要合并时,只有最后两次提交将合并到开发。
唯一不利的方面是开发获得太多提交。这意味着当合并到主所有"噪音"一路走来。因此,我的目标没有实现。
使用git merge with squash
合并 Feature1 时,开发会获得一个新提交,它是所有 Feature1 的聚合。这非常好,因为现在仅使用一次提交跟踪该功能。删除 Feature1 后,所有中间提交都不再可见,从而使跟踪变得更容易。这也与诸如一个pull请求和一个github问题之类的概念相匹配。
当 Feature3 即将合并时,会出现冲突,问题就会开始。要解决此问题,您需要将开发合并回 feature3 。与冲突。这会导致更改零文件的新提交。现在我们将壁球 Feature3 合并到开发。
我的目标已实现,但却有很多微观管理的牺牲。
问题/备注
据我所知,这是git的现实。我读过的一条建议是创建一个包含压缩合并提交的兄弟功能分支。使用同级分支进行拉取请求,因此强制使用每个功能一次提交。这并不能解决在尝试合并其他分支时创建的冲突,尤其是从其他功能分支继承的冲突。
我已经使用rebase读取替代方案并在合并后使用重置模拟壁球,但据我所知,没有解决合并 feature3 所提到的开销。
答案 0 :(得分:0)
我确实认为变基是你的解决方案。
如果我理解,以下是你的git结构:
develop
\
A - B - C [feature1]
\
D - E [feature3]
你的问题是,一旦你被压扁并将 feature1 合并到开发,最初的三次提交 feature3 就会引用“&strong” ; t已经存在了。除了 feature1 并不存在之外,您实际上就像以下一样离开。
develop — feature1Merge
\
A - B - C [feature1]
\
D - E [feature3]
因此开发中的 feature1Merge 提交与 feature3 的历史记录中的提交不同。
在这种情况下,如果您尝试将rebase
feature3 重新加入开发,则提交A
B
和{{ 1}}会继续使用它,理论上不应该导致任何问题,因为变化已经在开发,因此git应该快速转发这些提交。显然,这似乎并没有发生。
我建议在这种情况下做C
。
重新登陆
rebase onto
选项允许您重新定义特定提交,而不是整个分支。
为了阻止git尝试在重新定位时使用提交--onto
A
和B
,我们使用C
,它有3个参数:
分支的新基础
分支的当前基础
要转移的分支的名称
在您的情况下,这将是:
--onto
这将检查开发,然后应用{strong> feature3 上的所有提交,因为git rebase --onto develop C feature3
:
C
希望这一切都有意义,尽可能轻松地实现你想要的目标!
答案 1 :(得分:0)
是的,具有如此多提交的git的目的是使每个更改都可跟踪。如果某些提交不重要或者可以在一次提交中记录所有更改,以便查看原因的历史记录,则可以压缩这些提交。
对于你的问题:
1.是的,你可以做一个内部壁球。假设你的git提交历史如下图所示:
K---L---M Feature2
/
A---B---…---C---… develop
\
D---E---F---G---H Feature1
\
I---J Feature3
您可以使用这些步骤来压缩每个分支:
git checkout Feature1
git rebase -i HEAD~5
输入i
pick D squash E squash F squash G squash H
按Esc按钮,然后输入
:wq
git checkout Feature3
git rebase -i HEAD~7
pick D squash E squash F squash G squash H squash I squash J
git rebase Feature1
git checkout Feature2
git rebase -i HEAD~3
pick K squash L squash M
git add .
和git rebase --continue
。