jdx/mise · error
{} is not a conflict
Error message
{} is not a conflict What it means
The --take-remote/--keep-local resolution flags only accept paths that are currently registered as conflicts in the sync status. This error is thrown when a passed path does not correspond to any known conflict, so there is nothing to resolve. It aborts before any state is written.
Source
Thrown at src/system/history/sync/apply.rs:205
&conflict.branch_path,
remote.as_ref(),
)?,
live_mode: live_permissions(&local)?,
local: saved,
remote,
live,
take_remote: take_remote.contains(&local),
},
);
}
}
for path in take_remote.iter().chain(keep_local.iter()) {
if !status
.conflicts
.iter()
.any(|conflict| roots.locate(&conflict.branch_path).path() == Some(path.as_path()))
{
bail!("{} is not a conflict", display_path(path));
}
}
run::refresh(store, tracked, &mut status)?;
if !req.dry_run {
run::write_status(state_dir, &status)?;
}
if !status.conflicts.is_empty() {
if req.dry_run {
// Preview the whole paused setup even when reconciliation
// cannot yet produce an applicable write set.
let mut table = MiseTable::new(false, &["Path", "Action", "Group"]);
for conflict in &status.conflicts {
if let Some(path) = roots.locate(&conflict.branch_path).path() {
table.add_row(vec![
display_path(path),
"held: unresolved conflict".to_string(),
conflict.branch_path.clone(),
]);View on GitHub (pinned to afd2eddd3a)
Solutions
- Run `mise bootstrap dotfiles pull --dry-run` to list the currently held conflicts and use exactly those paths.
- If the conflict was already resolved, run a plain pull without the resolution flags to apply the remaining plan.
- Verify the path matches the recorded conflict path (same root and normalization) — check for symlinks, ~ expansion, or wrong home directory in the environment.
Example fix
# before mise bootstrap dotfiles pull --take-remote ~/.bashrc # not in conflict # after: list real conflicts first mise bootstrap dotfiles pull --dry-run mise bootstrap dotfiles pull --take-remote ~/.zshrc
Defensive patterns
Strategy: validation
Validate before calling
# list current conflicts before resolving mise bootstrap dotfiles pull --dry-run # only pass paths shown as 'held: unresolved conflict'
Type guard
const isCurrentConflict = (path, conflicts) => conflicts.some(c => resolve(c.branchPath) === path);
Try / catch
try {
await pull({ takeRemote: [path] });
} catch (e) {
if (/is not a conflict$/.test(e.message.trim()) || /is not a conflict/.test(e.message)) {
// conflict already resolved or wrong path: list and retry
const conflicts = await dryRun();
if (!isCurrentConflict(path, conflicts)) return;
} else throw e;
} Prevention
- Copy conflict paths verbatim from --dry-run output.
- Check that HOME/root mapping matches the environment where conflicts were recorded.
- Don't reuse stale resolution commands from shell history after a conflict was already resolved.
When it happens
Trigger: Running `mise bootstrap dotfiles pull --take-remote <path>` (or --keep-local) where `status.conflicts` contains no conflict whose branch_path locates to that exact path — the path was never in conflict, was already resolved, or is spelled/located differently than the recorded conflict path.
Common situations: Retrying a resolution command after the conflict was already resolved in a prior run; passing an absolute path when the conflict is recorded at a different root mapping; typos in the path; resolving against a fresh clone where no pull has produced conflicts yet.
Understand the failure class
Background: 'Could not be found', 'does not exist', 'not found in database': the resource-not-found family when an ID, slug, key, or URI lookup comes back empty — this error's family across 20 libraries.
Related errors
- choose only one resolution for {}
- unknown trigger {trigger:?}
- unknown trigger {other:?}; use save, agent, or update
- cannot synchronize: {reason}
- invalid version: {}
AI-assisted analysis of jdx/mise@afd2eddd3a (2026-09-09).
Data as JSON: /api/errors/a28df8c94645e1ad.
Report an issue: GitHub.