Git Merge简单vs壁球。什么目的?如何跟踪每个功能的一次提交?

时间:2017-02-06 09:35:41

标签: git version-control git-merge git-squash

我不喜欢Git的一件事就是提交的数量。不要误解我,这是一种非常方便的存储(安全)工作的方法,但从长远来看,搜索的粒度太大了。

让我在使用从开发分支的特征分支开发时描述以下场景。

  • Feature1 开发分支并有5次提交
  • Feature2 开发分支并有3次提交
  • Feature3 Feature1 分支,并且有5 + 2次提交。

有三个分支的原因是因为有一个团队正在处理存储库。 Feature3 假设 Feature1 已完成,等待合并到develop中。还有其他用例,但这是最简单的例子。

我的目标是在完成所有功能后对开发进行三次提交。

使用git merge / pull

上述情况很有效。因为实质上两个命令都将提交移动到开发分支中。合并 Feature1 后,开发会引用它的五次提交。当 Feature3 将要合并时,只有最后两次提交将合并到开发

唯一不利的方面是开发获得太多提交。这意味着当合并到所有"噪音"一路走来。因此,我的目标没有实现。

使用git merge with squash

合并 Feature1 时,开发会获得一个新提交,它是所有 Feature1 的聚合。这非常好,因为现在仅使用一次提交跟踪该功能。删除 Feature1 后,所有中间提交都不再可见,从而使跟踪变得更容易。这也与诸如一个pull请求和一个github问题之类的概念相匹配。

Feature3 即将合并时,会出现冲突,问题就会开始。要解决此问题,您需要将开发合并回 feature3 。与冲突。这会导致更改零文件的新提交。现在我们将壁球 Feature3 合并到开发

我的目标已实现,但却有很多微观管理的牺牲。

问题/备注

据我所知,这是git的现实。我读过的一条建议是创建一个包含压缩合并提交的兄弟功能分支。使用同级分支进行拉取请求,因此强制使用每个功能一次提交。这并不能解决在尝试合并其他分支时创建的冲突,尤其是从其他功能分支继承的冲突。

  • 可以在同一个分支内进行内部挤压吗?我不这么认为,但问不会有什么伤害。
  • 我错过了什么?
  • 这是壁球合并的权衡吗?解决可能没有代码更改的冲突?
  • 是否值得追求"每个功能一次提交"概念?
    • 如果没有,那么壁球的目的是什么?谁在使用这个?

我已经使用rebase读取替代方案并在合并后使用重置模拟壁球,但​​据我所知,没有解决合并 feature3 所提到的开销。

2 个答案:

答案 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 AB,我们使用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
  1. 您的流程还可以。
  2. 要压缩提交,第一个(最旧的)应该使用pick,而其他人可以使用squash,这样它将只显示一个提交的分支。如果存在冲突,您可以修改并保存冲突文件,然后使用git add .git rebase --continue
  3. 没有必要,这取决于你最喜欢的。壁球的主要目的是使历史看起来更整洁。