def METHOD_NAME(self):
    """Resolve a GitHub source into a specific commit.
    The spec must include:
    - github: the URL of the GitHub repository
    It's recommended that the source include:
    - resolution_strategy: [production | preproduction | <strategy-name>]
    The spec may instead be specific about the desired ref or release:
    - commit: a commit hash
    - ref: a Git ref
    - branch: a Git branch
    - tag: a Git tag
    - release: "latest" | "previous" | "latest_beta"
    If none of these are specified, CumulusCI will use the resolution strategy "production"
    to locate the appropriate release or ref.
    """
    ref = None
    self.branch = None
    # These branches preserve some existing behavior: when a source is set to
    # a specific tag or release, there's no fallback, as there would be
    # if we were subsumed within the dependency resolution machinery.
    # If the user was _not_ specific, we will use the full resolution stack,
    # including fallback behaviors.
    if self.spec.commit:
        self.commit = self.description = self.spec.commit
        return
    elif self.spec.ref:
        ref = self.spec.ref
    elif self.spec.tag:
        ref = "tags/" + self.spec.tag
    elif self.spec.branch:
        self.branch = self.spec.branch
        ref = "heads/" + self.spec.branch
    elif self.spec.release:
        release = None
        if self.spec.release is GitHubSourceRelease.LATEST:
            release = find_latest_release(self.repo, include_beta=False)
        elif self.spec.release is GitHubSourceRelease.LATEST_BETA:
            release = find_latest_release(self.repo, include_beta=True)
        elif self.spec.release is GitHubSourceRelease.PREVIOUS:
            release = find_previous_release(self.repo)
        if release is None:
            raise DependencyResolutionError(
                f"Could not find release {self.spec.release}."
            )
        ref = "tags/" + release.tag_name
    else:
        # Avoid circular import issues
        from cumulusci.core.dependencies.dependencies import GitHubDynamicDependency
        from cumulusci.core.dependencies.resolvers import (
            get_resolver_stack,
            resolve_dependency,
        )
        # Use resolution strategies to find the right commit.
        dep = GitHubDynamicDependency(github=self.spec.github)
        resolve_dependency(
            dep,
            self.project_config,
            get_resolver_stack(self.project_config, self.spec.resolution_strategy),
        )
        self.commit = self.description = dep.ref
        return
    self.description = ref[6:] if ref.startswith("heads/") else ref
    self.commit = self.repo.ref(ref).object.sha