# Buggy code
def checkout(
    self,
    targets=None,
    with_deps=False,
    force=False,
    relink=False,
    recursive=False,
    allow_missing=False,
):
    from dvc.stage.exceptions import (
        StageFileBadNameError,
        StageFileDoesNotExistError,
    )

    unused = []
    stats = {
        "added": [],
        "deleted": [],
        "modified": [],
        "failed": [],
    }
    if not targets:
        targets = [None]
        unused = _get_unused_links(self)

    stats["deleted"] = [_fspath_dir(u) for u in unused]
    self.state.remove_links(unused)

    if isinstance(targets, str):
        targets = [targets]

    pairs = set()
    for target in targets:
        try:
            pairs.update(
                self.collect_granular(target, with_deps=with_deps, recursive=recursive)
            )
        except (
            StageFileDoesNotExistError,
            StageFileBadNameError,
            NoOutputOrStageError,
        ) as exc:
            if not target:
                raise
            raise CheckoutErrorSuggestGit(target) from exc

    total = get_all_files_numbers(pairs)
    with Tqdm(total=total, unit="file", desc="Checkout", disable=total == 0) as pbar:
        for stage, filter_info in pairs:
            result = stage.checkout(
                force=force,
                progress_callback=pbar.update_msg,
                relink=relink,
                filter_info=filter_info,
                allow_missing=allow_missing,
            )
            for key, items in result.items():
                stats[key].extend(_fspath_dir(path) for path in items)

    if stats.get("failed"):
        raise CheckoutError(stats["failed"], stats)

    del stats["failed"]
    return stats


# Traceback (git.exc.GitCommandError)
❯ dvc exp run --continue -v
...
2020-10-23 16:36:29,034 DEBUG: Commit to current experiment branch
2020-10-23 16:36:29,118 DEBUG: Checking out experiment commit 'd5dbcff520d30b5d92a863049f7259044a145a28'
2020-10-23 16:36:29,148 DEBUG: Patching local workspace
2020-10-23 16:36:29,154 DEBUG: Removing '/var/folders/s_/j8cg24s945dcvlh77c677f080000gn/T/tmpj3mfqijf'
2020-10-23 16:36:29,155 DEBUG: fetched: [(60,)]
2020-10-23 16:36:29,156 ERROR: failed to apply experiment changes.
------------------------------------------------------------
Traceback (most recent call last):
File "/Users/pmrowla/git/dvc/dvc/repo/experiments/__init__.py", line 770, in checkout_exp
self.repo.scm.repo.git.apply(tmp, reverse=True)
File "/Users/pmrowla/.virtualenvs/dvc/lib/python3.8/site-packages/git/cmd.py", line 542, in <lambda>
return lambda *args, **kwargs: self._call_process(name, *args, **kwargs)
File "/Users/pmrowla/.virtualenvs/dvc/lib/python3.8/site-packages/git/cmd.py", line 1005, in _call_process
return self.execute(call, **exec_kwargs)
File "/Users/pmrowla/.virtualenvs/dvc/lib/python3.8/site-packages/git/cmd.py", line 822, in execute
raise GitCommandError(command, status, stderr_value, stdout_value)
git.exc.GitCommandError: Cmd('git') failed due to: exit code(1)
cmdline: git apply --reverse /var/folders/s_/j8cg24s945dcvlh77c677f080000gn/T/tmpj3mfqijf
stderr: 'error: dvc.lock: already exists in working directory'

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
File "/Users/pmrowla/git/dvc/dvc/command/experiments.py", line 456, in run
self.repo.experiments.run(
File "/Users/pmrowla/git/dvc/dvc/repo/experiments/__init__.py", line 881, in run
return run(self.repo, *args, **kwargs)
File "/Users/pmrowla/git/dvc/dvc/repo/__init__.py", line 51, in wrapper
return f(repo, *args, **kwargs)
File "/Users/pmrowla/git/dvc/dvc/repo/experiments/run.py", line 62, in run
return repo.experiments.reproduce_one(
File "/Users/pmrowla/git/dvc/dvc/repo/experiments/__init__.py", line 398, in reproduce_one
self.checkout_exp(exp_rev, allow_missing=checkpoint)
File "/Users/pmrowla/git/dvc/dvc/repo/experiments/__init__.py", line 38, in wrapper
return f(exp, *args, **kwargs)
File "/Users/pmrowla/git/dvc/dvc/repo/experiments/__init__.py", line 775, in checkout_exp
raise DvcException("failed to apply experiment changes.")
dvc.exceptions.DvcException: failed to apply experiment changes.
------------------------------------------------------------

# Fixed code
def checkout(
    self,
    targets=None,
    with_deps=False,
    force=False,
    relink=False,
    recursive=False,
    allow_missing=False,
    **kwargs,
):
    from dvc.stage.exceptions import (
        StageFileBadNameError,
        StageFileDoesNotExistError,
    )

    unused = []
    stats = {
        "added": [],
        "deleted": [],
        "modified": [],
        "failed": [],
    }
    if not targets:
        targets = [None]
        unused = _get_unused_links(self)

    stats["deleted"] = [_fspath_dir(u) for u in unused]
    self.state.remove_links(unused)

    if isinstance(targets, str):
        targets = [targets]

    pairs = set()
    for target in targets:
        try:
            pairs.update(
                self.collect_granular(target, with_deps=with_deps, recursive=recursive)
            )
        except (
            StageFileDoesNotExistError,
            StageFileBadNameError,
            NoOutputOrStageError,
        ) as exc:
            if not target:
                raise
            raise CheckoutErrorSuggestGit(target) from exc

    total = get_all_files_numbers(pairs)
    with Tqdm(total=total, unit="file", desc="Checkout", disable=total == 0) as pbar:
        for stage, filter_info in pairs:
            result = stage.checkout(
                force=force,
                progress_callback=pbar.update_msg,
                relink=relink,
                filter_info=filter_info,
                allow_missing=allow_missing,
                **kwargs,
            )
            for key, items in result.items():
                stats[key].extend(_fspath_dir(path) for path in items)

    if stats.get("failed"):
        raise CheckoutError(stats["failed"], stats)

    del stats["failed"]
    return stats