How I would do it is record all changes and display the last change to the user. If they "screw up" then simply delete that row and the one before it is restored by default.
Then if you want to keep things clean you can write a script that runs once a month and deletes changes that are 11 changes old or you could do it on time and delete anything older than X months... it depends on your data.
But basically it goes like this.
Table1 (The reference)
fields = rid, and all fields not editable
Table2 (The lookup)
fields = uid, rid, a, b, c, d, e, user_id (of person who made changes), timestamp (datetime of entry)
When someone makes an update you simply insert a new row into Table2
When you grab the data for viewing you just grab the most recent row from Table2
select tbl1.* tbl2.a, tbl2.b, tbl2.c, tbl2.d, tbl2.e
Table1 tbl1 left join Table2 tbl2 on (tbl1.rid = tbl2.rid and tbl2.uid = (select uid from Table2 where rid = THE_ID order by timestamp desc limit 1)