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_modeView on GitHub (pinned to afd2eddd3a)
Solutions
- Re-run the pull/reconcile to regenerate the plan against the current upstream commit, then confirm the new plan.
- Re-resolve the affected conflict explicitly with --take-remote or --keep-local so the stored resolution matches the current remote state.
- 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
- Pull frequently so upstream commits don't diverge from the planned objects.
- Re-resolve conflicts after upstream moves rather than relying on stale stored resolutions.
- Save local edits into the sync store before pulling.
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
- local files were saved after enrollment planning; retry pull
- {} changed before application; nothing was written
- cannot synchronize: {reason}
- unresolved Git index entry {} in {}
- enrollment conflict in {field}; reconcile repository metadat
AI-assisted analysis of jdx/mise@afd2eddd3a (2026-09-09).
Data as JSON: /api/errors/2b1cbde65c706574.
Report an issue: GitHub.