As per EIP-2535 Diamond Standard upgrades are done by calling the diamondCut function to add/replace/remove any number of functions and facets in a single transaction.
Upgrading can be done safely and easily as long as some important rules are followed.
Make sure that an upgrade is atomic, meaning that all changes are done in a single transaction to ensure the diamond does not get into an inconsistent state. This is done by calling diamondCut once with all functions to add/replace/remove.
The diamond and all the facets share the same contract storage address space. Do not corrupt state variables by sticking new state variables in the middle of structs. Do not change the bit size of an existing state variable if that overlaps with an existing state variable.
New state variables can be added to the end of structs.
Existing state variables can have their name changed.