2013-08-22 68 views
2

我已经和一个小团队一起工作,使用'合并工作流程',最近我们根据Sandofsky's article切换到了'rebase工作流程'。git merge --no-ff和git merge有什么区别--squash

我们目前的工作流程:

  1. git的结帐大师,混帐拉原点主
  2. git的结帐-b feature_branch,做了一些工作,git的承诺-am “味精特性分支”
  3. git的结帐master,git pull origin master,git rebase master feature_branch
  4. git checkout master,git merge --squash
  5. git commit -am“msg for master branch”,git push origin master

重新绑定特征分支后,我们将其合并到我们的主分支中。如果我们用--no-ff代替,会发生什么? git merge --squashgit merge --no-ff之间的区别是什么?

+0

请参阅http://stackoverflow.com/q/11983749/1885037有一个很好的解释。 – kaveish

+0

['''--squash \'和''''''''''''''''''''''''''''''可能有重复的地方(https://stackoverflow.com/questions/11983749/what-are -the-差异-壁球间 - 和 - 无-FF-没有提交) – rds

回答

2

--squash创建所有合并的变化(这南瓜整个合并的分支的历史进入一个提交)提交。 --no-ff也在分支中合并,创建合并提交并保留合并分支的整个历史记录。

2

git merge --squash创建一个提交,它将应用所有适用的更改应用于正常merge。因此,它可以在单个提交中将所有提交给分支的提交融合到中。

git merge --no-ff防止快进 - 如果源和目标没有发散,只是将分支指针移动到较新的提交的操作。所以,使用--no-ff你保证你会有一个新的提交,其父母将是您当前的HEADfeature_branch头。

当你log这两种情况下,在第一个只会看到提交的单行线,每一个是feature_branch消化,而在第二个,你会看到很多后果的,每一个feature_branch,并且再次加入master

由于git merge --squash生成一个新的基础上,feature_branch那些承诺,它们是不同的提交,所以你可以有麻烦,如果你独自一人发表feature_branch - 比方说,你可以不git merge --squash feature_branchgit多次理解它,但你必须冲突。

0

最大的区别在于你的分支历史。使用--squash,您将拥有线性分支历史记录,其中分支上的每个提交都包含该提交的合并所执行的所有更改。使用--no-ff,你将有一个不同的分支历史记录,合并提交显示两个分支与多个父母一起出现的位置,父提交将包含所做的实际更改。个人而言,我更喜欢使用--squash方法,因为它可以更容易地识别更改的来源(因为更改是在实际压缩的提交中,而不是父提交)。缺点是它是一个独特的提交而不是提交历史记录,所以如果您继续在该分支上开发并进行另一个压缩提交,您将获得另一个提交,其中包含该分支的所有更改历史记录。这可以确定更加困难的变化来自哪里,因为在两个不同的提交中可能会出现相同的变化。解决这个问题的方法是在你做一个壁球提交之后删除这个分支,并且任何改变或者改进都应该放在一个新的分支之外,这个分支包含其历史上的壁球提交。

相关问题