W dniu 10.10.2016 o 19:52, Paul Smith pisze: > On Mon, 2016-10-10 at 10:19 +0000, Eduard Egorov wrote: >> # ~/gitbuild/git-2.10.1/git merge -s subtree --squash ceph_ansible >> >> Can somebody confirm this please? Doesn't "merge -s subtree" really >> merges branches? > > I think possibly you're not fully understanding what the --squash flag > does... that's what's causing your issue here, not the "-s" option. > > A squash merge takes the commits that would be merged from the origin > branch and squashes them into a single patch and applies them to the > current branch as a new commit... but this new commit is not a merge > commit (that is, when you look at it with "git show" etc. the commit > will have only one parent, not two--or more--parents like a normal merge > commit). > > Basically, it's syntactic sugar for a diff plus patch operation plus > some Git goodness wrapped around it to make it easier to use. Actually this is full merge + commit surgery (as if you did merge with --no-commit, then deleted MERGE_HEAD); the state of worktree is as if it were after a merge. > > But ultimately once you're done, Git has no idea that this new commit > has any relationship whatsoever to the origin branch. So the next time > you merge, Git doesn't know that there was a previous merge and it will > try to merge everything from scratch rather than starting at the > previous common merge point. > > So either you'll have to use a normal, non-squash merge, or else you'll > have to tell Git by hand what the previous common merge point was (as > Jeff King's excellent email suggests). Or else, you'll have to live > with this behavior. The `git subtree` command (from contrib) allows yet another way: it squashes *history* of merged subproject (as if with interactive rebase 'squash'), then merges this squash commit. Now I know why this feature is here... -- Jakub Narębski