Probably rebasing more than anything. cherry-picking is a messier, yet easier way to get the same history, you just need to clean up after yourself.
Merge commits are useful, in my opinion, if there was significant work done to get two branches to "align" with each other. Otherwise, just rebase your work for a cleaner history.
So in short:
Merging: More "accurate" history about the work done to bring the work into the main/dev branch, yet messier.
Rebasing/cherry-picking: cleaner history, potentially at the expense of context and "accurate" history about the work done to bring in code to the main/dev branch.
I think there's two different discussions here. One about cherry-picking for back-branch releases, one about development for the new version.
Re back-branches:
It's not particularly practical to use merges from/to stable branches. It may sound nice at first, but there's enough fixes that don't apply to all versions (because a feature didn't exist yet, because refactorings made bugs "accidentally" disappear, ...) that merging either to or from back-branches leads to very very messy merges, where the merge commit has to back out changes and such. I don't know of any larger project that successfully uses merges to merge to/from stable branches. So yes, it's just cherry-picking.
Re development:
The case here is a lot less clear. The project used CVS for a long while, and during the migration it was decided to not make the migration harder by changing workflows even more significantly than just CVS->git. So the, enforced, policy became that no merge commits are to appear. It hasn't become a significant problem since, so that policy hasn't evolved at this point. Given the relatively small number of active committers in the project, and the fact that commits in the project are expected to "stand on their own" (i.e. are complete and working), rebasing changes before committing them isn't a problem. Several contributors, including committers, do their development in separate repositories / branches, however. But usually the history there is messy enough that they wouldn't be merged anyway. I think merging is more of a benefit when you have a more hierarchically organized project like the kernel, with subsystem maintainers that aggregate a large volume of changes, which then get pushed to Linus, who then integrates all of those.
Hope that roughly answers your question? If not, feel free to ask more about specifics.
(For context: I'm one of the committers in the project)
Author: Tom Lane <tgl@sss.pgh.pa.us>
Branch: master [9d4ca0131] 2017-01-26 12:18:07 -0500
Branch: REL9_6_STABLE [2dfc12647] 2017-01-26 12:17:47 -0500
Branch: REL9_5_STABLE [423ad86f4] 2017-01-26 12:17:47 -0500
Branch: REL9_4_STABLE [2c1976a6c] 2017-01-26 12:17:47 -0500
Branch: REL9_3_STABLE [2e024f83b] 2017-01-26 12:17:47 -0500
Branch: REL9_2_STABLE [fe6120f9b] 2017-01-26 12:17:47 -0500
Ensure that a tsquery like '!foo' matches empty tsvectors.
!foo means "the tsvector does not contain foo", and therefore it should
match an empty tsvector. ts_match_vq() overenthusiastically supposed
that an empty tsvector could never match any query, so it forcibly
returned FALSE, the wrong answer. Remove the premature optimization.
Our behavior on this point was inconsistent, because while seqscans and
GIST index searches both failed to match empty tsvectors, GIN index
searches would find them, since GIN scans don't rely on ts_match_vq().
That makes this certainly a bug, not a debatable definition disagreement,
so back-patch to all supported branches.
Report and diagnosis by Tom Dunstan (bug #14515); added test cases by me.
Discussion: https://postgr.es/m/20170126025524.1434.97828@wrigleys.postgresql.org
This is fairly easy to do, if you enforce a policy of requiring cherry-picks to reference the original commit (i.e. requiring -x in the git cherry-pick command).
You can the grep the log for all the commits which contain the commit ID you are interested in (and any that mention those commits).
That's not always that helpful, because you often will want to cherry-pick from another branch than master. E.g. when cherry-picking a change from master into 9.6, 9.5, 9.4, 9.3, 9.2 it'll e.g. often be easier to cherry-pick from 9.3 into 9.2, rather than master into 9.2 (due to conflicts increasing the further back you go). Obviously you could do that manually or script it regardless. But the current heuristics have worked without problems for years, so there seems little reason to change things ;)
It can tell that the 9.4 and 9.5 patches are identical to each other, and that the 9.6 and master patches are also identical to each other. But there were differences between the two groups.
Even if fixes always applied cleanly to back branches, git doesn't provide a way to represent a 'backpatch'.
That is, once you've committed a patch to the the current mainline, there's no official way to indicate that a commit on an older branch is "the same".
That's a shame, as there would a natural way to indicate this in git's 'graph', if only you were allowed to tell it about additional parents after a commit is made. But that's not an option as long as a commit's parents are part of its hashed data.
(If you could add parents, you'd make a new commit by applying the patch to the branchpoint, merge that into the release branch, and also add it as a new parent to the original commit, turning the original commit into a merge.)
Because git log --graph implies "--topo-order" and I didn't want that:
$ git help log
--graph
[...]
This implies the --topo-order option by default
Without "--date-order" it looks like this:
$ git log --graph --all --decorate --oneline
* 86d911ec0f (HEAD -> master, origin/master, origin/HEAD) Allow index AMs to...
* 7c5d8c16e1 Add explicit ORDER BY to a few tests that exercise hash-join code.
* 8f93bd8512 Fix roundoff problems in float8_timestamptz() and make_interval().
* a507b86900 Add WAL consistency checking facility.
* 115cb31597 Fix relcache leaks in get_object_address_publication_rel()
* e35bbea7dd doc: Some improvements in CREATE SUBSCRIPTION ref page
* c3c4f6e174 Revise the way the element allocator for a simplehash is specified.
And 960 more commits before finally getting to this one... :-)
22 comments
[ 5.2 ms ] story [ 91.0 ms ] threadhttps://webcache.googleusercontent.com/search?q=cache:CDUXYn...
Merge commits are useful, in my opinion, if there was significant work done to get two branches to "align" with each other. Otherwise, just rebase your work for a cleaner history.
So in short:
Merging: More "accurate" history about the work done to bring the work into the main/dev branch, yet messier.
Rebasing/cherry-picking: cleaner history, potentially at the expense of context and "accurate" history about the work done to bring in code to the main/dev branch.
Re back-branches: It's not particularly practical to use merges from/to stable branches. It may sound nice at first, but there's enough fixes that don't apply to all versions (because a feature didn't exist yet, because refactorings made bugs "accidentally" disappear, ...) that merging either to or from back-branches leads to very very messy merges, where the merge commit has to back out changes and such. I don't know of any larger project that successfully uses merges to merge to/from stable branches. So yes, it's just cherry-picking.
Re development: The case here is a lot less clear. The project used CVS for a long while, and during the migration it was decided to not make the migration harder by changing workflows even more significantly than just CVS->git. So the, enforced, policy became that no merge commits are to appear. It hasn't become a significant problem since, so that policy hasn't evolved at this point. Given the relatively small number of active committers in the project, and the fact that commits in the project are expected to "stand on their own" (i.e. are complete and working), rebasing changes before committing them isn't a problem. Several contributors, including committers, do their development in separate repositories / branches, however. But usually the history there is messy enough that they wouldn't be merged anyway. I think merging is more of a benefit when you have a more hierarchically organized project like the kernel, with subsystem maintainers that aggregate a large volume of changes, which then get pushed to Linus, who then integrates all of those.
Hope that roughly answers your question? If not, feel free to ask more about specifics.
(For context: I'm one of the committers in the project)
You can the grep the log for all the commits which contain the commit ID you are interested in (and any that mention those commits).
Here are the four commits with "Fix roundoff problems in float8_timestamptz() and make_interval()" as their commit message:
And here's what "git patch-id" thinks of them: It can tell that the 9.4 and 9.5 patches are identical to each other, and that the 9.6 and master patches are also identical to each other. But there were differences between the two groups.That is, once you've committed a patch to the the current mainline, there's no official way to indicate that a commit on an older branch is "the same".
That's a shame, as there would a natural way to indicate this in git's 'graph', if only you were allowed to tell it about additional parents after a commit is made. But that's not an option as long as a commit's parents are part of its hashed data.
(If you could add parents, you'd make a new commit by applying the patch to the branchpoint, merge that into the release branch, and also add it as a new parent to the original commit, turning the original commit into a merge.)
Why!?
Folks who are looking for ways to upgrade PostgreSQL without downtime might want to take a look at this setup using pacemaker: https://github.com/gocardless/our-postgresql-setup
http://www.interdb.jp/blog/pgsql/pg_pacemaker_01/ digs into playing with the vagrant box a tiny bit.
EDIT-- ah, found the talk explaining it: https://www.youtube.com/watch?v=SAkNBiZzEX8