private List<MergeResultModel> MergeExecuteInternal(bool checkInIfSuccess)
        {
            var result = new List<MergeResultModel>();
            var context = Context;
            var tfs = context.TeamProjectCollection;
            var versionControl = tfs.GetService<VersionControlServer>();

            var workspace = _workspace;

            var changesetId = _changeset.ChangesetId;
            var changesetService = _changesetService;
            var changeset = changesetService.GetChangeset(changesetId);
            changeset.Changes = changesetService.GetChanges(changesetId);
            var mergeOption = _mergeOption;
            var workItemStore = tfs.GetService<WorkItemStore>();
            var workItemIds = changeset.AssociatedWorkItems != null
                ? changeset.AssociatedWorkItems.Select(w => w.Id).ToList()
                : new List<int>();

            var mergeInfos = _branches;
            var targetBranches = mergeInfos.Select(m => m.TargetBranch).ToArray();
            var pendingChanges = GetChangesetPendingChanges(changeset.Changes);
            var mergeRelationships = GetMergeRelationships(pendingChanges, targetBranches, versionControl);

            var commentFormater = new CommentFormater(_settings.CommentFormat, _settings.BranchNameMatches);
            foreach (var mergeInfo in mergeInfos.Where(b => b.Checked))
            {
                var mergeResultModel = new MergeResultModel
                {
                    SourceChangesetId = changesetId,
                    BranchInfo = mergeInfo,
                };

                var mergeResult = MergeToBranch(mergeInfo, mergeOption, mergeRelationships, workspace);
                var targetPendingChanges = GetPendingChanges(mergeInfo.TargetPath, workspace);
                if (mergeResult == MergeResult.UnexpectedFileRestored)
                {
                    workspace.Undo(targetPendingChanges.Select(pendingChange => new ItemSpec(pendingChange)).ToArray(),
                        true);
                    mergeResult = MergeByFile(changeset.Changes, mergeInfo.TargetBranch, mergeRelationships,
                        mergeInfo.ChangesetVersionSpec, mergeOption, workspace);
                    targetPendingChanges = GetPendingChangesByFile(mergeRelationships, mergeInfo.TargetBranch, workspace);
                }

                if (targetPendingChanges.Count == 0)
                {
                    mergeResult = MergeResult.NothingMerge;
                }
                mergeResultModel.MergeResult = mergeResult;
                mergeResultModel.PendingChanges = targetPendingChanges;
                mergeResultModel.WorkItemIds = workItemIds;

                var trackMergeInfo = GetTrackMergeInfo(mergeInfo, changeset, versionControl);
                var comment = commentFormater.Format(trackMergeInfo, mergeInfo.TargetBranch, mergeOption);
                mergeResultModel.Comment = comment;

                result.Add(mergeResultModel);
                if (checkInIfSuccess && mergeResultModel.MergeResult == MergeResult.Merged)
                {
                    var checkInResult = CheckIn(mergeResultModel.PendingChanges, comment, workspace, workItemIds, changeset.PolicyOverride, workItemStore);
                    mergeResultModel.TagetChangesetId = checkInResult.ChangesetId;
                    mergeResultModel.MergeResult = checkInResult.CheckinResult;
                }
            }

            return result;
        }