Thanks Astrotronic, I know this BP Diff tool, but it is read-only and has no merge functionality. And I’m going to try your recommended MergeAssist.
In addition, I found that the TextAssetCommandlet in Unreal can convert asset to text, but it can not directly convert text back to the asset. Then I readed the code of it, I thought I can create a new Commandlet to convert text to the asset, the key is to use this code:
// read .utxt file
UPackage* Package = nullptr;
Package = LoadPackage(nullptr, *SourceLongPackageName, LOAD_None);
// write .uasset file
SavePackageHelper(Package, *DesFilename, RF_Standalone, GWarn, nullptr, SAVE_KeepGUID);