如果我在一个标准的主功能工作流中工作,那么将一个功能分支挤压到主功能和将其挑选到主功能之间有什么区别?
分支示例:

m1 -- m2                 master
  \-- f1 -- f2           feature

我想两者的输出是一样的
m1 -- m2 -- -- -- m3     master
  \-- f1 -- f2           feature

最佳答案

merge --squashcherry-pick之间有两个重要的区别:
一。采摘樱桃只会移动一次提交
也就是说,如果您有上述情况,并且您(在master上)执行git cherry-pick feature,则生成的分支将如下所示:

m1 -- m2 -- f2’           master
  \-- f1 -- f2           feature

这意味着f1的变化在master上不存在(如果f2依赖于这些变化,樱桃采摘可能会失败)。
2.摘樱桃产生承诺
merge --squash不会立即提交,而是创建所有更改的摘要并使它们准备好提交。这本质上是一个完整分支更改的补丁,与git diff m1..feature显示的一样。
在我的机器上,一个快速的测试给出了这个输出:
$ test git:(master) git merge --squash testbranch
Squash commit -- not updating HEAD
Automatic merge went well; stopped before committing as requested

这里最重要的一点是“不更新头部”,git代表“我没有提交我做过的事情”。第二句话实际上更方便用户使用…
如果您希望逐步开发(通过提交导致解决方案的所有小步骤,例如在每次成功的测试运行后提交),则此功能非常方便。在这种情况下,您的历史记录可能会被成百上千的一行提交弄得一团糟。因此,最好时不时地进行合并压缩提交(例如,在开发了一点功能之后)。

09-04 07:11