If your host is a Windows or you can access VHD files from a windows there is a trick to MERGE all changes into parent, grand-parent, etc.
It is using DiskPart tool and the two commands:
select vdisk file="whatever your file is, with full path"
merge vdisk depth=#
Where # is the number of hierarchy levels you want to move, 1 for dirent parent, 2 for grand parent, etc.
It does it in-place, much less time consuming than cloning, etc.
Remember, after merging all intermediate VHDs can be deleted (it does not delete them for you) and do not forget to attach into VirtualBox that parent where you merged.
Example:
Disk3.vhd is child of Disk2.vhd, Disk2.vhd is child of Disk1.vhd
If you want on Disk1.vhd all changes of Disk3.vhd just use depth=2
and select Disk3.vhd.
If you want on Disk1.vhd all changes of Disk2.vhd just use depth=1
select Disk3.vhd.
Also remember there is no need for ugly VirtualBox Snapshots, you can use DiskPart create vdisk command to create a differencing disk from an existing one (that can also be a differencing disk, etc), also can create a huge tree.
For all the rest: The poster is using VHD (not VDI) so can use native tools like DiskPart and Disk Managment to access that disks out of the Guest (on the Host, if Host is Windows).
For you, the poster: Remember to allways have a full BackUp prior to Merge, VirtualBox clone does not work in place, it creates a new file (copy on write), but DiskPart merge works in place (modify the file, do not create a new one).
Hope that can give another different aproach since VHD/VHDX is in use (not valid for VMDK, VDI, etc, only for Windows Host).
Note: Windows 7 and Up, XP and Vista can mount VHD with an external M$ tool but DiskPart has no VHD support on XP & Vista... all this also works on Windows HOME editions (7 and Up), no need for a SERVER edition.