The reason you can not simply "amend" an arbitrary commit is that commits are immutable. When you amend a commit, it actually replaces the current commit with another and moves your branch to the new commit. The commit with the old message, author name, etc. is still there in the history until you clean it up:
Before:
master
|
v
A -- B -- C
After:
master
|
v
A -- B -- C'
\
\- C
To simulate "amending" an arbitrary commit, you would have to rewrite not only that commit, but the entire history after it, since a commit includes its parents as part of its immutable data:
Before:
master
|
v
A -- B -- C
After:
master
|
v
A -- B' -- C'
\
\- B --- C
You can do this by creating a branch on the commit you are interested in, amending it, and rebasing the range of commits following the original to the tip of your original branch onto the new branch. Here is an example showing what you are after:
Start:
master
|
v
A -- B -- C -- D
New Branch:
master
|
v
A -- B -- C -- D
^
|
temp
Amend:
master
|
v
A -- B -- C -- D
\
\- B'
^
|
temp
Rebase:
A -- B -- C -- D
\
\- B' -- C' -- D'
^ ^
| |
temp master
Cleanup:
A -- B -- C -- D
\
\- B' -- C' -- D'
^
|
master
This is pretty much exactly what interactive rebase does when you only modify a single commit, by the way, except without the explicit temporary branch.