Yes, it's not only possible but in fact pretty trivial. Instead of:
git push <remote name> <branch name>
just run:
git push <remote name> <commit hash>:<branch name>
once for each commit to try pushing, in the appropriate (parent to child) order. For example:
git push origin c01c4fa28a0c864c2d09f8fb43a80c46dce9c7c6:branch
To automate this, assuming your remote is named origin and your branch is named branch and your origin/branch remote-tracking branch is up to date (run git fetch origin if not):
for rev in $(git rev-list --reverse origin/branch..branch)
do
git push origin $rev:branch
done
which is basically a one-liner. Note that this also assumes a more or less linear history. If it's not, add --topo-order to guarantee things, but then you'll need --force and there are various bad ideas occurring here, so that's not the way to go. You'd want to split the pushes to use a temporary branch, or aggregate them at the merge points, perhaps.