jdx/mise · error

changed in the complete repository merge; reconcile again

Error message

{} changed in the complete repository merge; reconcile again

What it means

Before adopting a complete repository merge, mise cross-checks each planned restore step's expected object against the merged tree. If a step's restored object in the composed tree no longer equals the pending object (e.g. a divergent text merge produced different content, or a previously recorded resolution is stale), the pull aborts naming the changed path.

Solutions

  1. Re-run `mise dot pull` to reconcile against the fresh merge.
  2. Inspect the changed path and resolve the merge explicitly (`mise dot status`, --take-remote/--keep-local).
  3. If resolutions are stale, re-save the local side (`mise dot save <path>`) and pull again.

Example fix

before: mise dot pull (~/.gitconfig changed in the complete repository merge) | after: mise dot pull --take-remote ~/.gitconfig, or resolve explicitly then retry
Defensive patterns

Strategy: retry

Validate before calling

mise dot status  # verify resolutions are current after upstream changes

Try / catch

mise dot pull || mise dot pull  # re-reconcile once when the merge changed mid-plan

Prevention

When it happens

Trigger: During `mise dot pull` with an inventory tree present: for any ready step, `repo.restored_object_at(tree, branch_path) != step.pending.object` — a text merge or stale resolution changed the path's content in the full merge.

Common situations: Both sides edited the same file and the three-way merge yielded different content than recorded; an old conflict resolution no longer matches the new upstream tree.

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@533346cc37 (2026-09-17). Data as JSON: /api/errors/2b1cbde65c706574. Report an issue: GitHub.

Appendix: source

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

                .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"))?;
            audit_incoming_history(repo, &candidate.commit)?;
        }
        // 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 533346cc37)