GitoxideLabs/gitoxide · error

cannot amend with unresolved index conflicts

Error message

cannot amend with unresolved index conflicts

What it means

When amending the head commit, tix loads the index and rejects the operation if any index entry is at a non-Unconflicted stage, i.e. there are unresolved merge conflicts. Committing an amend from a conflicted index would produce a broken commit, so it fails fast.

Solutions

  1. Resolve all conflicts and stage them (`git add <paths>`) before amending.
  2. Abort the in-progress merge/rebase and redo the operation on a clean state.
  3. Verify with `git status` (no 'Unmerged paths') that the index is conflict-free first.

Example fix

// guard before amend
let index = repo.index_or_empty()?;
if index.entries().iter().any(|e| e.stage() != gix::index::entry::Stage::Unconflicted) {
    anyhow::bail!("resolve index conflicts first");
}
head::perform(&repo, Kind::Amend, None, ...)?;
Defensive patterns

Strategy: validation

Validate before calling

let index = repo.index_or_empty()?;
let conflicted = index.entries().iter()
    .any(|e| e.stage() != gix::index::entry::Stage::Unconflicted);
if conflicted {
    anyhow::bail!("cannot amend: resolve index conflicts first");
}

Try / catch

match result {
    Err(e) if e.to_string().contains("cannot amend with unresolved index conflicts") => {
        eprintln!("resolve conflicts and stage them, then amend again");
    }
    other => other?,
}

Prevention

When it happens

Trigger: `perform_inner` (reached via `perform`, `perform_with_changes`, `perform_reporting`, `amend_index`, `amend_index_reporting`) runs while the index contains conflict stages — mid-merge/rebase with unresolved paths.

Common situations: Issuing a `tix` amend right after a conflicted merge; resuming scripted edits after an interrupted rebase; forgetting that `git add` was never run on resolved files.

Related errors


AI-assisted analysis of GitoxideLabs/gitoxide@e73179060b (2026-09-08). Data as JSON: /api/errors/dde963517e0b2bfc. Report an issue: GitHub.

Appendix: source

Thrown at gix-tix/src/edit/head.rs:106

        (Kind::Amend, Some(([path], _))) => Some(path),
        (Kind::Amend, Some(_)) => anyhow::bail!("amending requires exactly one selected path"),
        _ => None,
    };
    let tree = match kind {
        Kind::Spill => match selected_paths {
            Some((paths, selected_parent)) => {
                spill_paths_tree(&repo, old_tree, selected_parent.unwrap_or(parent_tree), paths)?
            }
            None => parent_tree,
        },
        Kind::Amend => {
            let index = repo.index_or_empty().context("could not load the index")?;
            if index
                .entries()
                .iter()
                .any(|entry| entry.stage() != gix::index::entry::Stage::Unconflicted)
            {
                anyhow::bail!("cannot amend with unresolved index conflicts");
            }
            if let Some(path) = selected_amend_path {
                if review && path.group != crate::ChangeGroup::Staged {
                    anyhow::bail!("review commits can amend only staged paths");
                }
                amend_path_tree(&repo, old_tree, path, &index)?
            } else if review || index_only {
                let index_tree = create::index_tree(&repo, &index)?;
                if index_tree == old_tree && !pending {
                    return Ok(None);
                }
                index_tree
            } else {
                let index_tree = create::index_tree(&repo, &index)?;
                if index_tree != old_tree {
                    index_tree
                } else {
                    let baseline = repo.find_tree(old_tree)?;

View on GitHub (pinned to e73179060b)