Isn't this what git is for?