This was sort of handled in this question, but I think your question is better in that it seeks a little more clarity.
In short: Yes, it's normal. Here's a bit of an expanation:
You start out with this in the main repository (where the boxes are changesets):
main: --[E]--[F]--[G]
then you clone to the production server and add a changeset, H, that does the deployment customization. So the deployment repo looks like this:
production: --[E]--[F]--[G]--[H]
and then more work happens on the main repo, adding changesets, I and J, making the main repo look like:
main: --[E]--[F]--[G]--[I]--[J]
which when pulled to production looks like:
production: --[E]--[F]--[G]--[I]--[J]
\
\-[H]
with two heads, which you merge to get:
production: --[E]--[F]--[G]--[I]--[J]
\ \
\-[H]-----[K]
where K is just J plus the changes you originally did in H.
Now more work happens in main, giving:
main: --[E]--[F]--[G]--[I]--[J]--[L]--[M]
which you pull in production giving:
production: --[E]--[F]--[G]--[I]--[J]--[L]--[M]
\ \
\-[H]-----[K]
and then you merge and get:
production: --[E]--[F]--[G]--[I]--[J]--[L]--[M]
\ \ \
\-[H]-----[K]-------[N]
So every time you bring changes in from main, you're doing one merge, and creating one new changeset (this time N).
I think that's okay, and it is "normal".
You can, however, avoid it by using some of the answers in the question I linked to above and there's a new trick you can use to keep modifying the original H's parents (and content) so that it always moves to the end of whatever is the new tip.
The trick is the Rebase Extension and it would yield linear history on production (though you'd still be doing what's essentially a merge to get it). I'm not a fan of it because I don't like changing changesets after they're committed, but since H is never leaving the production box it's okay.
The other answers were mercurial queues and making the production changes live in the dev repo and get triggered by something that's different in the production environment (like the Host: header).