About uodo/redo I've implemented something reticently and I'm still not sure about my own implementation...
At work I write a lot of code for 3ds Max/Maya. In those softwares(especially Maya) Every data is stored in some sort of "nodes" as something called as an attribute(or parameter). That is it. The type of attributes in Maya are: floats, int(and booleans and enums masked as ints), reference to other nodes/attributes. An "Attribute" is really just a class that wraps all geters/seters for every type (and stores the animated data for every attribute, if you are interested in animated attributes I could give you more details here).
So using those unified getters setters we can easily record evey change (or if needed create a snapshot of the whole scene/level/..).
So knowing that every data for a node is stored as an attribute, each node gets a callback whenever an attribute is changed. So every node can take those changes in account whenever needed.
Another plus is that you can auto-generate UI for those attributes.
The problem is that that data doesn't directly translates to your "game object", but knowing that usually the data for the editor is usually different from the one used during game.
However a disclaimer - Maya is not a game engine and my experience with this is not professional.