Resolve axis independently of each other, and rather than place your character back at its original location, place them at an appropriate location based on where the collision took place. Most ray casting implementations will return you a "t" value if not an actual vector.
Identify this location, and then place your character at something such as:
: (dirVector * t) - dirVector * charRadius;
dirVector = normalized direction from current pos to target pos,
t = value returned by raycast indicating the intersection point of the ray (scalar),
charRadius = radius of character capsule/box/whatever
This is just a rough idea, that will place your character at a location far enough from the point of collision so that you arent clipping into the wall.
General idea, you will have to adapt for yourself of course.