I'm not able to recreate what you describe using the code below:
>>> from py2neo import *
>>> graph = Graph(password="p4ssw0rd")
>>> a = Node(name="Alice")
>>> b = Node(name="Bob")
>>> ab = Relationship(a, "KNOWS", b)
>>> graph.create(ab)
>>> remote(a)._id
1
>>> graph.evaluate("MATCH (n) WHERE id(n) = {x} RETURN n", x=1)
(alice {name:"Alice"})
>>> ab["since"] = 1999
>>> graph.push(ab)
>>> graph.evaluate("MATCH (n) WHERE id(n) = {x} RETURN n", x=1)
(alice {name:"Alice"})
That said, bear in mind that what you describe as pushing a relationship is in fact pushing the entire subgraph consisting of the relationship plus its start and end nodes. Therefore if the local copies of those nodes contain no properties, this will be taken as a signal to update the remote nodes as well by removing the remote properties.
Because of this "entire subgraph update" behaviour, you'll need to make sure that the local copies of your nodes are up-to-date before pushing them. Perhaps by pulling them first. There is no higher-level API operation to just push the relationship and ignore the nodes, these operations work on whole subgraphs. To do otherwise, you'll need to drop into Cypher.