Bot*_*ten 3 git version-control
如果我在一个标准的主要功能工作流程中工作,那么将一个功能分支压缩到master并将其挑选到master中之间的区别是什么?
示例分支:
m1 -- m2 master
\-- f1 -- f2 feature
Run Code Online (Sandbox Code Playgroud)
我认为两者都有相同的输出即
m1 -- m2 -- -- -- m3 master
\-- f1 -- f2 feature
Run Code Online (Sandbox Code Playgroud)
小智 8
merge --squash
和之间有两个重要的区别cherry-pick
:
也就是说,如果您遇到上述情况并且您(上master
)执行了a git cherry-pick feature
,则生成的分支将如下所示:
m1 -- m2 -- f2’ master
\-- f1 -- f2 feature
Run Code Online (Sandbox Code Playgroud)
这意味着更改f1
不会出现在主人f2
身上(如果取决于他们,挑选樱桃可能会失败.
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
Run Code Online (Sandbox Code Playgroud)
这里重要的一点是"不更新HEAD",这是git -代表"我没有提交我所做的事情".事实上,第二句话更加方便用户......
如果您希望逐步开发(通过提交导致解决方案的所有小步骤,例如在每次成功的测试运行后提交,此功能都很方便.在这种情况下,您的历史可能会被数百个单行提交.所以最好不时地进行merge-squash-commit(例如,在你开发了一点功能之后).