The mechanism for branch migration differs between prokaryotes and eukaryotes.
Open X structure of a Holliday junction. RuvA binds to the DNA and fits in between the double strands on all four sides. RuvA also has a domain that fits inside the centre of the junction.
The mechanism for prokaryotic branch migration has been studied many times in Escherichia coli. In E. coli, the proteins RuvA and RuvB come together and form a complex that facilitates the process in a number of ways. RuvA is a tetramer and binds to the DNA at the Holliday junction when it is in the open X form. The protein binds in a way that the DNA entering/departing the junction is still free to rotate and slide through. RuvA has a domain with acidic amino acid residues that interfere with the base pairs in the centre of the junction. This forces the base pairs apart so that they can re-anneal with base pairs on the homologous strands.
In order for migration to occur, RuvA must be associated with RuvB and ATP. RuvB has the ability to hydrolyze ATP, driving the movement of the branch point. RuvB is a hexamer with helicase activity, and also binds the DNA. As ATP is hydrolyzed, RuvB rotates the recombined strands while pulling them out of the junction, but does not separate the strands as helicase would.
The final step in branch migration is called resolution and requires the protein RuvC. The protein is a dimer, and will bind to the Holliday junction when it takes on the stacked X form. The protein has endonuclease activity, and cleaves the strands at exactly the same time. The cleavage is symmetrical, and gives two recombined DNA molecules with single stranded breaks. The breaks are then ligated together to complete the process.
The eukaryotic mechanism is much more complex involving different and additional proteins, but follows the same general path. Rad54, a highly conserved eukaryotic protein, is reported to oligomerize on Holliday junctions to promote branch migration.