Thought I'd share this here.
https://gist.github.com/williewillus/353c872bcf1a6ace9921189f6100d09a
Skimming over it I see that there have been some (for the better) MCP name changes (BlockSnow -> BlockSnowLayer, BlockSnowBlock -> BlockSnow) and that non-lower-case registry names will now throw an error instead of silently converting it.
Lang files are now json (along with some other changes to the folder structure that are easily automated to update)
Advancements, functions, loot tables, recipes, and structures moved from assets/ to data/.
ALL metadata (magic numbers) is gone. e.g. Tool damage is now handled via NBT. Item variants that used metadata should be flattened (new Item instances); don't NBT hack your way to victory.
Remove your getMetaFromState/getStateFromMeta methods, they are no longer needed.
If you were saving blockstates using registry name + meta, you should now use NBTUtil.read/writeBlockstate. See how Endermen save their carried block for an example.
Worldgen is now its own separate thread(s). This may be a huge issue for some mods, as it will require a check for thread safety.
Block attributes (material or hardness) are now final. This is a bit of a disappointment for me, as while in 1.12 I wasn't fiddling with them, my old (un-updated) Harder Underground did increase the hardness of every shovel-diggable block. And I would like to do that again some day.
There's lots of superinterfaces on world now representing different things you can do (e.g. there's an interface for read-only access to the world). If possible, try using the least specific one. This makes sense to me and I support that notion. It'll probably be tough to get used to, but will be better in the end, as it reduces the reliance on World as a a hard reference and allows for alternate implementations without breaking stuff.
Multiple kinds of air. If you weren't already using IBlockState.isAir, now you have to.