Thanks to the comments and Conner's answer, I think I have this sorted:
In short, everything is correct but potentially confusing because of the difference between the chronological order of the commits and the order that merges have brought the commits into use in the demo branch. If you need to just list commits that represent valid states in your current branch you must use "git log --first-parent ....".
The long:
The current demo branch has been merged with master after 8c4 so 6e4 shows in its correct position in the log when looking at the full log history for the demo branch on github.
When I checkout the 8c4 locally, I'm looking at a demo branch state where 6e4 is NOT yet involved because the merge was after 8c4 so 6e4 does not appear in the log because 6e4 is only in the master branch (even though it was done after 2f7).
I can check 8c4 out because it is a state of the master branch. However, if I do, I am looking at a state of the master branch NOT the demo branch. There is no state of the demo branch where 8c4 was at the head of that branch.
The clearest and best picture for resolving this problem came from gitg (which is in the ubuntu repository "sudo apt-get install gitg" got it for me). Once I'd used that, I found the text output from "git log --oneline --graph" easier to understand).
This is only really confusing when you try to step back through a branch history. If you try to use "git log" you are seeing a list of the commits that affect your current code base but they are not necessarily states that existed in the branch you are on.
If, like me, you need to step back through each state in the life of your branch then (thanks to this question) you need to use the --first-parent parameter to git-log e.g.
(red)~/wk/red $ git log --first-parent --oneline
...
aa83af6 Merge branch 'master' into demo
...
8c4a3ea Changed logos to xxx ones
2f72e3b Added demo.xxx.com allowed domain for RED
...