The rules for push are simple.

Every square pushed must be adjacent to, and further away than the immediately previous square the pushed character is pushed from.

The rules for pull are simple.

Every square pulled must be adjacent to, and closer than the immediately previous square the pushed character is pulled from.

You can push like any of these:

Code:
....4........
.....3.......
......2......
.......1.....
..4...*......
...3.1a......
....2..b.....
......c......
.....d.......
where `*` is the "source" of the push.