I currently run a site where every 6-12 months users Groups (OG) will change. To help me, I use the Profile2 module, it makes dynamically changing user info such as OG memberships simple. If you're not already using it, have a read of the handbook.
The way I have solved the issue you have addressed is to have a spreadsheet of all the users who have changed groups, run a simple code on my spreadsheet to edit the "groups" column of the users to what they will now be, (you can simply cross reference another sheet, say the enrollment sheet for that class, and if the username or student ID appears there, put that class ID into the group column in the sheet), and when the spreadsheet is complete, simply export as a csv and then run an import through the Feeds module. This gives you the option to update the existing user information, and you have all of the old spreadsheets as an "archive". Alternatively, you could take a snapshot of the tables database, keep this in an archive, and run simple SQL Queries to update the groups of a user.
Let me know if you need more information, if you choose to approach it this way!