jdx/mise · error

{} changed in the complete repository merge; reconcile again

Error message

{} changed in the complete repository merge; reconcile again

What it means

After computing the complete repository merge, mise verifies that each ready step's pending object still matches what the merged tree contains at that branch path. If a divergent text merge or a stale prior resolution made the merged content differ from the planned application, the pull aborts with this error naming the changed path, so an unexpected merged version is never silently written.

Source

Thrown at src/system/history/sync/apply.rs:482

                .iter()
                .map(|step| {
                    Ok(crate::system::history::shadow::Overlay {
                        path: step.pending.branch_path.clone(),
                        object: repo.object_at(local, &step.pending.branch_path)?,
                    })
                })
                .collect::<Result<Vec<_>>>()?;
            if repo.compose(&repo.output_tree_of(current)?, &restore_planned)?
                != repo.output_tree_of(local)?
            {
                bail!("local files were saved after enrollment planning; retry pull");
            }
            // Do not let a divergent text merge or a stale resolution differ
            // from the complete tree that will be adopted.
            for step in &ready {
                if repo.restored_object_at(tree, &step.pending.branch_path)? != step.pending.object
                {
                    bail!(
                        "{} changed in the complete repository merge; reconcile again",
                        display_path(&step.path)
                    );
                }
            }
            let candidate = heads
                .candidate(repo, tree)?
                .ok_or_else(|| eyre::eyre!("setup branch disappeared"))?;
            super::files::audit_history(repo, &candidate.commit, &Default::default())?;
        }
        // Validate the complete batch again after acquiring the operation
        // lock, before the first write.
        for directory in &directories {
            directory.validate()?;
        }
        for step in &ready {
            if live_object(repo, &step.path)? != step.before
                || live_permissions(&step.path)? != step.before_mode

View on GitHub (pinned to afd2eddd3a)

Solutions

  1. Re-run the pull/reconcile to regenerate the plan against the current upstream commit, then confirm the new plan.
  2. Re-resolve the affected conflict explicitly with --take-remote or --keep-local so the stored resolution matches the current remote state.
  3. If local edits caused the divergence, save or commit them into the sync store before pulling again.

Example fix

# before: stale resolution/object in plan
mise bootstrap dotfiles pull   # -> error naming the changed path
# after: refresh resolution, then pull
mise bootstrap dotfiles pull --take-remote <changed-path>
mise bootstrap dotfiles pull
Defensive patterns

Strategy: retry

Validate before calling

# refresh the stored resolution against the current upstream before pulling
mise bootstrap dotfiles pull --take-remote <changed-path>   # or --keep-local, then full pull

Try / catch

try {
  await pull();
} catch (e) {
  const m = e.message.match(/^(.+?) changed in the complete repository merge/);
  if (m) {
    await pull({ takeRemote: [m[1]] }); // re-resolve the diverged path
    return await pull();
  }
  throw e;
}

Prevention

When it happens

Trigger: During pull, `repo.restored_object_at(tree, step.pending.branch_path) != step.pending.object` for a ready step — the complete repository merge produced different content than the per-path pending plan (divergent merge, or a resolution recorded earlier that no longer matches).

Common situations: Upstream changed a file after the plan's objects were computed; a previously stored conflict resolution is stale relative to the new upstream commit; both machines edited the same file and the text merge diverged from the recorded pending object.

Understand the failure class

Background: Checksum mismatch errors: "checksum verification failed", "digest mismatch", "expected vs actual checksum" — what they mean and how to fix them — this error's family across 41 libraries.

Related errors


AI-assisted analysis of jdx/mise@afd2eddd3a (2026-09-09). Data as JSON: /api/errors/2b1cbde65c706574. Report an issue: GitHub.