@Override
	public void merge(TaskMonitor monitor) {

		mergeManager.setInProgress(MEMORY_PHASE);
		this.currentMonitor = monitor;
		int transactionID = programs[RESULT].startTransaction("Merge Memory");
		boolean commit = false;

		try {
			int numBlocks = mems[MY].getBlocks().length;
			monitor.initialize(numBlocks);

			// first check image base
//			if (isImageBaseConflict()) {
//				monitor.setMaximum(mems[MY].getBlocks().length+1);
//				++conflictCount;
//				handleImageBaseConflict();
//			}

			for (int i = 0; i < myBlocks.length; i++) {
				mergeManager.updateProgress((int) ((float) (100 / numBlocks) * i),
					"Merging memory block: " + myBlocks[i].getName());
				processBlockChanges(i);
			}
			mergeManager.updateProgress(100, "Merging Memory...");
			processConflicts();
			commit = true;

		}
		catch (CancelledException e) {
		}
		finally {
			programs[RESULT].endTransaction(transactionID, commit);
		}
		mergeManager.setCompleted(MEMORY_PHASE);
	}
Constructor
@param mergeManager merge manager
@param resultProgram program where changes will be applied to
@param myProgram source program with changes that will be applied to
result program
@param originalProgram original program that was checked out
@param latestProgram latest program that was checked in; the result
program and latest program are initially identical
Ghidra/Features/Base/src/main/java/ghidra/app/merge/memory/MemoryMergeManager.java