Based on my (possibly limited) understanding of syncing process, I would propose following implementation:

1) Instead of storing value of config variable directly, the value would be stored in artefact (with additional information like parent artefact) and the ID of artefact would be stored in config variable.

2) On config push/pull, the "pushing side" would say "I'm using artefact with ID X for this config variable". The "pulling side" would then compare ancestors of the pushing side artefact and its own artefact for this variable and determine which is newer. In case of conflict, the configuration would stay unchanged but user would be warned and given some tool to resolve the conflict on "pulling side" repository (use local, use remote, "merge" and edit).