Each project has different versions and components and therefore when moving issues between projects the versions and components will always be changed. We can make this option a bit more smart by letting JIRA check the version name and then change the versions and components based on name if the retain checkbox has been set.
This gets tricky if more than one version/component has been selected on the issue, and a match is found for one of the selected versions/components. In this case should we:
a) remove the version/component that does not have a version/component with the same name in the destination project
b) remove the invalid version/component and replace it with the option entered by the user. In this case the values that do have a matching mapping in the destination project based on name will be kept
c) completely replace the values with the ones entered during move.